负载均衡后部署的Flutter Web Service Worker无法激活问题咨询
解决方案
方案1:保留加载动画、完全禁用Service Worker(推荐,适配纯在线应用场景)
你是纯在线应用不需要SW的离线缓存能力,直接禁用即可彻底解决问题,且你自定义的加载动画完全不受影响,操作分两种可选:
- 构建时直接禁用:执行构建命令时添加
--pwa-strategy none参数,完整命令示例:
构建生成的index.html会自动移除所有SW相关逻辑,你之前添加的加载动画代码不会被覆盖,直接部署即可。flutter build web --release --web-renderer html --pwa-strategy none - 直接修改现有index.html:如果你不想重新构建,直接把你贴出的整段
if ('serviceWorker' in navigator) { ... }代码删除,替换为下面的代码即可:
替换后SW不会再被注册,不会触发多余资源加载,页面加载逻辑直接走原生JS加载main.dart.js,可靠性大幅提升。window.addEventListener('load', function () { loadMainDartJs(); });
方案2:保留Service Worker的修复方案
如果你需要保留SW的缓存能力,按以下步骤修复即可:
- 解决NOTICE文件404问题:IIS默认不支持无后缀文件的返回,你可以在IIS站点的MIME类型配置中,新增一条规则:
- 文件扩展名:
. - MIME类型:
text/plain
- 文件扩展名:
- 配置SW文件无缓存:在IIS的HTTP响应头配置中,给
flutter_service_worker.js文件添加Cache-Control: no-cache规则,避免负载均衡缓存旧版本SW文件导致安装失败。 - 检查负载均衡配置:确认SW文件的传输没有被压缩、篡改,且返回的HTTP状态码为200,没有被重定向。
本地运行正常是因为nginx默认支持无后缀文件返回,且默认不会缓存SW文件,所以不会触发问题。
内容的提问来源于stack exchange,提问作者Searles
相关产品推荐
相关产品推荐

