【发布时间】:2019-11-13 02:55:07
【问题描述】:
我目前正在使用create-react-app 默认服务工作者开发一个渐进式网络应用程序。
在发布我们的一个 javascript 块的新版本时,我遇到了破坏缓存的问题。
在构建时,输出的 javascript 文件使用contenthash 来确保当 JS 文件中的内容发生变化时,文件名也会发生变化。在没有 service worker 的情况下运行时,这会成功破坏缓存。
但是,当使用create-react-app service worker 时,包括我的index.html 文件在内的所有静态资产都会被缓存。这意味着旧的index.html 正在提供给用户,其中包含一个<script> 标记到我的旧缓存javascript 文件中,而不是带有更新contenthash 的新文件。
我已经弹出并修改了 webpack.config.js WorkboxWebpackPlugin 以排除我的 index.html 文件:
new WorkboxWebpackPlugin.GenerateSW({
clientsClaim: true,
exclude: [/\.map$/, /asset-manifest\.json$/, /index.html/],
importWorkboxFrom: "cdn",
navigateFallbackBlacklist: [
// Exclude URLs starting with /_, as they're likely an API call
new RegExp("^/_"),
// Exclude URLs containing a dot, as they're likely a resource in
// public/ and not a SPA route
new RegExp("/[^/]+\\.[^/]+$")
]
}),
这似乎适当地停止了我的索引文件的缓存,允许它在其脚本标记中包含更新的main.[contenthash].js。但是,现在我知道我的 PWA 将无法脱机工作,因为 service worker 不提供 index.html 文件,并且不会通过脱机连接提供服务。
处理此问题的最佳方法是什么?完全离线访问不是必要的,但会很高兴,我想知道其他开发人员如何在不完全删除 index.html 的情况下处理他们的索引文件的服务工作者缓存的“破坏”由服务人员缓存?有没有更实用的方法来处理 index.html 中关于带有内容哈希的标签的这种变化?
谢谢
【问题讨论】:
-
重要的是要注意旧的缓存 index.html 文件没有被“提供”给用户。用户浏览器缓存文件。更改哈希让客户端知道它请求的文件与其已经缓存的文件不同。
-
@ViktorGarba 但是当我的软件缓存旧的 index.html 时,更改我的 javascript 文件的哈希对我没有帮助,其中包括引用旧的(也缓存的).js 文件的
<script>. -
我一般不精通渐进式网络应用程序。但是客户端会缓存具有一定哈希值的构建文件。当您更改 index.html 时,您是否正在重建您的项目?因为重建项目将创建一个具有唯一哈希的新构建。
标签: javascript reactjs service-worker create-react-app