Webpack 生成具有相同 contenthash 的不同块

Webpack generate different chunks with the same contenthash

我有一个 Webpack 4.1 配置,它使用 myproj-[name]-[contenthash].chunk.js.

这样的模式使用代码拆分和输出块名称

我正在为每个版本复制所有生产包文件,在服务器上的同一目录中,确保(直到现在)块是唯一的并且我没有冲突。

今天我在发布应用程序的新版本时发现了一个问题:我有一个名为 myproj-modulex-0bb2f31cc0ca424a07d8.chunk.js 的文件,它也是用旧版本生成的(那是 contenthash 的范围,不是吗?) .我希望文件的内容是相同的,但它不是

只有一个字符改变了(数组索引)。该块以...

开头
(window.webpackJsonp_XXXX=window.webpackJsonp_XXXX||[]).push([[7],{"2d0274e27fde9220edd9"...

...旧版本使用 ...push([[6],...

新版本和旧版本的区别之一是我添加了新的代码拆分点。

所以:似乎新的分割点改变了块的顺序,但 webpack 仍然使用相同的生成文件名(可能是因为 contenthash 是指真正的模块内容?)。

问题很严重:当新文件被复制到服务器上时,它会覆盖旧文件,因此使用旧版本的客户端不再工作,因为块被加载到推送数组的错误位置(我猜) .

错误是:

"Error: Loading chunk 6 failed.
(missing: https://.../myproj-xxx-0bb2f31cc0ca424a07d8.chunk.js)"

有办法解决这个问题,也许是命名推送的块,或者指定顺序,或者生成不同的哈希值? chunkhash ?

Webpack 使用 id 作为块引用,并且不保证这些 id 对于不同构建中的相同块保持相同。 contenthash 用于 ExtractTextWebpackPlugin 提取的文件。相同的源内容将获得相同的 contenthash,但生成的文件可能因 id 更改而不同。

请尝试使用 myproj-[name]-[chunkhash].chunk.js

另请查看 optimization.moduleIdsoptimization.chunkIds 设置。