Webpack4 配置详解
[[toc]]
Webpack4后包拆成webpack和webpack-cli两个包:
// 安装webpack |
主要有以下这些一级配置:
module.exports = { |
1. mode
Webpack 4 引入了 mode 这个选项。这个选项的值可以是 development 或者 production。
设置了 mode 之后会把 process.env.NODE_ENV 也设置为 development 或者 production。然后在 production 模式下,会默认开启 UglifyJsPlugin 等一堆插件。
webpack4支持ES6的方式导入JSON文件,并且支持Tree-shaking (通过工具”摇”我们的JS文件,将其中用不到的代码”摇”掉,是一个性能优化的范畴)
2. entry & output
let path = require('path'); |
3. module - rules 配置
webpack4中移除loaders配置,必须使用rules。rules 配置模块的读取和解析规则, 通常用来配置loader, 其类型是一个数组, 数组里每一项都描述了如何去处理部分文件。
配置一项rules大致通过以下方式:
条件匹配: 通过test、include、exclude三个配置来命中Loader要应用的规则文件。(三个配置都可以是正则,也支持数组)
应用规则: 对选中后的文件通过use配置项来应用loader,可以应用一个loader或者按照从后往前的顺序应用一组loader。同时还可以分别给loader传入参数。
重置顺序: 一组loader的执行顺序默认是从右到左执行,通过exforce选项可以让其中一个loader的执行顺序放到最前或者是最后。
module.exports = {
//...
module: {
rules: [
{
test: /\.css$/, // 解析css
exclude: /node_modules/,
use: ['style-loader', 'css-loader'] // 从右向左解析
/*
也可以这样写,这种方式方便写一些配置参数
use: [
{loader: 'style-loader'},
{
loader: require.resolve('postcss-loader'), //这里是加上浏览器的前缀
options: {
ident: 'postcss',
plugins: () => [
require('postcss-flexbugs-fixes'), //修复Flexbugs
require('postcss-preset-env')({ //postcss-preset-env包括autoprefixer
autoprefixer: {
flexbox: 'no-2009',
},
stage: 3,
}),
]
},
}
]
*/
}
]
}
}4. optimization
在Webpack4中引入,根据mode(production/development)的不同,配置项默认值不同,具体有以下:
optimization.minimize: 是否自动压缩打包后的代码。mode = production时,为true。
压缩默认使用terser-webpack-plugin
插件(更加兼容ES6),如果想要使用别的压缩插件,可以使用optimization.minimizer
设置。optimization.splitChunks: 根据不同的策略来分割打包出来的bundle。配置基于SplitChunksPlugin,剔除了老的
CommonsChunkPlugin
(webpack4移除)。零配置
- optimization.nodeEnv: 告诉webpack process.env.NODE_ENV的值,值来自于mode的取值。代替webpack.DefinePlugin
- optimization.namedModules: 代替webpack.NamedModulesPlugin(webpack4移除)
给模块有意义的名称代替ids
- optimization.noEmitOnErrors: 代替webpack.NoEmitOnErrorsPlugin(webpack4移除)
编译错误时不写入到输出
- optimization.concatenateModules: 代替webpack.optimize.ModuleConcatenationPlugin(webpack4移除)
尝试查找模块图中可以安全连接到单个模块中的段。- -
5. plugins
- 常用插件
HtmlWebpackPlugin
自动在html中加载打包后的js文件DLLPlugin/DllReferencePlugin
提高打包速度- DLLPlugin:创建一个只有dll的bundle
- DllReferencePlugin: 打包生成的dll文件引用到需要的预编译依赖上来
- happyPack 多进程打包,加快打包速度。
webpack.DefinePlugin
webpack4设置mode会自动使用uglifyjs-webpack-plugin
webpack4 mode = production默认使用- WebpackBar
- webpack-bundle-analyzer
- clean-webpack-plugin 清除dist文件夹里会残留上次打包的文件
- 废弃插件
ExtractTextWebpackPlugin 拆分css样式的插件(webapck4已废弃)。由于webpack4以后对css模块支持的逐步完善和commonchunk插件的移除,
在处理css文件提取的计算方式上也做了些调整,之前我们首选使用的extract-text-webpack-plugin也完成了其历史使命,
将让位于mini-css-extract-plugin。
6. devServer
webpack的devServer配置基于webpack-dev-server集成的插件。该插件提供了proxy代理配置,基于express中间件 http-proxy-middleware实现,该中间件又基于node http-proxy,
devServer: { |
举个完整例子:
const path = require('path'); |