bundle体积过大
并不是每个模块在启动时都是必要的
分包、按需加载
多入口打包,适用于多页面程序,公共部分单独提取
const MiniCssExtractPlugin = require('mini-css-extract-plugin') // 将css文件提取到单独的文件中
const OptimizeCssAssetsWebpackPlugin = require('optimize-css-assets-webpack-plugin') // 将css文件压缩
const TerserWebpackPlugin = require('terser-webpack-plugin') // 将js文件压缩
module.exports = {
entry: {
main: './src/main.js',
login: './src/login.js'
},
output: {
filename: '[name]-[chunkhash:8].bundle.js' // 有三种值可选:hash, chunkhash, contenthash,一般选取chunkhash
},
module: {
rules: [
{
test: /\.css$/,
use: [
MiniCssExtractPlugin.loader, // 当我们使用MiniCssExtractPlugin,就不需要使用style-loader了,
'css-loader' // MiniCssExtractPlugin.loader会帮助我们将样式文件通过link标签的形式引入
]
}
]
},
optimization: { // 开启优化项
splitChunks: {
chunks: 'all' // 将所有的公共模块提取到一个单独的文件中
},
minimizer: [ // 自定义压缩插件,webpack建议我们将压缩插件都放在这个数组中
new OptimizeCssAssetsWebpackPlugin(),
new TerserWebpackPlugin()
]
},
plugins: [
new MiniCssExtractPlugin({
filename: '[name]-[chunkhash:8].bundle.css'
}),
new HtmlWebpackPlugin({
title: 'multiple entry',
template: 'index.html',
filename: 'index.html',
chunks: ['main'] // 输出的index.html文件中,script标签中加载的chunk
}),
new HtmlWebpackPlugin({
title: 'multiple entry',
template: 'login.html',
filename: 'login.html',
chunks: ['login'] // 输出的index.html文件中,script标签中加载的chunk
})
]
}
webpack动态导入,按需加载,可以帮助我们降低流量和带宽
// 在React 或 Vue中,我们可以在路由文件中使用import按需导入组件
// 下面的示例是在单个文件中使用动态导入,且使用了魔法注释,注意魔法注释的格式
// 如果我们想将某几个模块打包到一起,那么只需要将webpackChunkName命名一致就可以了
import (/* webpackChunkName: 'mian' */'./src/index.js').then(({ default: 'main'}) => {
})