webpack优化环境配置 - 20.oneOf
oneOf的作用
提升构建速度,避免每个文件都被所有loader过一遍,
因为任何一个文件,构建过程中,在遇到第一个与之对应的loader后,不会再往下进行。
在webpack.config.js 中配置 oneOf
1.文件结构

2.代码
webpack.config.js
const {resolve} = require('path')
const HtmlWebpackPlugin = require('html-webpack-plugin')
//提取 js 中的 css 成单独文件
const MiniCssExtractPlugin = require('mini-css-extract-plugin')
//压缩css
const OptimizeCssAssetsWebpackPlugin = require('optimize-css-assets-webpack-plugin')
// 定义nodejs环境变量:决定使用browserslist的哪个环境
process.env.NODE_ENV = 'production';
//复用 loader
const commonCssLoader = [
// 这个 loader 取代 style-loader。作用:提取js中的css成单独文件
//MiniCssExtractPlugin.loader 加载不了 less文件中的图片,记录一下坑,使用"style-loader"可以加载。。。
MiniCssExtractPlugin.loader,
//如果只使用loader的默认配置,就直接写字符串,会默认加载。
'css-loader',
// css兼容性处理
//如果要修改配置,就使用对象的形式
{
// 还需要在package.json中定义browserslist
loader: "postcss-loader",
options: {
ident: "postcss",
plugins: () => [
// postcss的插件
require('postcss-preset-env')()
]
}
}
]
module.exports = {
entry: './src/js/index.js',
output: {
filename: "js/built.js",
path: resolve(__dirname, "build")
},
module: {
rules: [
/*
但是,实际开发过程中,同样会有一个文件需要匹配多个loader的场景,
比如js文件同时需要eslint-loader和babel-loader,这样的话就不能将两个loader都放到oneOf里面,
因为一旦匹配了第一个loader就不会再继续执行第二个loader,解决办法也很简单,只需要放到oneOf外面即可。
*/
// js语法检查(eslint)
{
// 在package.json中eslintConfig --> airbnb
test: /\.js$/,
exclude: /node_modules/,
//当一个文件要被多个loader处理,添加 enforce: "pre",会被优先执行
enforce: "pre",
loader: "eslint-loader",
options: {
//自动修复eslint的错误
fix: true,
}
},
{
/*
在webpack对文件打包或者构建的时候,都会将rules里所有的规则都过一遍,这样会影响构建性能,
因为单个文件只会匹配rules里的单条规则,匹配上了就没必要继续匹配,所以这里就用到了oneOf来处理这个问题。
oneOf的作用
提升构建速度,避免每个文件都被所有loader过一遍,
因为任何一个文件,构建过程中,在遇到第一个与之对应的loader后,不会再往下进行。
*/
oneOf: [
{
test: /\.css$/,
use: [...commonCssLoader]
},
{
test: /\.less$/,
use: [...commonCssLoader, 'less-loader']
},
/*
正常来讲,一个文件只能被一个loader处理。
当一个文件要被多个loader处理,那么一定要指定loader执行的先后顺序:
先执行eslint 再执行babel
*/
//js兼容性处理
{
test: /\.js$/,
exclude: /node_modules/,
loader: "babel-loader",
options: {
presets: [
[
//@babel/preset-env: 基本js兼容性处理
'@babel/preset-env',
{
//按需处理
//按需加载
useBuiltIns: 'usage',
//指定 core-js 版本
corejs: {
version: 3
},
//指定兼容性做到哪个版本
targets: {
chrome: '60',
firefox: '60',
ie: '9',
safari: '10',
edge: '17'
}
}
]
]
}
},
// 打包图片资源
{
test: /\.(jpg|png|gif)$/,
loader: 'url-loader',
options: {
limit: 8 * 1024,
name: '[hash:10].[ext]',
outputPath: 'imgs',
esModule: false
}
},
// 打包html资源
{
test: /\.html$/,
loader: 'html-loader'
},
// 打包其它资源
{
exclude: /\.(js|css|less|html|png|jpg|gif)$/,
loader: "file-loader",
options: {
outputPath: "media"
}
}
]
}
]
},
plugins: [
//提取 js 中的 css 成单独文件
new MiniCssExtractPlugin({
//对输出文件名进行重命名
filename: 'css/built.css'
}),
//压缩 css
new OptimizeCssAssetsWebpackPlugin(),
new HtmlWebpackPlugin({
template: "./src/index.html",
//压缩 html 代码
minify: {
// 移除空格
collapseWhitespace: true,
// 移除注释
removeComments: true
}
})
],
mode: 'production'
}
end~


浙公网安备 33010602011771号