babel是一個轉碼器,目前開發(fā)react、vue項目都要使用到它。它可以把es6+的語法轉換為es5,也可以轉換JSX等語法。
成都創(chuàng)新互聯(lián)公司成立與2013年,先為赤城等服務建站,赤城等地企業(yè),進行企業(yè)商務咨詢服務。為赤城企業(yè)網站制作PC+手機+微官網三網同步一站式服務解決您的所有建站問題。我們在項目中都是通過配置插件和預設(多個插件的集合)來轉換特定代碼,例如env、stage-0等。
實際上babel可以通過自定義插件的方式實現任何代碼的轉換,接下來我們通過一個“把es6的 class
轉換為es5”的例子來了解一下babel。
內容如下:
webpack環(huán)境配置
大家應該都配置過babel-core這個loader,它的作用是提供babel的核心Api,實際上我們的代碼轉換都是通過插件來實現的。
接下來我們不用第三方的插件,自己實現一個es6類轉換插件。先執(zhí)行以下幾步初始化一個項目:
如果我們的插件名字想叫transform-class,需要在webpack配置中做如下配置:
接下來我們在node_modules中新建一個babel-plugin-transform-class的文件夾來寫插件的邏輯(如果是真實項目,你需要編寫這個插件并發(fā)布到npm倉庫),如下圖:
紅色區(qū)域是我新建的文件夾,它上面的是一個標準的插件的項目結構,為了方便我只寫了核心的index.js文件。
如何編寫bable插件
babel插件其實是通過AST(抽象語法樹)實現的。
babel幫助我們把js代碼轉換為AST,然后允許我們修改,最后再把它轉換成js代碼。
那么就涉及到兩個問題:js代碼和AST之間的映射關系是什么?如何替換或者新增AST?
好,先介紹一個工具:astexplorer.net:
這個工具可以把一段代碼轉換為AST:
如圖,我們寫了一個es6的類,然后網頁的右邊幫我們生成了一個AST,其實就是把每一行代碼變成了一個對象,這樣我們就實現了一個映射。
再介紹一個文檔: babel-types :
這是創(chuàng)建AST節(jié)點的api文檔。
比如,我們想創(chuàng)建一個類,先到astexplorer.net中轉換,發(fā)現類對應的AST類型是 ClassDeclaration
。好,我們去文檔中搜索,發(fā)現調用下面的api就可以了:
創(chuàng)建其他語句也是一樣的道理,有了上面這兩個東西,我們可以做任何轉換了。
下面我們開始真正編寫一個插件,分為以下幾步:
class
對應的AST節(jié)點為 ClassDeclaration
ClassDeclaration
,意思是我要捕獲js代碼中所有 ClassDeclaration
節(jié)點module.exports = function ({ types: t }) { return { visitor: { ClassDeclaration(path) { //在這里完成轉換 } } }; }
另外有需要云服務器可以了解下創(chuàng)新互聯(lián)scvps.cn,海內外云服務器15元起步,三天無理由+7*72小時售后在線,公司持有idc許可證,提供“云服務器、裸金屬服務器、高防服務器、香港服務器、美國服務器、虛擬主機、免備案服務器”等云主機租用服務以及企業(yè)上云的綜合解決方案,具有“安全穩(wěn)定、簡單易用、服務可用性高、性價比高”等特點與優(yōu)勢,專為企業(yè)上云打造定制,能夠滿足用戶豐富、多元化的應用場景需求。