背景
我的项目是一个多页应用,用webpack作为构建工具,目前是用CommonsChunkPlugin(minChunks: 5)把所有require5次以上的模块(这里面既包括第三方库,也包括我自己写的公用业务逻辑模块)都打包到一起,因此基本上每个页面只加载俩js,一个是前面提到的这个打包的js,另外一个就是仅在本页面使用到的entry.js。
以登录页作为例子,每个页面加载的js是这样的:
<!-- 公用模块(这里面既包括第三方库,也包括我自己写的公用业务逻辑模块) -->
<script type="text/javascript" src="../../../build/commons.bundle.js"></script>
<!-- 每个页面独有的入口文件,在本页面用到而又没有被打包到commons.bundle.js里的话(可能是当前页面独有的逻辑,也可能是少于5次require的公用业务逻辑模块/第三方库)就会被打包到entry.js里 -->
<script type="text/javascript" src="../../../build/index/login/page/entry.js"></script>
需求
现在我的需求是,把第三方库和我自己写的公用业务逻辑库分开来打包,这是基于下面的考虑:
第三方库基本不会改动,打包一次就不用动了,对缓存有好处。
把第三方库拉出来后,webpack打包速度可以更快。
我希望最后达到的效果是:
<!-- 公用业务逻辑模块打包 -->
<script type="text/javascript" src="../../../build/commons.bundle.js"></script>
<!-- 所有的第三方库打包 -->
<script type="text/javascript" src="../../../build/commons.bundle.js"></script>
<!-- 每个页面独有的入口文件 -->
<script type="text/javascript" src="../../../build/index/login/page/entry.js"></script>
尝试
我在网上没有搜到这样的例子,只搜得到仅把第三方库独立出来打包的例子(没有考虑到公用业务逻辑库的情况)。
我自己有尝试过用俩CommonsChunkPlugin:
commonsChunkPluginForVendor = new webpack.optimize.CommonsChunkPlugin({
name: 'vendor',
filename: '[name].bundle.js',
minChunks: Infinity,
});
commonsChunkPlugin = new webpack.optimize.CommonsChunkPlugin({
name: 'commons',
filename: '[name].bundle.js',
minChunks: 5,
});
这样打包出来的效果是,第三方库的确是独立出来了打包到了vendor.bundle.js
里,但是commons.bundle.js
里却只有webpack的一些执行代码,并没有把公用业务逻辑库抽取出来,而是分散到各个entry.js里。
请教怎么才能分别打包第三方库和自己写的公用业务逻辑库呢?
第三方库打包之后不想再编译可以使用 webpack 的 dll 功能,具体可以看这里:https://segmentfault.com/a/1190000005969643
公共的代码再加个 entry: