3

我正在使用 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重新生成哈希?或者,或者,在生成哈希之前处理编译文件的内容?

4

0 回答 0