想要代码分离可以通过配置多个入口文件
// webpack.config.js
module.exports = {
entry: {
index: './src/index.js',
another: './src/another-module.js',
},
output: {
filename: '[name].bundle.js'
}
}
// webpack.config.js (执行编译配置之后,会生成三个文件:index.js, another.js, shared.js。需要将这三个文件都引入html中才会生效)
module.exports = {
entry: {
index: {
import: './src/a.js',
dependOn: 'shared',
},
another: {
import: './src/b.js',
dependOn: 'shared'
},
shared: 'lodash', // lodash 是 a 和 b 中导入的共同的包
},
output: {
filename: '[name].bundle.js'
}
}
// webpack.config.js (执行编译配置之后,会生成三个文件:index.js, another.js, .jvendors-node_modules_lodash.js。需要将这三个文件都引入html中才会生效)
module.exports = {
optimization: {
splitChunks: {
chunks: 'all'
}
}
}
动态导入的核心是:使用import()函数,import()函数内的那个模块会被单独导出一个js文件,导出效果与上面的最后一个方法一样
// a.js 文件
function getComponent() {
return import('lolash').then(({default: _}) => {
const element = document.createElement('div');
element.innerHTML = _.join(['Hello', 'webpack'], ' ');
return element;
})
};
getComponent().then((element) => {
document.body.appendChild(element);
})
// index.js 文件(webpack打包的入口文件)
import './a.js'
动态导入的应用场景:我们可以当某件事情触发的时候再使用动态导入的方式加载某个包,实现按需加载(懒加载)。
动态导入的一些配置,webpackChunkName:动态导入生成的单独的文件的文件名字,webpackPrefetch:预获取,会在页面加载完毕,在网络有空闲的时候就加载该包(会在head标签内生成一个link标签,具体了解请自行百度),webpackPreload:和懒加载方式效果一致,不过它可以进行并行下载。
// a.js 文件
function getComponent() {
return import(/* webpackChunkName: 'lolash', webpackPrefetch: true */'lolash').then(({default: _}) => {
const element = document.createElement('div');
element.innerHTML = _.join(['Hello', 'webpack'], ' ');
return element;
})
};
getComponent().then((element) => {
document.body.appendChild(element);
})
// index.js 文件(webpack打包的入口文件)
import './a.js'
如果静态导入和动态导入同时存在,那么就需要按照静态导入的最后一种方法进行配置,才会把静态导入和动态导入所导入的公共包单独导出成为一个文件,如果不进行配置,那么公共包将不会导出为一个公共的js文件