updateVueLoaderOptions 方法没有考虑 jsConf 是一个对象
easonyq opened this issue · comments
当前情况
在 lib/lindex.js 的 100 行 开始,分别判断了 jsConf
可能的取值类型,包括 undefined
和 string
。但是实际上 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.