webpack CommonsChunkPlugin

最近的项目使用webpack 做依赖管理和打包, 为了尽量重用代码, 使用了CommonsChunkPlugin插件来分离共用代码。

项目后端是Asp.net MVC, 为了尽量符合框架的使用理念, 前端代码的构建以编译ES6 和 Sass 文件(不压缩)为目标。为了让后端可以直接运行项目, 编译出来的文件也放在了仓库中。 (这是引出问题的原因,如果构建优化流程全在前端做的话就没有下面的问题了)

一开始的webpack配置是这样的 

 1 let commonsPlugin = new webpack.optimize.CommonsChunkPlugin({
 2     filename: "common.js"
 3 });
 4 
 5 
 6 let plugins = [
 7     commonsPlugin,
 8 ];
 9 
10 module.exports = {
11     plugins: plugins,
12     // ...
13 }

这样的用法, webpack会在每次打包的时候找出所有entry 所共用的部分抽取出来成为 common.js 文件。

但是在之后的多人合作开发中遇到了很多次merge conflict 的情况, 因为不同的entry文件的修改都有可能导致common.js内容的变化, 进而使得webpack 的 import 引用id 变化, 然后影响到其他所有的entry 输出文件。 冲突的情况基本会影响到所有的输出文件, 处理起来很是麻烦。

后来重新读了一遍CommonsChunkPlugin 找到了一个不错的解决方案, 简单的说就是显示申明公共依赖而不用webpack来自动计算。

这样修改后, 各个entry的修改只会影响到自己的输出文件,不会影响到全部的输出。 唯一需要注意的是公共entry文件的改动需要通知其他人先提交代码做好同步, 然后再做改动(而且如果只是修改依赖的内容并不会影响到其他文件, 之后添加或者减少依赖才会有影响), 可以最大限度消除conflict

参考url : https://webpack.js.org/plugins/commons-chunk-plugin/#explicit-vendor-chunk

代码稍作修改:

 1 let commonsPlugin = new webpack.optimize.CommonsChunkPlugin({
 2     // reference: https://github.com/webpack/webpack/tree/master/examples/two-explicit-vendor-chunks
 3     // to make the vendor static, reduce the chance of conflicts.
 4     names: ['vendor'],
 5     minChunks: Infinity
 6 });
 7 
 8 let plugins = [
 9     commonsPlugin,
10 ];
11 
12 module.exports = {
13     plugins: plugins,
14     entry: {
15         vendor: ['./common/app.js'],  // 此处管理所有公共依赖
16         shared_official: "./views/shared/official-site.js",
17         home_experimental: "./views/home/experimental.js",
18         home_index: "./views/home/index.js",
19         course_smallstars: "./views/course/smallstars.js",
20         course_trailblazers: "./views/course/trailblazers.js",
21         course_highflyers: "./views/course/highflyers.js"
22     }
23 }

修改完之后就可以让输出文件愉快的和后端框架一起玩耍了。

(完)

原文地址:https://www.cnblogs.com/tangkikodo/p/7017651.html