webpack优化系列-oneOf

2021-02-20  本文已影响0人  小李不小
优化点: 每个不同类型的文件在loader转换时,都会被命中,遍历module中rules中所有loader

配置如下:

const { resolve } = require('path');
const MiniCssExtractPlugin = require('mini-css-extract-plugin');
const HtmlWebpackPlugin = require('html-webpack-plugin');

// 定义nodejs环境变量:决定使用browserslist的哪个环境
process.env.NODE_ENV = 'production';

// 复用loader
const commonCssLoader = [
MiniCssExtractPlugin.loader,
'css-loader',
{
  // 还需要在package.json中定义browserslist
  loader: 'postcss-loader',
  options: {
    ident: 'postcss',
    plugins: () => [require('postcss-preset-env')()]
  }
}
];

module.exports = {
entry: './src/js/index.js',
output: {
  filename: 'js/built.js',
  path: resolve(__dirname, 'build')
},
module: {
  rules: [
    {
      // 在package.json中eslintConfig --> airbnb
      test: /\.js$/,
      exclude: /node_modules/,
      // 优先执行
      enforce: 'pre',
      loader: 'eslint-loader',
      options: {
        fix: true
      }
    },
    {
      // 以下loader只会匹配一个
      // 注意:不能有两个配置处理同一种类型文件
      oneOf: [
        {
          test: /\.css$/,
          use: [...commonCssLoader]
        },
        {
          test: /\.less$/,
          use: [...commonCssLoader, 'less-loader']
        },
        /*
          正常来讲,一个文件只能被一个loader处理。
          当一个文件要被多个loader处理,那么一定要指定loader执行的先后顺序:
            先执行eslint 在执行babel
        */
        {
          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: 'css/built.css'
  }),
  new HtmlWebpackPlugin({
    template: './src/index.html',
    minify: {
      collapseWhitespace: true,
      removeComments: true
    }
  })
],
mode: 'production'
};

注意:

使用oneOf 根据文件类型加载对应的loader,只要能匹配一个即可退出,
对于同一类型文件,比如处理js,如果需要多个loader,可以单独抽离js处理,确保oneOf里面一个文件类型对应一个loader
可以配置 enforce: 'pre',指定优先执行

上一篇下一篇

猜你喜欢

热点阅读