美文网首页
webpack优化系列-oneOf

webpack优化系列-oneOf

作者: 小李不小 | 来源:发表于2021-02-20 14:16 被阅读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',指定优先执行

    相关文章

      网友评论

          本文标题:webpack优化系列-oneOf

          本文链接:https://www.haomeiwen.com/subject/oypgzhtx.html