編寫一個簡單的babel插件

編寫一個模塊按需加載的babel插件

當我們導入lodash中指定的工具函數(shù)時 會將整個lodash打包進來

import {flattenDeep, chunk} from 'lodash'

換成按需引入的寫法 但是這樣寫有些麻煩 我們想由上面寫法 自動分解為下面寫法 所以我們就編寫一個babel插件

import flattenDeep from 'lodash/flattenDeep'
import chunk from 'lodash/chunk'

Install package

npm i babel-core -D
npm i babel-types -D

插件編寫

在當前工程的node_modules下創(chuàng)建一個babel-plugin-extract目錄 里面創(chuàng)建index.js


const babel = require('babel-core');
const types = require('babel-types');

// 將import {flattenDeep, chunk} from 'lodash' 轉化為下面這種寫法:
// import flattenDeep from 'lodash/flattenDepp'
// import chunk from 'lodash/chunk'

// Babel將源碼轉換AST之后干旁,通過遍歷AST樹(其實就是一個js對象)焰薄,對樹做一些修改舵抹,然后再將AST轉成code疏唾,即成源碼痘系。
let visitor = {
    // import 語句解析時觸發(fā)該函數(shù)
    ImportDeclaration(path, ref = {opts: {}}) {  //path 語句抽象語法樹 opts 插件參數(shù)
        let node = path.node;
        let {specifiers} = node; // 導入的包的說明符 是個數(shù)組集合
        // 確認導入庫 是否是 .babelrc library屬性指定庫 以及 如果不是默認導入 才進行按需導入加載
        if (ref.opts.library === node.source.value && !types.isImportDefaultSpecifier(specifiers[0])) {
            let newImports = specifiers.map(specifier => ( // 遍歷 出導入的每個包的說明描述符
                types.importDeclaration([types.importDefaultSpecifier(specifier.local)],
                // 生成import語句如 import chunk from 'lodash/chunk'
                types.stringLiteral(`${node.source.value}/${specifier.local.name}`))
            ));

            // 將原有語句寫法替換掉 新寫法
           path.replaceWithMultiple(newImports);
        }
    }
}

module.exports = function(babel) { // 將插件導出
    return {visitor} // 屬性名固定為visitor
};

配置.babelrc

{
    "presets": [
        "env",
        "stage-0"
    ],
    "plugins": [
        [
            "extract", // 配置插件
            {
                "library": "lodash" // 指定處理的庫
            }
        ]
    ]
}

build

npm run build // 此時編譯后的bundle.js變小了

源碼地址

先npm install 然后將源碼目錄中babel-plugin-extract目錄 挪到 node_modules下易核,npm run build
babel-plugin-extract

參考

剖析Babel
Babel 插件開發(fā)指南
Babel 從零入門
Babel plugin
AST 抽象語法樹在線轉換
babel-types

最后編輯于
?著作權歸作者所有,轉載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末励堡,一起剝皮案震驚了整個濱河市翩隧,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌姻蚓,老刑警劉巖,帶你破解...
    沈念sama閱讀 207,113評論 6 481
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件匣沼,死亡現(xiàn)場離奇詭異狰挡,居然都是意外死亡,警方通過查閱死者的電腦和手機,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,644評論 2 381
  • 文/潘曉璐 我一進店門加叁,熙熙樓的掌柜王于貴愁眉苦臉地迎上來倦沧,“玉大人,你說我怎么就攤上這事它匕≌谷冢” “怎么了?”我有些...
    開封第一講書人閱讀 153,340評論 0 344
  • 文/不壞的土叔 我叫張陵豫柬,是天一觀的道長告希。 經(jīng)常有香客問我,道長烧给,這世上最難降的妖魔是什么燕偶? 我笑而不...
    開封第一講書人閱讀 55,449評論 1 279
  • 正文 為了忘掉前任,我火速辦了婚禮础嫡,結果婚禮上指么,老公的妹妹穿的比我還像新娘。我一直安慰自己榴鼎,他們只是感情好伯诬,可當我...
    茶點故事閱讀 64,445評論 5 374
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著巫财,像睡著了一般盗似。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上翁涤,一...
    開封第一講書人閱讀 49,166評論 1 284
  • 那天桥言,我揣著相機與錄音,去河邊找鬼葵礼。 笑死枝笨,一個胖子當著我的面吹牛,可吹牛的內(nèi)容都是我干的拳球。 我是一名探鬼主播集畅,決...
    沈念sama閱讀 38,442評論 3 401
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼届谈!你這毒婦竟也來了枯夜?” 一聲冷哼從身側響起,我...
    開封第一講書人閱讀 37,105評論 0 261
  • 序言:老撾萬榮一對情侶失蹤艰山,失蹤者是張志新(化名)和其女友劉穎湖雹,沒想到半個月后,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體曙搬,經(jīng)...
    沈念sama閱讀 43,601評論 1 300
  • 正文 獨居荒郊野嶺守林人離奇死亡摔吏,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 36,066評論 2 325
  • 正文 我和宋清朗相戀三年鸽嫂,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片征讲。...
    茶點故事閱讀 38,161評論 1 334
  • 序言:一個原本活蹦亂跳的男人離奇死亡据某,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出诗箍,到底是詐尸還是另有隱情癣籽,我是刑警寧澤,帶...
    沈念sama閱讀 33,792評論 4 323
  • 正文 年R本政府宣布滤祖,位于F島的核電站筷狼,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏氨距。R本人自食惡果不足惜桑逝,卻給世界環(huán)境...
    茶點故事閱讀 39,351評論 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望俏让。 院中可真熱鬧楞遏,春花似錦、人聲如沸首昔。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,352評論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽勒奇。三九已至预鬓,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間赊颠,已是汗流浹背格二。 一陣腳步聲響...
    開封第一講書人閱讀 31,584評論 1 261
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留竣蹦,地道東北人顶猜。 一個月前我還...
    沈念sama閱讀 45,618評論 2 355
  • 正文 我出身青樓,卻偏偏與公主長得像痘括,于是被迫代替她去往敵國和親长窄。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 42,916評論 2 344

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

  • GitChat技術雜談 前言 本文較長纲菌,為了節(jié)省你的閱讀時間挠日,在文前列寫作思路如下: 什么是 webpack,它要...
    蕭玄辭閱讀 12,674評論 7 110
  • 版權聲明:本文為博主原創(chuàng)文章郑原,未經(jīng)博主允許不得轉載唉韭。 webpack介紹和使用 一夜涕、webpack介紹 1犯犁、由來 ...
    it筱竹閱讀 11,028評論 0 21
  • 前言 搭一個腳手架真不是一件容易的事,之前為了學習webpack是怎么配置的選擇自己搭建開發(fā)環(huán)境女器,折騰了好幾天總算...
    大柚子08閱讀 22,342評論 24 40
  • 目錄第1章 webpack簡介 11.1 webpack是什么酸役? 11.2 官網(wǎng)地址 21.3 為什么使用 web...
    lemonzoey閱讀 1,731評論 0 1
  • 這很奇怪,在擁擠的房子里驾胆,一個人會如此的孤獨涣澡。而在這漫無邊際的寂寞空間中,卻有被包圍的幸福丧诺。 蟹蟹看到最后的每一個人入桂。?
    瀟楠Sara閱讀 886評論 24 25