Angular 13 PWA重新打开浏览器加载旧资源问题求助
Angular 13 PWA 重启浏览器加载旧资源问题解决方案
不需要禁用缓存,PWA的缓存机制是核心优势,只需调整以下配置和逻辑即可解决问题:
1. 主动触发Service Worker更新检查
在应用初始化阶段主动校验新版本,确保每次打开应用(包括重启浏览器)都会检查更新:
import { SwUpdate } from '@angular/service-worker'; import { OnInit } from '@angular/core'; export class AppComponent implements OnInit { constructor(private swUpdate: SwUpdate) {} ngOnInit(): void { if (this.swUpdate.isEnabled) { // 启动时立即检查更新 this.swUpdate.checkForUpdate().then(hasUpdate => { if (hasUpdate) { this.swUpdate.activateUpdate().then(() => window.location.reload()); } }); // 监听后台推送的可用更新 this.swUpdate.available.subscribe(() => { this.swUpdate.activateUpdate().then(() => window.location.reload()); }); } } }
2. 修正ngsw-config.json缓存策略
确保入口文件和核心资源的更新策略正确,避免Service Worker长期缓存旧资源:
{ "index": "/index.html", "assetGroups": [ { "name": "app", "installMode": "prefetch", "updateMode": "prefetch", "resources": { "files": [ "/favicon.ico", "/index.html", "/*.css", "/*.js" ] } } ] }
重点保证index.html被纳入updateMode: "prefetch"的资源组,让Service Worker优先检查它的更新。
3. 服务器端禁止缓存SW核心文件
部署时需确保服务器不对ngsw-worker.js和ngsw.json做缓存,以Nginx为例,添加以下配置:
location ~* (ngsw-worker.js|ngsw.json)$ { add_header Cache-Control "no-cache, no-store, must-revalidate"; expires 0; }
这两个文件是Service Worker的核心配置,必须每次请求都拉取最新版本,否则会基于旧配置加载缓存资源。
4. 确认registrationStrategy配置生效
检查app.module.ts中Service Worker的注册策略是否正确设置:
import { ServiceWorkerModule } from '@angular/service-worker'; import { environment } from '../environments/environment'; @NgModule({ imports: [ // ...其他模块 ServiceWorkerModule.register('ngsw-worker.js', { enabled: environment.production, registrationStrategy: 'registerImmediately' }) ] }) export class AppModule { }
内容的提问来源于stack exchange,提问作者Junk W
相关产品推荐
相关产品推荐

