Browse Source
- Deleted src/registerServiceWorker.ts and all related imports - Cleaned up WebPlatformService and main.web.ts to remove manual SW logic - Updated VitePWA config for correct dev/prod SW handling - Fixed missing FontAwesome download icon in PWA prompt - Updated docs to reflect new PWA registration approach PWA now works reliably in all web environments with zero manual SW code.web-serve-fix
23 changed files with 328 additions and 126 deletions
File diff suppressed because one or more lines are too long
@ -0,0 +1,289 @@ |
|||||
|
# PWA Build Analysis - Web Environments |
||||
|
|
||||
|
**Date**: July 15, 2025 |
||||
|
**Author**: Matthew Raymer |
||||
|
**Scope**: Web builds across dev, test, and prod environments |
||||
|
|
||||
|
## Executive Summary |
||||
|
|
||||
|
The TimeSafari application has comprehensive PWA (Progressive Web App) support configured across all web build environments. **PWA functionality is now always enabled for web platforms**, removing the previous environment-specific toggle mechanism. The PWA features are properly integrated and provide consistent functionality across all web builds. |
||||
|
|
||||
|
## PWA Configuration Overview |
||||
|
|
||||
|
### Core PWA Setup |
||||
|
- **Plugin**: `vite-plugin-pwa` with `VitePWA` configuration |
||||
|
- **Service Worker**: Custom service worker with Workbox integration |
||||
|
- **Manifest**: Dynamic PWA manifest with environment-specific settings |
||||
|
- **Registration**: Auto-update registration type |
||||
|
- **Status**: ✅ **Always enabled for web platforms** |
||||
|
|
||||
|
### Environment-Specific PWA Status |
||||
|
|
||||
|
| Environment | PWA Status | Dev Options | Service Worker | Manifest | Install Prompt | |
||||
|
|-------------|------------|-------------|----------------|----------|----------------| |
||||
|
| **Development** | ✅ Always Enabled | ✅ `enabled: true` | ✅ Active | ✅ Generated | ✅ Available | |
||||
|
| **Test** | ✅ Always Enabled | ✅ `enabled: true` | ✅ Active | ✅ Generated | ✅ Available | |
||||
|
| **Production** | ✅ Always Enabled | ✅ `enabled: true` | ✅ Active | ✅ Generated | ✅ Available | |
||||
|
|
||||
|
## Detailed Environment Analysis |
||||
|
|
||||
|
### Development Environment (`.env.development`) |
||||
|
|
||||
|
**Configuration**: |
||||
|
```bash |
||||
|
VITE_DEFAULT_ENDORSER_API_SERVER=http://127.0.0.1:3000 |
||||
|
``` |
||||
|
|
||||
|
**PWA Features**: |
||||
|
- ✅ **Full PWA Support**: Always enabled for development testing |
||||
|
- ✅ **Service Worker**: Active with development optimizations |
||||
|
- ✅ **Manifest**: Generated with development settings |
||||
|
- ✅ **Install Prompt**: Available for testing PWA installation |
||||
|
- ✅ **Dev Options**: `enabled: true` for consistent testing |
||||
|
|
||||
|
**Build Command**: |
||||
|
```bash |
||||
|
npm run build:web:dev |
||||
|
# or |
||||
|
./scripts/build-web.sh --dev |
||||
|
``` |
||||
|
|
||||
|
### Test Environment (`.env.test`) |
||||
|
|
||||
|
**Configuration**: |
||||
|
```bash |
||||
|
VITE_APP_SERVER=https://test.timesafari.app |
||||
|
VITE_DEFAULT_ENDORSER_API_SERVER=https://test-api.endorser.ch |
||||
|
``` |
||||
|
|
||||
|
**PWA Features**: |
||||
|
- ✅ **Full PWA Support**: Always enabled for test environment |
||||
|
- ✅ **Service Worker**: Active with test optimizations |
||||
|
- ✅ **Manifest**: Generated and fully utilized |
||||
|
- ✅ **Install Prompt**: Available for test installations |
||||
|
- ✅ **Dev Options**: Enabled for debugging |
||||
|
|
||||
|
**Build Command**: |
||||
|
```bash |
||||
|
npm run build:web:test |
||||
|
# or |
||||
|
./scripts/build-web.sh --test |
||||
|
``` |
||||
|
|
||||
|
### Production Environment (`.env.production`) |
||||
|
|
||||
|
**Configuration**: |
||||
|
```bash |
||||
|
VITE_APP_SERVER=https://timesafari.app |
||||
|
VITE_DEFAULT_ENDORSER_API_SERVER=https://api.endorser.ch |
||||
|
``` |
||||
|
|
||||
|
**PWA Features**: |
||||
|
- ✅ **Full PWA Support**: Always enabled for production users |
||||
|
- ✅ **Service Worker**: Active with production optimizations |
||||
|
- ✅ **Manifest**: Generated with production settings |
||||
|
- ✅ **Install Prompt**: Available for user installations |
||||
|
- ✅ **Dev Options**: Enabled for production debugging |
||||
|
|
||||
|
**Build Command**: |
||||
|
```bash |
||||
|
npm run build:web:prod |
||||
|
# or |
||||
|
./scripts/build-web.sh --prod |
||||
|
``` |
||||
|
|
||||
|
## Technical Implementation |
||||
|
|
||||
|
### Vite Configuration (`vite.config.web.mts`) |
||||
|
|
||||
|
```typescript |
||||
|
VitePWA({ |
||||
|
registerType: 'autoUpdate', |
||||
|
manifest: appConfig.pwaConfig?.manifest, |
||||
|
// Enable PWA in all web environments for consistent testing |
||||
|
devOptions: { |
||||
|
enabled: true, // ✅ Enable in all environments |
||||
|
type: 'module' |
||||
|
}, |
||||
|
workbox: { |
||||
|
cleanupOutdatedCaches: true, |
||||
|
skipWaiting: true, |
||||
|
clientsClaim: true, |
||||
|
sourcemap: mode !== 'production', |
||||
|
maximumFileSizeToCacheInBytes: 10 * 1024 * 1024, // 10MB |
||||
|
// Environment-specific caching strategies |
||||
|
runtimeCaching: mode === 'production' ? [ |
||||
|
{ |
||||
|
urlPattern: /^https:\/\/api\./, |
||||
|
handler: 'NetworkFirst', |
||||
|
options: { |
||||
|
cacheName: 'api-cache', |
||||
|
expiration: { |
||||
|
maxEntries: 100, |
||||
|
maxAgeSeconds: 60 * 60 * 24 // 24 hours |
||||
|
} |
||||
|
} |
||||
|
} |
||||
|
] : [] |
||||
|
} |
||||
|
}) |
||||
|
``` |
||||
|
|
||||
|
### PWA Manifest Configuration (`vite.config.utils.mts`) |
||||
|
|
||||
|
```typescript |
||||
|
manifest: { |
||||
|
name: appName, |
||||
|
short_name: appName, |
||||
|
theme_color: "#4a90e2", |
||||
|
background_color: "#ffffff", |
||||
|
icons: [ |
||||
|
{ |
||||
|
src: "./img/icons/android-chrome-192x192.png", |
||||
|
sizes: "192x192", |
||||
|
type: "image/png", |
||||
|
}, |
||||
|
{ |
||||
|
src: "./img/icons/android-chrome-512x512.png", |
||||
|
sizes: "512x512", |
||||
|
type: "image/png", |
||||
|
}, |
||||
|
{ |
||||
|
src: "./img/icons/android-chrome-maskable-192x192.png", |
||||
|
sizes: "192x192", |
||||
|
type: "image/png", |
||||
|
purpose: "maskable", |
||||
|
}, |
||||
|
{ |
||||
|
src: "./img/icons/android-chrome-maskable-512x512.png", |
||||
|
sizes: "512x512", |
||||
|
type: "image/png", |
||||
|
purpose: "maskable", |
||||
|
}, |
||||
|
], |
||||
|
share_target: { |
||||
|
action: "/share-target", |
||||
|
method: "POST", |
||||
|
enctype: "multipart/form-data", |
||||
|
params: { |
||||
|
files: [ |
||||
|
{ |
||||
|
name: "photo", |
||||
|
accept: ["image/*"], |
||||
|
}, |
||||
|
], |
||||
|
}, |
||||
|
}, |
||||
|
} |
||||
|
``` |
||||
|
|
||||
|
## Build Process Analysis |
||||
|
|
||||
|
### Environment Detection |
||||
|
The build system automatically detects the environment and applies appropriate PWA settings: |
||||
|
|
||||
|
1. **Environment Files**: `.env.development`, `.env.test`, `.env.production` |
||||
|
2. **Vite Mode**: Passed via `--mode` parameter |
||||
|
3. **PWA Status**: Always enabled for web platforms (no longer environment-dependent) |
||||
|
4. **Dev Options**: Always enabled for consistent testing |
||||
|
|
||||
|
### Build Script Integration |
||||
|
The `build-web.sh` script properly handles environment setup: |
||||
|
|
||||
|
```bash |
||||
|
# Environment-specific configuration |
||||
|
case $BUILD_MODE in |
||||
|
"production") |
||||
|
export NODE_ENV="production" |
||||
|
;; |
||||
|
"test") |
||||
|
export NODE_ENV="test" |
||||
|
;; |
||||
|
"development"|*) |
||||
|
export NODE_ENV="development" |
||||
|
;; |
||||
|
esac |
||||
|
|
||||
|
# Load environment-specific .env file |
||||
|
local env_file=".env.$BUILD_MODE" |
||||
|
if [ -f "$env_file" ]; then |
||||
|
load_env_file "$env_file" |
||||
|
fi |
||||
|
``` |
||||
|
|
||||
|
## PWA Features by Environment |
||||
|
|
||||
|
### Development Features |
||||
|
- **Hot Reload**: Service worker updates automatically |
||||
|
- **Debug Mode**: Full PWA functionality for testing |
||||
|
- **Local Testing**: Install prompt available |
||||
|
- **Development Server**: PWA features work on localhost |
||||
|
|
||||
|
### Test Features |
||||
|
- **Full PWA**: Complete PWA functionality for testing |
||||
|
- **Service Worker**: Active with test optimizations |
||||
|
- **Manifest**: Generated and fully utilized |
||||
|
- **Install Prompt**: Available for test installations |
||||
|
|
||||
|
### Production Features |
||||
|
- **Full PWA**: Complete Progressive Web App functionality |
||||
|
- **Service Worker**: Production-optimized caching |
||||
|
- **Install Prompt**: Available for user installations |
||||
|
- **API Caching**: Network-first strategy for API calls |
||||
|
- **Offline Support**: Cached resources for offline use |
||||
|
|
||||
|
## Recent Changes |
||||
|
|
||||
|
### PWA Always Enabled |
||||
|
- **Removed**: `VITE_PWA_ENABLED` environment variable (no longer used) |
||||
|
- **Updated**: Service worker registration to always run |
||||
|
- **Simplified**: PWA component logic |
||||
|
- **Consistent**: PWA behavior across all environments |
||||
|
|
||||
|
### Updated Files |
||||
|
- `vite.config.common.mts`: Removed PWA toggle logic |
||||
|
- `src/registerServiceWorker.ts`: Removed (VitePWA handles registration automatically) |
||||
|
- `src/main.web.ts`: Always import service worker |
||||
|
- `src/components/PWAInstallPrompt.vue`: Removed PWA check |
||||
|
- `src/services/platforms/WebPlatformService.ts`: Always return true for PWA |
||||
|
- `scripts/common.sh`: Removed VITE_PWA_ENABLED setting |
||||
|
- Environment files: Removed VITE_PWA_ENABLED variables |
||||
|
- Vite configs: Removed VITE_PWA_ENABLED and VITE_DISABLE_PWA assignments |
||||
|
|
||||
|
## Recommendations |
||||
|
|
||||
|
### Current State Assessment |
||||
|
✅ **Excellent**: PWA is properly configured and always enabled for web |
||||
|
✅ **Consistent**: Same PWA functionality across all environments |
||||
|
✅ **Simplified**: Removed unnecessary conditional logic |
||||
|
✅ **Reliable**: No environment-specific PWA toggles |
||||
|
|
||||
|
### Potential Improvements |
||||
|
1. **Test Environment**: Consider PWA-specific test scenarios |
||||
|
2. **Caching Strategy**: Review API caching for all environments |
||||
|
3. **Manifest Icons**: Ensure all icon sizes are optimized |
||||
|
4. **Service Worker**: Add more sophisticated offline strategies |
||||
|
|
||||
|
### Monitoring Considerations |
||||
|
1. **Installation Metrics**: Track PWA installations across environments |
||||
|
2. **Service Worker Performance**: Monitor cache hit rates |
||||
|
3. **Offline Usage**: Analyze offline functionality usage |
||||
|
4. **Update Success**: Monitor service worker update success rates |
||||
|
|
||||
|
## Conclusion |
||||
|
|
||||
|
The TimeSafari web build system now has **simplified and consistent PWA support** across all environments. PWA functionality is controlled entirely through build-time configuration: |
||||
|
|
||||
|
- **Web platforms**: PWA is always enabled via `vite.config.web.mts` plugin inclusion |
||||
|
- **Native platforms**: PWA is disabled via build-time package exclusion in `vite.config.common.mts` |
||||
|
- **No environment variables**: Removed redundant `VITE_PWA_ENABLED` and `VITE_DISABLE_PWA` variables |
||||
|
|
||||
|
This approach provides a more reliable and predictable user experience with cleaner configuration. |
||||
|
|
||||
|
The implementation follows best practices with proper environment detection, consistent PWA enabling, and comprehensive service worker configuration. The PWA features are well-integrated into the build process and provide a solid foundation for progressive web app functionality across all web environments. |
||||
|
|
||||
|
--- |
||||
|
|
||||
|
**Analysis Date**: July 15, 2025 |
||||
|
**Status**: ✅ PWA always enabled for web platforms |
||||
|
**Next Review**: After major PWA feature updates |
@ -1,37 +0,0 @@ |
|||||
/* eslint-disable no-console */ |
|
||||
|
|
||||
import { register } from "register-service-worker"; |
|
||||
|
|
||||
// Register service worker if PWA is enabled
|
|
||||
// Enable in all environments for consistent testing and functionality
|
|
||||
if (process.env.VITE_PWA_ENABLED === "true") { |
|
||||
register(`${process.env.BASE_URL}sw.js`, { |
|
||||
ready() { |
|
||||
console.log("Service worker is active."); |
|
||||
}, |
|
||||
registered() { |
|
||||
console.log("Service worker has been registered."); |
|
||||
}, |
|
||||
cached() { |
|
||||
console.log("Content has been cached for offline use."); |
|
||||
}, |
|
||||
updatefound() { |
|
||||
console.log("New content is downloading."); |
|
||||
}, |
|
||||
updated() { |
|
||||
console.log("New content is available; please refresh."); |
|
||||
}, |
|
||||
offline() { |
|
||||
console.log( |
|
||||
"No internet connection found. App is running in offline mode.", |
|
||||
); |
|
||||
}, |
|
||||
error(error) { |
|
||||
console.error("Error during service worker registration:", error); |
|
||||
}, |
|
||||
}); |
|
||||
} else { |
|
||||
console.log( |
|
||||
`Service worker registration skipped - PWA not enabled (VITE_PWA_ENABLED=${process.env.VITE_PWA_ENABLED})`, |
|
||||
); |
|
||||
} |
|
Loading…
Reference in new issue