在 webpack.config.js 中
module.exports = {
entry: {
main: './src/index.js'
},
module: {
},
plugins: [],
optimization: {
splitChunks: {
chunks: 'all'
}
},
output: {
filename: '[name].js',//入口文件打包后生成的文件名
+ chunkFilename: '[name].chunk.js',
//main.js异步加载的间接的js文件。用来打包import('module')方法中引入的模块
path: path.resolve(__dirname, '../dist')
}
}
因为CSS的下载和JS可以并行,当一个HTML文件很大的时候,我们可以把CSS单独提取出来加载
- mini-css-extract-plugin:一般在线上环境使用这个插件,因为在开发环境中不支持HMR。
- filename 打包入口文件
- chunkFilename 用来打包
import('module')
方法中引入的模块
安装 :
//抽离css文件
npm install --save-dev mini-css-extract-plugin
//压缩css文件
npm i optimize-css-assets-webpack-plugin -D
在 webpack.prod.js 中:
const MiniCssExtractPlugin = require("mini-css-extract-plugin");
const OptimizeCSSAssetsPlugin = require("optimize-css-assets-webpack-plugin");
const merge = require('webpack-merge');
const commonConfig = require('./webpack.common.js');
const prodConfig = {
mode: 'production',
devtool: 'cheap-module-source-map',
module: {
rules:[{
test: /\.scss$/,
use: [
+ MiniCssExtractPlugin.loader,
{
loader: 'css-loader',
options: {
importLoaders: 2
}
},
'postcss-loader',
'sass-loader',
]
}, {
test: /\.css$/,
use: [
+ MiniCssExtractPlugin.loader,
'css-loader',
'postcss-loader'
]
}]
},
+ optimization: {
minimizer: [new OptimizeCSSAssetsPlugin({})]
},
plugins: [
+ new MiniCssExtractPlugin({
filename: '[name].css',//直接引用的css文件
chunkFilename: '[name].chunk.css'//间接引用的css文件
})
]
}
module.exports = merge(commonConfig, prodConfig);
在 webpack.dev.js
const webpack = require('webpack');
const merge = require('webpack-merge');
const commonConfig = require('./webpack.common.js');
const devConfig = {
mode: 'development',
devtool: 'cheap-module-eval-source-map',
devServer: {
contentBase: './dist',
open: true,
port: 8080,
hot: true
},
module: {
rules: [{
test: /\.scss$/,
use: [
'style-loader',
{
loader: 'css-loader',
options: {
importLoaders: 2
}
},
'postcss-loader',
'sass-loader',
]
}, {
test: /\.css$/,
use: [
'style-loader',
'css-loader',
'postcss-loader'
]
}]
},
plugins: [
new webpack.HotModuleReplacementPlugin()
],
}
module.exports = merge(commonConfig, devConfig);
在 webpack.common.js 中:
const path = require('path');
const HtmlWebpackPlugin = require('html-webpack-plugin');
const CleanWebpackPlugin = require('clean-webpack-plugin');
module.exports = {
entry: {
main: './src/index.js',
},
module: {
rules: [{
test: /\.js$/,
exclude: /node_modules/,
loader: 'babel-loader',
}, {
test: /\.(jpg|png|gif)$/,
use: {
loader: 'url-loader',
options: {
name: '[name]_[hash].[ext]',
outputPath: 'images/',
limit: 10240
}
}
}, {
test: /\.(eot|ttf|svg)$/,
use: {
loader: 'file-loader'
}
}]
},
plugins: [
new HtmlWebpackPlugin({
template: 'src/index.html'
}),
new CleanWebpackPlugin(['dist'], {
root: path.resolve(__dirname, '../')
})
],
optimization: {
usedExports: true,//TreeShaking
splitChunks: {
chunks: 'all'
}
},
output: {
filename: '[name].js',
chunkFilename: '[name].chunk.js',
path: path.resolve(__dirname, '../dist')
}
}
在 package.json 中:
{
"sideEffects": ["*.css"] //除了css文件,其余的都TreeShaking
}
详细请看官方文档:mini-css-extract-plugin