You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Angular 12 SwUpdate 可用更新订阅事件不触发问题求助

核心问题根因

从提供的NGSW调试日志中Last update check: never可以看出,Service Worker从未成功执行过更新检查,结合堆栈报错信息,根因有两个:

  1. 定时检查更新的rxjs流未做错误处理,一旦某次检查请求失败,流直接终止,后续再也不会触发更新检查
  2. ngsw manifest文件(ngsw.json)拉取失败,导致更新校验逻辑无法执行

修复步骤

1. 修复更新检查逻辑的错误处理

原代码中interval触发的checkForUpdate没有错误捕获,rxjs流遇到未处理的错误会直接终止,修改CheckforUpdateService的构造函数逻辑:

import { switchMap, catchError } from 'rxjs/operators';
import { of } from 'rxjs';

export class CheckforUpdateService {
  constructor(public updates: SwUpdate) { 
    if (updates.isEnabled) {
      interval(10*1000).pipe(
        switchMap(() => updates.checkForUpdate()),
        catchError(err => {
          console.error('更新检查失败:', err);
          // 错误吞掉,保证下一次定时任务正常执行
          return of(null);
        })
      ).subscribe(() => console.log('完成一次更新检查'));
    }
  }
  // 其余逻辑保持不变
}

2. 修正部署路径

启动http-server时要指向构建产物的项目根目录,而非dist根目录:

  • 执行ng build后,确认dist/<你的项目名>目录下存在ngsw.json、ngsw-worker.js文件
  • 启动命令修改为:http-server -p 8080 -c-1 dist/<你的项目名>

3. 校验Service Worker配置

确认angular.json中项目构建配置已正确开启Service Worker:

{
  "projects": {
    "<你的项目名>": {
      "architect": {
        "build": {
          "options": {
            "serviceWorker": true,
            "ngswConfigPath": "ngsw-config.json"
          }
        }
      }
    }
  }
}

4. 清理旧缓存测试

测试前先清理浏览器中已注册的旧Service Worker:

  • 打开Chrome开发者工具 -> 应用面板 -> Service Worker
  • 找到对应localhost的Service Worker,点击「取消注册」
  • 重新打开页面测试即可

5. 生产环境部署注意事项

生产环境部署时,需要给ngsw.json、ngsw-worker.js两个文件配置响应头Cache-Control: no-cache,避免浏览器缓存这两个文件,导致永远检测不到新版本。

内容的提问来源于stack exchange,提问作者shamon shamsudeen

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.25 15:06:04