官方提到:
SplitChunksPlugin
插件可以将公共的依赖模块提取到已有的入口 chunk 中,或者提取到一个新生成的 chunk。
我写了一个 demo 项目,目录结构如下:
webpack.config.js
const path = require('path')
const HtmlWebpackPlugin = require('html-webpack-plugin')
const { CleanWebpackPlugin } = require('clean-webpack-plugin')
module.exports = {
mode: 'development',
entry: {
index: { import: './src/index.js' },
another: { import: './src/another-module.js' },
},
devtool: 'inline-source-map',
devServer: {
contentBase: './dist',
},
plugins: [
new CleanWebpackPlugin(),
new HtmlWebpackPlugin({
title: '开发环境',
})
],
output: {
filename: '[name].bundle.js',
path: path.resolve(__dirname, 'dist'),
},
// 分离代码
optimization: {
splitChunks: {
chunks: 'all',
}
}
}
index.js
import _ from 'lodash'
import printMe from './print.js'
function component() {
const element = document.createElement('div');
const btn = document.createElement('button')
element.innerHTML = _.join(['Hello', 'webpack'], ' ');
btn.innerHTML = '点击这里,然后查看 console !'
btn.onclick = printMe
element.appendChild(btn)
return element;
}
document.body.appendChild(component());
another-module.js
import _ from 'lodash'
import printMe from './print.js'
console.log(
_.join(['Another', 'module', 'loaded!'], '')
)
print.js
console.log(123)
export default function printMe() {
console.log('I get called from print.js!')
}
打包后
很明显,index.js 和 another-module.js 都引入的 lodash 模块被提取出来了,变为 vendors-node_modules_lodash_lodash_js.bundle.js 文件,但是为什么 index.js 和 another-module.js 都引入的 print.js 没有被提取出来,当我运行项目时,print.js 里的 console.log(123) 明显执行了两次。这是因为 print.js 不是 node_modules 里导致的吗?