多個 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'