[Vue CLI 3] 插件解析之 @vue/cli-plugin-babel

本文我們來看一下官方的這個 @vue/cli-plugin-babel

先看一下源碼文件:

generator.js
index.js

核心的有 2 個文件廓奕,我們主要第一個 index.js古涧,最外層結(jié)構(gòu)多是插件式的標(biāo)準(zhǔn)結(jié)構(gòu):

module.exports = (api, options) => {
  // ...
}

這里因為我們要擴展 webpack 的配置擦囊,所以使用了:api.chainWebpack

api.chainWebpack(webpackConfig => {
  // ...
})

我們先執(zhí)行 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罐呼、 ruletest

注意這里的 rulejs冤议,也就是我們之前 vue inspect 用到的

const jsRule = webpackConfig.module
      .rule('js')
        .test(/\.jsx?$/)

2、配置 exclude

通過 add 方法

.exclude
  .add(filepath => {
    // ...
  })
  .end()

具體的函數(shù):

  • /.vue.jsx?$/
  • options.transpileDependencies

返回 false

這里的 transpileDependencies 是在 vue.confg.js 中配置的停巷,開發(fā)者可以自行配置

  • /node_modules/
  • cliServicePath

返回 true

if (/\.vue\.jsx?$/.test(filepath)) {
  return false
}
// exclude dynamic entries from cli-service
const 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 transpile
if (options.transpileDependencies.some(dep => filepath.match(dep))) {
  return false
}
// Don't transpile node_modules
return /node_modules/.test(filepath)

3、配置 use

.use('cache-loader')
  .loader('cache-loader')
  .options()
  .end()

4榕栏、根據(jù)條件判斷是否增加 thread-loader

條件如下:用戶在 vue.config.js 中是否配置了 parallel 而且要是 production 環(huán)境

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')
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末畔勤,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子扒磁,更是在濱河造成了極大的恐慌庆揪,老刑警劉巖,帶你破解...
    沈念sama閱讀 211,376評論 6 491
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件妨托,死亡現(xiàn)場離奇詭異缸榛,居然都是意外死亡吝羞,警方通過查閱死者的電腦和手機,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,126評論 2 385
  • 文/潘曉璐 我一進店門内颗,熙熙樓的掌柜王于貴愁眉苦臉地迎上來钧排,“玉大人,你說我怎么就攤上這事均澳『蘖铮” “怎么了?”我有些...
    開封第一講書人閱讀 156,966評論 0 347
  • 文/不壞的土叔 我叫張陵找前,是天一觀的道長糟袁。 經(jīng)常有香客問我,道長躺盛,這世上最難降的妖魔是什么项戴? 我笑而不...
    開封第一講書人閱讀 56,432評論 1 283
  • 正文 為了忘掉前任,我火速辦了婚禮槽惫,結(jié)果婚禮上肯尺,老公的妹妹穿的比我還像新娘。我一直安慰自己躯枢,他們只是感情好则吟,可當(dāng)我...
    茶點故事閱讀 65,519評論 6 385
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著锄蹂,像睡著了一般氓仲。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上得糜,一...
    開封第一講書人閱讀 49,792評論 1 290
  • 那天敬扛,我揣著相機與錄音,去河邊找鬼朝抖。 笑死啥箭,一個胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的治宣。 我是一名探鬼主播急侥,決...
    沈念sama閱讀 38,933評論 3 406
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼侮邀!你這毒婦竟也來了坏怪?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 37,701評論 0 266
  • 序言:老撾萬榮一對情侶失蹤绊茧,失蹤者是張志新(化名)和其女友劉穎铝宵,沒想到半個月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體华畏,經(jīng)...
    沈念sama閱讀 44,143評論 1 303
  • 正文 獨居荒郊野嶺守林人離奇死亡鹏秋,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 36,488評論 2 327
  • 正文 我和宋清朗相戀三年尊蚁,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片侣夷。...
    茶點故事閱讀 38,626評論 1 340
  • 序言:一個原本活蹦亂跳的男人離奇死亡横朋,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出惜纸,到底是詐尸還是另有隱情叶撒,我是刑警寧澤,帶...
    沈念sama閱讀 34,292評論 4 329
  • 正文 年R本政府宣布耐版,位于F島的核電站祠够,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏粪牲。R本人自食惡果不足惜古瓤,卻給世界環(huán)境...
    茶點故事閱讀 39,896評論 3 313
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望腺阳。 院中可真熱鬧落君,春花似錦、人聲如沸亭引。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,742評論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽焙蚓。三九已至纹冤,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間购公,已是汗流浹背萌京。 一陣腳步聲響...
    開封第一講書人閱讀 31,977評論 1 265
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留宏浩,地道東北人知残。 一個月前我還...
    沈念sama閱讀 46,324評論 2 360
  • 正文 我出身青樓,卻偏偏與公主長得像比庄,于是被迫代替她去往敵國和親求妹。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 43,494評論 2 348

推薦閱讀更多精彩內(nèi)容