我如何动态更新服务工作者上的缓存名称以包含内部版本号以在构建时自动使缓存无效

How can I dynamically update the Cache name on my service worker to include a build number to auto invalidate the cache on build

在整个站点的静态文件中,我将 TFS 构建的程序集编号作为缓存清除的查询字符串参数包含在内 typeof(NavigationHelper).Assembly.GetName().Version;

我希望能够执行类似这样的操作来更新 Service Worker 中的静态缓存名称,这样每次我部署站点时,它都会使 Service Worker 缓存失效并获取最新文件。我目前有...

const staticCacheName = "abc-cache-v1";

但我不想每次都手动更新 staticCacheName。理想情况下,我想以

之类的结尾

const staticCacheName = "abc-cache-v" + DYNAMIC_VERSION_NUMBER;

Service Worker 无权访问文档或 window 因此无法从页面获取程序集内部版本号并且 Service Worker 在 .js 文件中因此无法访问任何 MVC Razor逻辑所以我很难过。

有什么变通办法吗?我见过一个使用 webpack 的解决方案,但我不想仅仅为了一个文件的版本控制而实施 webpack。其余的 js 和资产是从 CDN 提供的,因此对于站点根目录中的 2 个 js 文件来说,这太过分了。

我最终在 Visual Studio 构建上添加了一个构建事件,并从中调用了一个 powershell 脚本。

预构建事件命令行代码:

powershell.exe -ExecutionPolicy Unrestricted -File $(ProjectDir)ReplaceCacheText.ps1 -targetPath $(ProjectDir)\sw.js

和 Powershell 脚本:

param([string]$targetPath);
$Replace = "serviceworker-cache-v{0}" -f (Get-Date -format s)
(Get-Content -Path $targetPath) -replace 'serviceworker-cache-v[^"]*',$Replace | Set-Content -Path $targetPath

这里我们正在搜索字符串的开头并替换该行的其余部分,直到我们命中限制字符“以替换”中的内容。如果没有 [^"] 它会很容易地替换整个字符串的其余部分,包括行尾的 ";

非常感谢 AdminOfThings 在 powershell 正则表达式方面的帮助