webpack优化配置之oneOf

4,072 阅读1分钟

oneOf一般用法

module的oneOf配置提高loader匹配效率,使用方法如下,匹配到一个loader后,后面的就不会再继续匹配了。

module:{
  rules:[
    {
      test:/\.js$/,
      exclude:/node_modules/,
      // //优先执行
      enforce:'pre',
      loader:'eslint-loader',
      options:{
        fix:true
      }
    },
    {
      //下面的loader只会匹配一个,处理性能更好
      //注意:不能有两个配置处理同一种类型文件
      oneOf:[
        {
          test:/\.css$/,
          use:[...commenCssLoader]
        },
        {
          test:/\.less$/,
          use:[...commenCssLoader,'less-loader']
        },
      ]
    }
  ]
},

mini-css-extract-plugin使用oneOf

在维护一个支持react/vue框架的脚手架,需要mini-css-extract-plugin区分react和vue并提取样式文件

oneOf: [
  // 匹配`<style lang="css|sass|scss|less|styl">` in Vue components
  {
    // vue的trunk filenmae包含vue参数
    resourceQuery: /^\?vue/,
    use: [
      {
        loader: MiniCssExtractPlugin.loader,
        options: {
          publicPath: domain,
          esModule: false,
        }
      },
      {
        loader: 'css-loader',
        options: {
          importLoaders: 2,
          url: false
        }
      },
      'postcss-loader',
    ].concat(param)
  },
  
  // 处理react或者其他样式
  {
    use: [
      {
        loader: MiniCssExtractPlugin.loader,
        options: {
          publicPath: domain,
        }
      },
      {
        loader: 'css-loader',
        options: {
          importLoaders: 2,
          url: false
        }
      },
      'postcss-loader',
    ].concat(param)
  },

上例的区别是react将esModule设true,而vue则设置为false。esModule可以使的webpack支持tree shaking。

查看完整源码

源码项目,欢迎star