一次 webpack dll 无效的场景原因分析与解决

940次阅读
没有评论

共计 1028 个字符,预计需要花费 3 分钟才能阅读完成。

提醒:本文最后更新于2025-07-07 14:27,文中所关联的信息可能已发生改变,请知悉!

在对一个庞大的 Angular 项目进行构建优化时,为其增加了 webpack dll 配置。但是执行后发现 dll 没有生效,配置在 dll 中的依赖仍然会被打包在运行时 chunks 当中。

经过调试 DllReferencePlugin 发现 manifest 中的路径似乎不太对。打开 manifest.json 文件,发现其中的依赖路径都是类似这样的:

“content”:{“../node_modules/@angular/common/fesm2020/common.mjs”:{“id”:”./node_modules/@angular/common/fesm2020/common.mjs”,

显然,content 中的模块 key 前缀都是以 ../node_modules 开头,而实际项目中的模块 ID 在 resolve 后都是以 ./node_modules,于是相同的模块实际上 key 不一致,自然无法匹配了。

仔细分析了一下 webpack.dll.config.js 的配置,才发现了端倪:

new webpack.DllPlugin({
context: __dirname,
path: path.join(output, '[name]-manifest.json'),
name: '[name]_library',
}),

从上面的配置中可以看到,context 部分根据 __dirname 设置,这里是参考官方文档的设置方式。但是我在创建该配置后即将它移动到了项目根目录的 config 目录下,于是 context 变为了 config 目录。

解决办法则是修正它为当前目录(与webpack.config.js一致即可),或者删除它(默认使用 webpack context)。示例:

new webpack.DllPlugin({
context: process.cwd(),
path: path.join(output, '[name]-manifest.json'),
name: '[name]_library',
}),

小结:

该问题的原因虽然简单,但是在一开始并未意识到是配置的原因,以为是 angular-cli 构建流程中的逻辑导致,由于查找方向出现了偏差,所以浪费了较多的时间。实际上遇到此类问题,还是要从 debugger 单步调试入手,看上去稍微繁琐,实际上由于可以清晰的定位分析,更为为节省时间。

  • https://webpack.js.org/plugins/dll-plugin/#dllreferenceplugin

正文完
 0
任侠
版权声明:本站原创文章,由 任侠 于2022-12-14发表,共计1028字。
转载说明:除特殊说明外本站文章皆由CC-4.0协议发布,转载请注明出处。
评论(没有评论)
验证码