使用 CRA React 清除缓存

IT技术 reactjs caching react-redux create-react-app
2021-04-05 11:54:02

当我更新我的网站时,运行 npm run build 并将新文件上传到服务器我仍然在寻找我网站的旧版本。

如果没有 React,我可以通过缓存破坏查看我网站的新版本。我这样做:

上一个文件

<link rel="stylesheet" href="/css/styles.css">

新文件

<link rel="stylesheet" href="/css/styles.css?abcde">

我该如何做这样的事情或使用 create react app 实现缓存破坏?

create react app 的 GitHub 中有很多关于此的主题,但没有人有正确/简单的答案。

5个回答

编辑:create-react-app v2 现在默认禁用 service worker

此答案仅适用于 CRA v1

这可能是因为您的网络工作者。

如果您查看 index.js 文件,您可以看到

registerServiceWorker();

从来没有想过它做了什么?如果我们看一下它从中导入的文件,我们可以看到

// In production, we register a service worker to serve assets from local cache.

// This lets the app load faster on subsequent visits in production, and gives
// it offline capabilities. However, it also means that developers (and users)
// will only see deployed updates on the "N+1" visit to a page, since previously
// cached resources are updated in the background.

// To learn more about the benefits of this model, read {URL}
// This link also includes instructions on opting out of this behavior.

如果要删除 Web Worker,请不要只删除该行。导入 unregister 并在您的文件中调用它而不是在 register 中调用它。

import { unregister } from './registerServiceWorker';

然后打电话

unregister()

PS 注销后,至少需要刷新一次才能生效

@Dan 然后,您需要使用版本控制配置您的服务工作者,并在版本升级时删除旧缓存……但感谢 Kerry Gougeaon 提供的快速临时解决方法。
2021-05-31 11:54:02
@AhmadMaleki 是的,如果您的项目未部署,这是一个很好的解决方案,但是如果您的网站已经在线并且有人让 service worker 工作;只需删除这些行,它就不会被注销。
2021-06-13 11:54:02
@Alfrex92 是的,它应该。
2021-06-16 11:54:02
“至少需要刷新一次才能使其工作”您的意思是在第二次刷新后用户将能够看到新内容?
2021-06-20 11:54:02
有不同的解决方案吗?用户只需要刷新一次。
2021-06-21 11:54:02

我在使用create-react-app( 并部署到 heroku )时遇到了同样的问题它一直显示我的应用程序的旧版本😡。

我发现问题似乎出在浏览器端,它index.html用过时的 js 包缓存了我的旧文件

您可能希望将以下内容添加到您的服务器端响应标头中

"Cache-Control": "no-store, no-cache"

或者,如果您也在使用 heroku create-react-app-buildpack,请更新static.json文件

"headers": { 
    "/**": { 
        "Cache-Control": "no-store, no-cache" 
    } 
}

我觉得这样你还可以留住那个可怜的service worker😂,并且在N+1加载时会显示最新的内容(第二次刷新)

希望这可以帮助...

你真的想不缓存所有东西吗?罪魁祸首只是html文件吗?
2021-05-26 11:54:02
2021-05-31 11:54:02

正如这里之前的一些答案所提到的,在查看旧版本的 React 应用程序时,服务工作者和(缺乏)缓存标头都可能与您共谋。

React 文档在谈到缓存时声明如下

使用Cache-Control: max-age=31536000你的build/static 资产,以及Cache-Control: no-cache其他一切是确保你的用户的浏览器会经常检查更新的安全和有效抓手index.html文件,将缓存所有的build/static文件为一年。请注意,您可以build/static安全地使用一年到期,因为文件内容哈希已嵌入到文件名中。

正如@squarism 所提到的,旧版本的 create-react-app 默认选择退出服务工作者注册,而新版本则选择加入您可以在官方文档中阅读更多相关信息如果您从旧版本的 create-react-app 开始并且想切换到新行为,那么将您的配置与最新模板相匹配是一个非常简单的过程

相关问题:

@A.com Cache-Control 是一个 HTTP 响应头,与元标记无关。您如何配置这取决于您如何服务/托管您的应用程序。
2021-05-24 11:54:02
@bszom 如何设置缓存控制:构建/静态与 index.html 的无缓存。元标记上是否有用于此的属性?
2021-06-04 11:54:02
感谢您在这里如此彻底,这是我的场景的最佳答案。如果其他人试图确保 Cloudfront 始终提供来自 S3 的最新应用程序,答案似乎是在网站存储桶中Cache-Control: max-age=0index.html对象进行配置
2021-06-09 11:54:02

似乎他们在服务工作者方面从选择退出变为选择加入。这是更改自述文件的提交,它的示例类似于 Kerry G 的回答:

https://github.com/facebook/create-react-app/commit/1b2813144b3b0e731d8f404a8169e6fa5916dde4#diff-4e6ec56f74ee42069aac401a4fe448ad

如果您的问题是在 index.html 中静态引用的资源,例如 .css 文件或其他 .js 文件(例如配置文件),您可以声明一个 React 环境变量,为其分配一个唯一值并在您的索引中引用它。 .html 文件。

在您的构建脚本 (bash) 中:

REACT_APP_CACHE_BUST={e.g. build number from a CI tool} npm run build

在你的 index.html 中:

<link rel="stylesheet" href="%PUBLIC_URL%/index.css?cachebust=%REACT_APP_CACHE_BUST%" />

变量名必须以 REACT_APP_ 开头。更多关于 React 中的环境变量:https : //facebook.github.io/create-react-app/docs/adding-custom-environment-variables

我们的 javascript 代码和 HTML 代码怎么样,因为每当我上传我的新代码时,它们都不会被添加。?
2021-06-01 11:54:02
谢谢,迈克尔的答复。Michal,你能帮助我如何处理 web 服务器的缓存控制,因为我的 react 应用程序在单独的服务器上,而 Express.js (Node.js) 服务器在不同的服务器上。
2021-06-01 11:54:02
如果我正确理解您的设置,那么您的问题可能出在 React 应用程序 Web 服务器上。缓存通常通过添加一组响应标头来控制,这些标头告诉您的浏览器和代理服务器如何缓存该网站。有关详细信息,请参阅本:stackoverflow.com/questions/49547/...
2021-06-02 11:54:02
这么晚才回复很抱歉。我认为 javascript 情况取决于您的构建过程。我们使用 create-react-app(package.json -> 脚本 -> 构建条目是“react-scripts build”)。构建过程会生成 javascript 文件,文件名包括文件内容的哈希值。所以一般来说,我认为不需要额外的 js 文件缓存破坏。如果您的索引 html 文件被缓存,则问题可能出在 Web 服务器的缓存控制中。
2021-06-06 11:54:02
感谢您的详细回复,基本上每当我在部署最新代码后访问我的 react 应用程序时,我总是会看到我之前部署的 react 构建代码,直到我手动清除浏览器的缓存。这是我的主要问题。
2021-06-21 11:54:02