Javascript 使用reactjs开发的web应用程序的缓存问题&;网页包
我正在使用reactjs和webpack开发一个web应用程序。每次部署后,我们都必须要求用户清除浏览器缓存并重新启动浏览器。我认为javascript包文件和css文件都被缓存在用户浏览器上 我们如何才能强制浏览器不缓存这些文件或使其从服务器下载最新的文件Javascript 使用reactjs开发的web应用程序的缓存问题&;网页包,javascript,caching,reactjs,webpack,Javascript,Caching,Reactjs,Webpack,我正在使用reactjs和webpack开发一个web应用程序。每次部署后,我们都必须要求用户清除浏览器缓存并重新启动浏览器。我认为javascript包文件和css文件都被缓存在用户浏览器上 我们如何才能强制浏览器不缓存这些文件或使其从服务器下载最新的文件 <html> <head> <meta charset="utf-8"> <title>My App</title> <link
<html>
<head>
<meta charset="utf-8">
<title>My App</title>
<link rel="stylesheet" href="styles.css" media="screen" charset="utf-8">
</head>
<body>
<div id="app"></div>
<script src="bundle.js"></script>
</body>
</html>
我的应用程序
您可以使用
hash:true | false如果为true,则向所有包含的脚本和css文件附加一个唯一的webpack编译哈希。这对于缓存破坏非常有用
有一种简单的方法可以避免这个问题,而不需要任何额外的东西。使用webpack的内置哈希功能
您可以阅读有关将哈希添加到捆绑包的内容。虽然标题是“长期缓存”,但只有在文件不变的情况下才是如此。但若你们重建你们的包,它会得到新的唯一散列,所以浏览器会认为它是新文件并下载它。你们应该使用html网页包插件和html模板,并将散列配置放在输出中。因此,您的网页包配置将如下所示:
output: {
filename: "[name].[hash].js",
path: <path to your bundle folder>
}
new HTMLWebpackPlugin({
hash: true,
template: paths.resolveFromRoot("src/index.html") //where you want the sample template to be
})
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<meta http-equiv="expires" content="0">
<meta http-equiv="Cache-Control" content="no-cache, no-store, must-revalidate" />
<meta http-equiv="X-UA-Compatible" content="IE=edge,chrome=1">
<title>Title</title>
</head>
<body>
<div id="app"></div>
</body>
</html>
输出:{
文件名:“[name].[hash].js”,
路径:
}
新HTMLWebpackPlugin({
哈什:没错,
template:path.resolveFromRoot(“src/index.html”)//示例模板的位置
})
您的index.html将如下所示:
output: {
filename: "[name].[hash].js",
path: <path to your bundle folder>
}
new HTMLWebpackPlugin({
hash: true,
template: paths.resolveFromRoot("src/index.html") //where you want the sample template to be
})
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<meta http-equiv="expires" content="0">
<meta http-equiv="Cache-Control" content="no-cache, no-store, must-revalidate" />
<meta http-equiv="X-UA-Compatible" content="IE=edge,chrome=1">
<title>Title</title>
</head>
<body>
<div id="app"></div>
</body>
</html>
标题
HTML webpack插件将自动将修改后的脚本插入捆绑文件夹中创建的index.HTML中。希望这有帮助。对于缓存修复,您可以参考其中提到的版本控制和服务器响应头配置,以获得有效的缓存解决方案。感谢您的快速回复。我收到以下错误
加载资源失败:对于文件bundle.js?1c03629db68f03ac936e
,服务器响应状态为404(未找到)
&对于style.css?1c03629db68f03ac936e
文件,也会出现类似错误。我安装了npm包,并简单地添加了您在webapck配置文件中显示的代码。在构建和部署之后,我遇到了一个错误。当我在本地运行应用程序时,会出现以下错误ncaught不变量冲突:_registerComponent(…):目标容器不是DOM元素。
确保从HtmlWebpackPlugin
生成的html文件正确引用了这些文件。我不知道您的项目是如何设置的,因此它可能会认为您的分发目录结构与它不同。我认为问题是,查询字符串的格式不正确。文件不是键值对,而是值。我的意思是,它不是bundle.js?v=1c03629db68f03ac936e
而是bundle.js?1c03629db68f03ac936e
。缺少键
。我是否错过了一个配置选项。这适用于“webpack”或需要“webpack dev server”?@stackdave我认为它应该只适用于webpack,它会在构建过程中进行哈希处理。假设我在我的webpack.config文件中使用文件名:'[hash].bundle.js',
。它会生成如下文件3d161aa1fedaca1ca95b.bundle
。现在我如何更新我的index.html文件,它仍然包括bundle.js文件,如
。文章还说,注意,您需要在HTML中引用条目块及其散列。您可能需要从统计数据中提取哈希值或文件名。
我在这里遗漏了什么吗?您可以在上一章中找到答案。构建后,您可以查看stats.json以查看实际的捆绑包名称,然后将其传递给html模板。感谢您的回复。我查看了资产网页包插件
,他们说这个插件输出一个json文件,其中包含生成的资产的路径,因此您可以从其他地方找到它们。
但是我没有看到一个例子解释他们如何在index.html
中更新引用文件名。哦,他们没有更新index.html。您可能应该使用一些模板引擎来生成index.html,并将生成的资产作为变量传递给它。你的流量:1。使用webpack构建并获取stats.json 2。启动服务器3时读取stats.json。将正确的路径从stats.json传递到html