dolymood / webpack-transform-modules-plugin

webpack transform modules plugin

Geek Repo:Geek Repo

Github PK Tool:Github PK Tool

updateVueLoaderOptions 方法没有考虑 jsConf 是一个对象

easonyq opened this issue · comments

当前情况

lib/lindex.js 的 100 行 开始,分别判断了 jsConf 可能的取值类型,包括 undefinedstring。但是实际上 jsConf 还可能是 object 类型的。

预期效果

jsConf 应该存在对象类型的判断,因为如果我的配置方法是:

module: {
  rules: [
    {
      test: /\.vue$/,
      loader: 'vue-loader',
      options: {
        loaders: {
          js: {
            loader: 'babel-loader',
            options: {...} // babel-loader 的配置项
          }
        }
      }
    }
  ]
}

这样就会报错:jsConf.push is not a function,因为默认 jsConf 是一个数组。

之所以这么配置,是有些开发者不使用 .babelrc 来配置 babel,而是用配置项。当然为啥不用 .babelrc,我也不知道……

解决方案

var jsConf = conf.options.loaders.js
if (!jsConf) {
  jsConf = conf.options.loaders.js = []
} else if (typeof jsConf === 'string') {
  if (jsConf === 'babel-loader') {
    // reset
    jsConf = conf.options.loaders.js = []
  } else {
    jsConf = conf.options.loaders.js = [
      {
        loader: jsConf
      }
    ]
  }
-}
+} else if (typeof jsConf === 'object' && jsConf.loader === 'babel-loader') {
+  jsConf = conf.options.loaders.js = []
+}

确切的说应该是下面这样的代码,因为上面的修改把已有的 babel-loader 的配置弄没了,最终的目的是给 babel-loader 的plugins 里添加 babel-plugin-transform-modules

if (typeof jsConf === 'object' && jsConf.loader === 'babel-loader') {
  jsConf.plugins = jsConf.plugins || []
  jsConf.plugins.push(['babel-plugin-transform-modules', transformModules])
} else {
  jsConf.push({
    loader: 'babel-loader',
    options: {
      plugins: [
        ['babel-plugin-transform-modules', transformModules]
      ]
    }
  })
}

0.4.1 released.