最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

通過babel操作AST精準插入配置代碼全流程

 更新時間:2022年02月08日 09:42:32   作者:廈門在乎科技  
這篇文章主要為大家介紹了通過babel操作AST精準插入配置代碼的全流程,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步

babel修改js配置文件實現(xiàn)原理

像那些js配置文件,里面可能有很多的非配置代碼,而且一次可能要修改好幾個文件

比如我們在前端項目,要插入一個頁面,需要修改router、menus等配置文件,還要手動拷貝頁面模板等等

這些高重復機械化操作,人工修改非常容易出錯

我們可以直接用babel來操作AST抽象語法樹,通過工程化去精準修改。讓babel去幫我們找到指定位置,并正確插入配置代碼。我們在做工程化開發(fā)的時候,經(jīng)常會用到babel去操作AST。

首先我們了解一下什么是AST

AST,抽象語法樹(Abstract Syntax Tree)它是源代碼語法結(jié)構(gòu)的一種抽象表示。它以樹狀的形式表現(xiàn)編程語言的語法結(jié)構(gòu)。

我們使用babel來轉(zhuǎn)化和操作AST,主要分為三個步驟:解析(parser)、轉(zhuǎn)換(traverse)、生成(generator)

操作AST三大階段

如下圖,如果我們想通過babel,在配置文件里面插入一段配置代碼,應該怎么實現(xiàn)呢

解析(parser)

第一步:讀取配置文件代碼,并生成AST抽象語法樹

let configJsData = fs.readFileSync(configJsPath, "utf8");

然后將配置文件代碼生成AST抽象語法樹

const parser = require("@babel/parser");
?
let configJsTree = parser.parse(`${configJsData}`,{
? ? sourceType: "module",
? ? plugins: [
? ? ? "jsx",
? ? ? "flow",
? ? ],
? });

configJsTree就是我們的AST了

加上sourceType: "module"這個配置屬性,是為了讓babel支持解析export和import

轉(zhuǎn)換(traverse)

轉(zhuǎn)換(traverse)階段,就是要遍歷整個AST抽象語法樹,找到指定的位置,然后插入對應的配置代碼。

代碼如下:

const traverse = require("@babel/traverse").default;
 
traverse(configJsTree, {
    ObjectProperty(path) {
      // 插入配置文件代碼
    },
  });

我們使用@babel/traverse的traverse方法進行遍歷整個AST

其中ObjectProperty的作用是在遍歷AST過程中,識別出所有的Object對象,因為我們是要將配置代碼插入一個Object對象,所以使用的是ObjectProperty。如果要將配置插入數(shù)組中,就使用ArrayExpression。

然后我們開始進行配置代碼的插入,將代碼

{
  key: "testPath",
  icon: HomeOutlined,
  exact: true,
}

插入如下的位置

我們需要在traverseObjectProperty進行位置的查找和代碼插入

首先我們要找到key: 'home'的位置 

代碼如下:

traverse(configJsTree, {
    ObjectProperty(path) {
      if ( path.node.key.name === "key" && path.node.value.value === "home" ) {
        // 這就是 key: 'home'的位置
      }
    },
  });

通過path.node.key.namepath.node.value.value找到對象屬性為key并且對象值為home的Object對象

找到位置后開始插入代碼

traverse(configJsTree, {
    ObjectProperty(path) {
      // 搜索并識別出配置文件里key: "home" 這個object對象位置
      if ( path.node.key.name === "key" && path.node.value.value === "home" ) {
        path.parent.properties.forEach(e=>{
          if ( e.key.name === "children" ) {
           // 找到children屬性
          }
        })
      }
    },
  });

通過path.parent.properties找到對象的父級,然后遍歷父級下的所有屬性,找到children這個屬性。這就是我們要插入的位置。

接下來我們要構(gòu)造要插入的數(shù)據(jù)

{
   key: "testPath",
   icon: HomeOutlined,
   exact: true,
}

構(gòu)造數(shù)據(jù)的代碼如下:

const t = require("@babel/types");
const newObj = t.objectExpression([
    t.objectProperty(
      t.identifier("key"),
      t.stringLiteral("testPath")
    ),
    t.objectProperty(
      t.identifier("icon"),
      t.identifier("HomeOutlined")
    ),
    t.objectProperty(
      t.identifier("exact"),
      t.booleanLiteral(true)
    ),
  ]);

可以看到用dentifier來標識對象的屬性,用stringLiteral標識字符串數(shù)據(jù),booleanLiteral標識boolean值,這些類型都可以在@babel/types查詢到。

最后一步,將構(gòu)造好的數(shù)據(jù)插入:

e.value.elements.push(newObj)

完成~!

將所有 traverse 階段代碼匯總起來如下:

const traverse = require("@babel/traverse").default;
const t = require("@babel/types");
 
traverse(configJsTree, {
    ObjectProperty(path) {
      // 搜索并識別出配置文件里key: "home" 這個object對象位置
      if ( path.node.key.name === "key" && path.node.value.value === "home" ) {
        path.parent.properties.forEach(e=>{
          if ( e.key.name === "children" ) {
            const newObj = t.objectExpression([
              t.objectProperty(
                t.identifier("key"),
                t.stringLiteral("testPath")
              ),
              t.objectProperty(
                t.identifier("icon"),
                t.identifier("HomeOutlined")
              ),
              t.objectProperty(
                t.identifier("exact"),
                t.booleanLiteral(true)
              ),
            ]);
            e.value.elements.push(newObj)
          }
        })
      }
    },
  });

生成(generator)

這個階段就是把AST抽象語法樹反解,生成我們常規(guī)的代碼

const generate = require("@babel/generator").default;
const result = generate(configJsTree, { jsescOption: { minimal: true } }, "").code;
fs.writeFileSync(resultPath, result);

通過@babel/generator將AST抽象代碼語法樹反解回原代碼,jsescOption: { minimal: true }配置是為了解決中文為unicode亂碼的問題。

至此咱們就完成了對js配置文件插入代碼,最終結(jié)果如下:

以上就是通過babel操作AST,然后精準插入配置代碼的全流程。

更多關(guān)于babel操作AST插入配置的資料請關(guān)注腳本之家其它相關(guān)文章!

相關(guān)文章

  • JS實現(xiàn)跟隨鼠標立體翻轉(zhuǎn)圖片的方法

    JS實現(xiàn)跟隨鼠標立體翻轉(zhuǎn)圖片的方法

    這篇文章主要介紹了JS實現(xiàn)跟隨鼠標立體翻轉(zhuǎn)圖片的方法,涉及javascript操作圖片翻轉(zhuǎn)的相關(guān)技巧,非常具有實用價值,需要的朋友可以參考下
    2015-05-05
  • JavaScript語言中的Literal Syntax特性分析

    JavaScript語言中的Literal Syntax特性分析

    JavaScript語言中的Literal Syntax特性分析...
    2007-03-03
  • js實現(xiàn)base64、url和blob之間相互轉(zhuǎn)換的3種方式舉例

    js實現(xiàn)base64、url和blob之間相互轉(zhuǎn)換的3種方式舉例

    在JavaScript中將圖片的絕對路徑轉(zhuǎn)換為base64字符串或blob對象,是常見的圖片上傳前的預處理步驟,這篇文章主要介紹了js實現(xiàn)base64、url和blob之間相互轉(zhuǎn)換的3種方式,需要的朋友可以參考下
    2025-04-04
  • JavaScript中運算符與數(shù)組擴展詳細講解

    JavaScript中運算符與數(shù)組擴展詳細講解

    這篇文章主要介紹了JavaScript中運算符與數(shù)組擴展方法,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習吧
    2022-11-11
  • JavaScript事件機制的剖析與優(yōu)化詳解

    JavaScript事件機制的剖析與優(yōu)化詳解

    在現(xiàn)代前端開發(fā)中,JavaScript事件處理是一個至關(guān)重要的部分,它能夠使網(wǎng)頁與用戶交互,實現(xiàn)豐富的交互體驗,然而,對JavaScript事件機制的深入理解是開發(fā)者成為優(yōu)秀前端工程師的關(guān)鍵所在,本文將全面剖析JavaScript事件機制,需要的朋友可以參考下
    2023-12-12
  • JavaScript實現(xiàn)的商品搶購倒計時功能示例

    JavaScript實現(xiàn)的商品搶購倒計時功能示例

    這篇文章主要介紹了JavaScript實現(xiàn)的商品搶購倒計時功能,可實現(xiàn)分秒級別的實時顯示倒計時效果,涉及js日期時間計算與頁面元素動態(tài)操作相關(guān)技巧,需要的朋友可以參考下
    2017-04-04
  • 10個在JavaScript開發(fā)中常遇到的BUG

    10個在JavaScript開發(fā)中常遇到的BUG

    給大家詳細著整理了在JavaScript開發(fā)中大家經(jīng)常遇到的BUG和問題,需要的朋友參考學習下吧。
    2017-12-12
  • 微信小程序之仿微信漂流瓶實例

    微信小程序之仿微信漂流瓶實例

    這篇文章主要介紹了微信小程序之仿微信漂流瓶實例,非常具有實用價值,需要的朋友可以參考下。
    2016-12-12
  • ajax中g(shù)et和post的說明及使用與區(qū)別

    ajax中g(shù)et和post的說明及使用與區(qū)別

    對付亂碼我都是用過濾器做字符編碼過濾的,Get方法過濾器監(jiān)聽不到,所以我一直喜歡使用Post方法,下面對Ajax Get和Post方法做一對比,需要了解的朋友可以 參考下
    2012-12-12
  • 純前端使用插件pdfjs實現(xiàn)將pdf轉(zhuǎn)為圖片的步驟

    純前端使用插件pdfjs實現(xiàn)將pdf轉(zhuǎn)為圖片的步驟

    這篇文章主要介紹了純前端使用插件pdfjs實現(xiàn)將pdf轉(zhuǎn)為圖片的步驟,在實現(xiàn)過程中遇到了跨域問題,后臺設置跨域但前端配置無效,最終采用后臺返回PDF的base64格式,通過PDF.js將base64轉(zhuǎn)換為二進制數(shù)據(jù)加載PDF,需要的朋友可以參考下
    2025-01-01

最新評論

大埔区| 平顶山市| 女性| 瑞安市| 龙门县| 清河县| 肥乡县| 榆社县| 闸北区| 霍州市| 庄浪县| 蓝山县| 阿勒泰市| 卓资县| 和硕县| 青浦区| 乡宁县| 成都市| 镇平县| 绥滨县| 武宣县| 黑龙江省| 横峰县| 璧山县| 台山市| 大厂| 怀远县| 辰溪县| 长乐市| 富川| 印江| 吴忠市| 图木舒克市| 东阳市| 灵石县| 黄石市| 炎陵县| 永川市| 台湾省| 包头市| 巴林左旗|