【发布时间】:2020-10-11 01:09:15
【问题描述】:
我有一个 Rails 6 应用程序,其中包含大量供应商 CSS 和 JS。 CSS 和 JS 很少会改变。我希望 Rails 缓存它。
我创建了 2 个包。 1 包含来自供应商的所有导入,另一个包含我的应用程序 JS 的导入。我在两者的头部都使用javascript_packs_with_chunks_tag。
每当我修改应用程序的 JS 文件时,该包的缓存也会与供应商的包一起失效!
这种行为似乎很正常,因为我能够使用新的 Rails 应用程序重现它。
编辑:我可以通过关闭编译 (webpacker.yml compile: false) 并在单独的终端选项卡 (./bin/webpack --watch --colors --progress) 中运行 webpack 来解决新 Rails 应用程序中的问题,但在我的应用程序中我仍然遇到问题. Webpack 似乎发现了一些全局变量或关键字来连接这两个包。不幸的是,Webpack 日志和依赖关系图没有显示“连接”。 100% 不是import。
【问题讨论】:
-
问题是即使内容没有改变,供应商资产的输出文件哈希也在改变。显然 webpack 添加了时间戳和其他东西,所以哈希正在改变。如果输出文件名(包括哈希)没有改变,缓存将起作用。 Webpack 解决了这个问题(webpack.js.org/guides/caching/),因此可以通过 webpacker 适当地配置 webpack。
-
很棒的提示,@LesNightingill !您是说“webpacker* 添加时间戳和其他内容”吗?因为根据 webpack 的说法,“[contenthash] 替换将根据资产的内容添加唯一的哈希。当资产的内容发生变化时,[contenthash] 也会发生变化。”。但是,当您查看 webpacker 的配置 gist.github.com/hrdwdmrbl/… 时,看起来他们没有明确添加时间戳或任何额外内容。
-
如果您从引用的引文往下看几段,它还会说“如果我们在不进行任何更改的情况下运行另一个构建,我们希望该文件名保持不变。但是,如果我们再次运行它,我们可能会发现情况并非如此”,然后继续解释原因。我认为时间戳等已添加到内容中,因此 contenthash 会发生变化(这就是您所看到的,对吗?哈希会发生变化,但您没有对供应商内容进行任何更改)。看起来 webpacker 会合并您提供的任何选项。所以看看你是否可以整合 webpack 记录的想法。
-
如果您成功获得仅基于代码而不是 webpack 开销的 contenthash,请告诉我们。
-
我刚刚尝试了一个实验...在我的开发机器上运行 webpack 编译几次,没有代码更改...我没有看到文件名更改,正如 webpack 文档所建议的那样他们可能。所以我可能完全错了!问题是......在您的生产服务器上,当没有代码更改时,供应商包文件名是否会更改?我(还没有)进行代码拆分,所以这可以解释我的结果。
标签: ruby-on-rails caching webpack webpacker