多個 loader,但是每個文件只能匹配一個 loader,被一個 loader 處理,因此可以使用 oneOf 唯一匹配,不需要每個文件把所有的 loader 都詢問一遍,可以提高 loader 的執行效率
webpack.config.js:
const {resolve} = require('path')
const MiniCssExtractPlugin = require('mini-css-extract-plugin')
const OptimizeCssAssetsWebpackPlugin = require('optimize-css-assets-webpack-plugin')
const HtmlWebpackPlugin = require('html-webpack-plugin')
process.env.NODE_ENV = 'production'
//復用loader
const commonCssLoader = [
MiniCssExtractPlugin.loader,
'css-loader',
{
loader:'postcss-loader',
options:{
ident:'postcss',
plugins:()=>[require('postcss-preset-env')()]
}
}
]
module.exports={
entry:'./src/index.js',
output:{
filename:'bundle.js',
path:resolve(__dirname,'build')
},
module:{
rules:[
{
test: /\.js$/,
exclude: /node_modules/,
enforce: 'pre', //優先執行,正常的,一個文件只能被一個loader處理,當一個文件要被多個loader處理,
//一定要指定loader執行的先后順序,先執行eslint再執行babel
loader: 'eslint-loader',
options: {
fix: true
}
},
//以下loader中只會匹配一個,注意不能有兩個loader處理同一種類型文件,所以eslint-loader放在oneOf匹配之前執行
{
oneOf:[
{
test: /\.css$/,
use: [...commonCssLoader]
},
{
test: /\.less$/,
use: [...commonCssLoader]
},
{
test: /\.js$/,
exclude: /node_modules/,
loader: 'babel-loader',
options: {
presets: [
['@babel/preset-env', {
useBuiltIns: 'usage',
corejs: { version: 3 },
targets: {
chrome: '60',
firefox: '50'
}
}]
]
}
},
{
test: /\.(jpg|png|gif)$/,
loader: 'url-loader',
options: {
limit: 8 * 1024,
name: '[hash:10].[ext]',
outputPath: 'imgs',
esModule: false
}
},
{
test: /\.html$/,
loader: 'html-loader'
},
{
exclude: /\.(js|css|less|html|jpg|png|gif)$/,
loader: 'file-loader',
options: {
outputPath: 'media'
}
}
]
}
]
},
plugins:[
new MiniCssExtractPlugin({
filename:'bundle.css'
}),
new OptimizeCssAssetsWebpackPlugin(),
new HtmlWebpackPlugin({
template:'./src/index.html',
minify:{
collapseWhitespace:true,
removeComments:true
}
})
],
mode:'production'
