国产xxxx99真实实拍_久久不雅视频_高清韩国a级特黄毛片_嗯老师别我我受不了了小说

資訊專欄INFORMATION COLUMN

Babel插件開發入門示例詳解

Muninn / 1967人閱讀

摘要:的工作過程的處理主要過程解析轉換生成。代碼轉換處理,處理工具插件等就是在這個階段進行代碼轉換,返回新的。若感興趣了解更多內容,插件中文開發文檔提供了很多詳細資料。

Babel簡介

Babel是Javascript編譯器,是種代碼到代碼的編譯器,通常也叫做『轉換編譯器』。

Babel的工作過程

Babel的處理主要過程:解析(parse)、轉換(transform)、生成(generate)。

代碼解析
詞法分析和語法分析構造AST。

代碼轉換
處理AST,處理工具、插件等就是在這個階段進行代碼轉換,返回新的AST。

代碼生成
遍歷AST,輸出代碼字符串。

所以我們需要對AST有一定了解才能進行Babel插件開發。

AST

在這整個過程中,都是圍繞著抽象語法樹(AST)來進行的。在Javascritp中,AST,簡單來說,就是一個記錄著代碼語法結構的Object。感興趣的同學可到https://astexplorer.net/ 去深入體驗
比如下面的代碼:

import {Button} from "antd";

import Card from "antd/button/lib/index.js";

轉換成AST后如下,

{
  "type": "Program",
  "start": 0,
  "end": 253,
  "body": [
    {
      "type": "ImportDeclaration",
      "start": 179,
      "end": 207,
      "specifiers": [
        {
          "type": "ImportSpecifier",
          "start": 187,
          "end": 193,
          "imported": {
            "type": "Identifier",
            "start": 187,
            "end": 193,
            "name": "Button"
          },
          "local": {
            "type": "Identifier",
            "start": 187,
            "end": 193,
            "name": "Button"
          }
        }
      ],
      "source": {
        "type": "Literal",
        "start": 200,
        "end": 206,
        "value": "antd",
        "raw": ""antd""
      }
    },
    {
      "type": "ImportDeclaration",
      "start": 209,
      "end": 253,
      "specifiers": [
        {
          "type": "ImportDefaultSpecifier",
          "start": 216,
          "end": 220,
          "local": {
            "type": "Identifier",
            "start": 216,
            "end": 220,
            "name": "Card"
          }
        }
      ],
      "source": {
        "type": "Literal",
        "start": 226,
        "end": 252,
        "value": "antd/button/lib/index.js",
        "raw": ""antd/button/lib/index.js""
      }
    }
  ],
  "sourceType": "module"
}
插件開發思路

確定我們需要處理的節點類型

處理節點

返回新的節點

簡單插件結構

插件必須是一個函數,根據官方文檔要求,形式如下:

module.exports = function ({ types: t }) {
    return {
        visitor: {
            ImportDeclaration(path, source){
                //todo
            },
            FunctionDeclaration(path, source){
                //todo
            },
        }    
    }
}

types來自@babel/types工具類,主要用途是在創建AST的過程中判斷各種語法的類型和節點構造。

實現示例

很多同學用過 babel-plugin-import ,它幫助我們在使用一些JS類庫是達到按需加載。其實,該插件幫助我們做了如下代碼轉換:

//from
import {Button } from "antd";

//to
import Button from "antd/es/button";
import "antd/es/button/style.css"; 

我們先看看兩者的AST有何差別,以幫助我們對轉換有個清晰的認識:

轉換前:

 
[{
      "type": "ImportDeclaration",
      "start": 6,
      "end": 45,
      "specifiers": [
        {
          "type": "ImportSpecifier",
          "start": 14,
          "end": 20,
          "imported": {
            "type": "Identifier",
            "start": 14,
            "end": 20,
            "name": "Button"
          },
          "local": {
            "type": "Identifier",
            "start": 14,
            "end": 20,
            "name": "Button"
          }
        }
      ],
      "source": {
        "type": "Literal",
        "start": 28,
        "end": 44,
        "value": "antd/es/button",
        "raw": ""antd/es/button""
      }
    }]
    

轉換后:

 [{
  "type": "ImportDeclaration",
  "start": 5,
  "end": 41,
  "specifiers": [
    {
      "type": "ImportDefaultSpecifier",
      "start": 12,
      "end": 18,
      "local": {
        "type": "Identifier",
        "start": 12,
        "end": 18,
        "name": "Button"
      }
    }
  ],
  "source": {
    "type": "Literal",
    "start": 24,
    "end": 40,
    "value": "antd/es/button",
    "raw": ""antd/es/button""
  }
},
{
  "type": "ImportDeclaration",
  "start": 46,
  "end": 76,
  "specifiers": [],
  "source": {
    "type": "Literal",
    "start": 53,
    "end": 75,
    "value": "antd/es/button/style",
    "raw": ""antd/es/button/style""
  }
}]

對比兩棵樹,我們應該有個大致的思路。在轉換過程中,我們還需要一些參數,這些參數在配置文件(package.json或者.babelrc)中,提供了一些自定義配置,比如antd的按需加載:

["import",{libraryName:"antd",libraryDireactory:"es","style":"css"}]

現在我們開始嘗試實現這個插件吧:

module.exports = function ({ types: t }) {
return {
    visitor: {
        ImportDeclaration(path, source) {
            
            //取出參數
            const { opts: { libraryName, libraryDirectory="lib", style="css" } } = source;
            //拿到老的AST節點
            let node = path.node

            if(node.source.value !== libraryName){
                return;
            }
            //創建一個數組存入新生成AST
            let newImports = [];
            //構造新節點
            path.node.specifiers.forEach(item => {
                newImports.push(t.importDeclaration([t.importDefaultSpecifier(item.local)], t.stringLiteral(`${libraryName}/${libraryDirectory}/${item.local.name}`)));
                newImports.push(t.importDeclaration([], t.stringLiteral(`${libraryName}/${libraryDirectory}/style.${style}`)))
            });
            //替換原節點
            path.replaceWithMultiple(newImports);                
        }
    }
}

}

現在,簡單版本的@babel-plugin-import的babel插件我們已經完成了。
若感興趣了解更多內容,babel插件中文開發文檔提供了很多詳細資料。

文章版權歸作者所有,未經允許請勿轉載,若此文章存在違規行為,您可以聯系管理員刪除。

轉載請注明本文地址:http://specialneedsforspecialkids.com/yun/106485.html

相關文章

  • Babel 快速入門

    摘要:快速體驗安裝依賴新建文件夾,在命令行里進入該文件夾,并執行如下命令生成文件是內置的一個,可通過命令行操作來編譯文件。入門為了確保轉換后的代碼能正常的運行,最好在代碼之前引入這是一個實現了部分特性的包。參考中文網入門 簡介 Babel 是一個 JavaScript 編譯器,可將我們代碼中的 ES6 語法轉換為 ES5 的語法,使我們的代碼能在不支持 ES6 語法的環境中正常運行。配合一些...

    NoraXie 評論0 收藏0
  • Babel入門插件開發

    摘要:最近的技術項目里大量用到了需要修改源文件代碼的需求,也就理所當然的用到了及其插件開發。在這里我要推薦一款實現了這些標簽的插件,建議在你的項目中加入這個插件并用起來,不用再艱難的書寫三元運算符,會大大提升你的開發效率。具體可以參見插件手冊。 最近的技術項目里大量用到了需要修改源文件代碼的需求,也就理所當然的用到了Babel及其插件開發。這一系列專題我們介紹下Babel相關的知識及使用。 ...

    Jinkey 評論0 收藏0
  • 前端文檔收集

    摘要:系列種優化頁面加載速度的方法隨筆分類中個最重要的技術點常用整理網頁性能管理詳解離線緩存簡介系列編寫高性能有趣的原生數組函數數據訪問性能優化方案實現的大排序算法一怪對象常用方法函數收集數組的操作面向對象和原型繼承中關鍵詞的優雅解釋淺談系列 H5系列 10種優化頁面加載速度的方法 隨筆分類 - HTML5 HTML5中40個最重要的技術點 常用meta整理 網頁性能管理詳解 HTML5 ...

    jsbintask 評論0 收藏0
  • 前端文檔收集

    摘要:系列種優化頁面加載速度的方法隨筆分類中個最重要的技術點常用整理網頁性能管理詳解離線緩存簡介系列編寫高性能有趣的原生數組函數數據訪問性能優化方案實現的大排序算法一怪對象常用方法函數收集數組的操作面向對象和原型繼承中關鍵詞的優雅解釋淺談系列 H5系列 10種優化頁面加載速度的方法 隨筆分類 - HTML5 HTML5中40個最重要的技術點 常用meta整理 網頁性能管理詳解 HTML5 ...

    muddyway 評論0 收藏0

發表評論

0條評論

最新活動
閱讀需要支付1元查看
<