本文我们来看一下官方的这个 @vue/cli-plugin-babel
先看一下源码文件:
generator.jsindex.js
核心的有 2 个文件,我们主要第一个 index.js,最外层结构多是插件式的标准结构:
module.exports = (api, options) => { // ...}这里因为我们要扩展 webpack 的配置,所以使用了:api.chainWebpack
api.chainWebpack(webpackConfig => { // ...})我们先执行 vue inspect --rule js 看一下最终生成的配置:
/* config.module.rule('js') */{ test: /\.jsx?$/, exclude: [ function () { /* omitted long function */ }
], use: [ /* config.module.rule('js').use('cache-loader') */
{ loader: 'cache-loader', options: { cacheDirectory: '/Users/***/node_modules/.cache/babel-loader', cacheIdentifier: '2f4347b9'
}
}, /* config.module.rule('js').use('babel-loader') */
{ loader: 'babel-loader'
}
]
}对照着这个我们来写相对会简单一点:
1、配置 module、 rule 和 test
注意这里的 rule 是 js,也就是我们之前 vue inspect 用到的
const jsRule = webpackConfig.module
.rule('js')
.test(/\.jsx?$/)2、配置 exclude
通过 add 方法
.exclude
.add(filepath => { // ...
})
.end()具体的函数:
/.vue.jsx?$/
options.transpileDependencies
返回 false
这里的
transpileDependencies是在vue.confg.js中配置的,开发者可以自行配置
/node_modules/
cliServicePath
返回 true
if (/\.vue\.jsx?$/.test(filepath)) { return false}// exclude dynamic entries from cli-serviceconst cliServicePath = require('path').dirname(require.resolve('@vue/cli-service'))if (filepath.startsWith(cliServicePath)) { return true}// check if this is something the user explicitly wants to transpileif (options.transpileDependencies.some(dep => filepath.match(dep))) { return false}// Don't transpile node_modulesreturn /node_modules/.test(filepath)3、配置 use
.use('cache-loader')
.loader('cache-loader')
.options()
.end()4、根据条件判断是否增加 thread-loader
条件如下:用户在 vue.config.js 中是否配置了 parallel 而且要是 production 环境
const useThreads = process.env.NODE_ENV === 'production' && options.parallel
还是用 .user 和 .loader
if (useThreads) {
jsRule
.use('thread-loader')
.loader('thread-loader')
}最后追加了一个 babel-loader
jsRule
.use('babel-loader')
.loader('babel-loader')
作者:dailyvuejs
链接:https://www.jianshu.com/p/19fa9a369666
随时随地看视频