angular应用PWA中缓存资源的路径问题(deployUrl)

引言

Angular自带PWA NPM包可以供我们使用,减少了我们自己对service Worker的配置,但在应用中总会出现一些问题,这些问题可以通过虚拟路径ngsw/state来详细查看。

问题现象

前段时间在离线应用部署中发现,当我们的Deploy Url即项目名存在时,离线资源总是会请求网络资源,并且不会缓存到worker中,后来查看ngsw/state发现service worker处于降级运行状态。

细细查看代码发现,编译后的ngsw.json中的缓存资源路径是这样的

'''
"assetGroups": [
    ...
    files: [
        "/index.html": "hash1",
        "/1.bundle.js": "hash2"
    ]
    ...
]

细心的人可能已经发现问题了,所有的资源的路径都是绝对路径,意思就是service worker中cache添加的都是绝对路径开头的资源名,而部署在App路径下的项目都会加上App的pathName,相对的资源路径实际上是host/pathname/${url}。

既然发现了问题,就很好解决了

解决办法

先看关于资源编译输出的相关代码

if (!options.watch && options.serviceWorker) {
              for (const [locale, outputPath] of outputPaths.entries()) {
                let localeBaseHref;
                if (i18n.locales[locale] && i18n.locales[locale].baseHref !== '') {
                  localeBaseHref = path.posix.join(
                    options.baseHref || '',
                    i18n.locales[locale].baseHref === undefined
                      ? `/${locale}/`
                      : i18n.locales[locale].baseHref,
                  );
                }

                try {
                  await augmentAppWithServiceWorker(
                    host,
                    root,
                    normalize(projectRoot),
                    normalize(outputPath),
                    localeBaseHref || options.baseHref || '/',// 聚焦这里
                    options.ngswConfigPath,
                  );
                } catch (err) {
                  return { success: false, error: mapErrorToMessage(err) };
                }
              }
            }

可以看到传递进serviceWorker的参数为options.baseHref||'/',那么问题也就可以解决了,首先配置文件里必须要有baseHref这个字段,其次,去掉ngsw-config.json中的绝对路径。

详细信息可以点击下面的连接查看

Anything else relevant?
The fix is easy: just remove the leading slash of all paths in ngsw-config.json template (including the index property).

这样就可以解决上述问题了。

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值