可以建立一个独立文件(又称作 chunk)的功能,用于提取第三方库和公共模块。
但是webpack 4已经到取消了这个插件,转而使用SplitChunksPlugin,相关文章webpack4: 代码分割CommonChunkPlugin的寿终正寝,详解CommonsChunkPlugin的配置和用法
src目录下创建以下文件:
common.js
export const common = 'common file';
first.js
import {common} from './common';
import $ from 'jquery';
console.log($,`first ${common}`);
second.js
import {common} from './common';
import $ from 'jquery';
console.log($,`second ${common}`);
webpack.config.js
const path = require("path");
const webpack = require("webpack");
module.exports = {
entry: {
first: './src/first.js',
second: './src/second.js'
},
output: {
path: path.resolve(__dirname,'./dist'),
filename: '[name].js'
},
}
npm run build后看到以下信息,并且多了dist文件夹:
打开dist文件夹打包了的文件,可以看到first.bundle.js和second.bundle.js文件都打包了第三方库jquery和公共模块common.js
公共模块重复打包,这不合理啊,接下来我们要分离出自定义公共模块,第三方库和webpack运行文件。
webpack.config.js
const path = require("path");
const webpack = require("webpack");
const packagejson = require("./package.json");
const config = {
entry: {
first: './src/first.js',
second: './src/second.js',
vendor: Object.keys(packagejson.dependencies)//获取生产环境依赖的库
},
output: {
path: path.resolve(__dirname,'./dist'),
filename: '[name].js'
},
plugins: [
new webpack.optimize.CommonsChunkPlugin({
name: 'vendor',
filename: '[name].js'
}),
]
}
module.exports = config;
npm run build 后发现多了vendor.js文件,对比first.bundle.js和second.bundle.js文件的size发现比未分离之前的小了。【但是,这时候自定义公共模块和第三方库还在first.bundle.js和second.bundle.js里,不知道问题出在哪】
配置文件改为如下:
//创建一个名为runtime的commons chunk进行webpack运行文件的抽离,其中source chunks是vendor.js。
plugins: [
new webpack.optimize.CommonsChunkPlugin({
name: ['vendor','runtime'],
filename: '[name].js'
}),
]
or
plugins: [
new webpack.optimize.CommonsChunkPlugin({
name: 'vendor',
filename: '[name].js'
}),
new webpack.optimize.CommonsChunkPlugin({
name: 'runtime',
filename: '[name].js',
chunks: ['vendor']
}),
]
重新构建后,多了runtime.js文件,ventor.js文件变小.
minChunks: Infinity:只有当入口文件(entry chunks) >= 3 才生效,用来在第三方库中分离自定义的公共模块
plugins: [
new webpack.optimize.CommonsChunkPlugin({
name: ['vendor','runtime'],
filename: '[name].js',
minChunks: Infinity
}),
new webpack.optimize.CommonsChunkPlugin({
name: 'common',
filename: '[name].js',
chunks: ['first','second']//从first.js和second.js中抽取commons chunk
}),
]
此时,first.bundle.js和second.bundle.js已经变小。到此为止,vendor.js、common.js、runtime.js分别是第三方库,自定义公共模块和webpack运行文件。