我正在使用 Webpack 2(通过 Laravel Mix)编译不同语言的 Javascript 资产,就像 Webpack 自己的i18n 插件一样。不过,我已经构建了一个自定义实现,它可以很好地与 Mix 的助手配合使用。不过,还有最后一个问题,我无法理解,这与监视过程有关。以下是正在发生的事情的摘要:
- 一个 app.js 文件有几个组成实际逻辑的依赖项
- Mix 被指示为每种语言创建一个不同的文件,其中每种语言都可以将其占位符字符串替换为实际翻译(这最终将输出
en.[hash].js
,pt.[hash].js
等) - Webpack 将处理所有这些依赖项并创建一个包含所有代码的捆绑文件
- 当 Webpack 即将发出最终文件时,我使用 JSON 文件( 、 等;顺便提一下,Laravel 自己的语言 JSON 文件)使用实际语言字符串处理翻译
en.json
占位pt.json
符
JSON 文件不包含在实际app.js
文件中,因此 Webpack 在执行watch
. 但是,当我更改这些 JSON 文件时,我已经设法触发编译,方法是将它们作为依赖项注入,在我的插件apply
方法中:
compiler.plugin('emit', (compilation, callback) => {
mix.config.locales.forEach(_.bind(function (locale) {
const file = path.resolve(this.translationsPath, `${locale}.json`)
if (!_.includes(compilation.fileDependencies, file)) {
compilation.fileDependencies.push(file);
}
}, this))
callback()
})
问题是,即使 Webpackapp.js
在我更改语言 JSON 文件时重新编译我的文件,因为它们不是脚本的一部分,Webpack 不会识别任何更改并且不会重建脚本,因此翻译中的任何实际更改都不会在监视期间生效。
1) 我可以告诉 webpack 在 JSON 文件更改时强制重建吗?
我能想到的另一个限制是:由于最终文件的哈希是在翻译之前生成的,即使我触发了重建,哈希也会完全相同,因此在部署到生产环境时,浏览器不会知道翻译已经更新并且仍将提供脚本的缓存版本。这导致我:
2)有没有办法让Webpack重新生成哈希?或者,或者,在生成哈希之前处理编译文件的内容?