成人国产在线小视频_日韩寡妇人妻调教在线播放_色成人www永久在线观看_2018国产精品久久_亚洲欧美高清在线30p_亚洲少妇综合一区_黄色在线播放国产_亚洲另类技巧小说校园_国产主播xx日韩_a级毛片在线免费

資訊專欄INFORMATION COLUMN

Babylon-AST初探-代碼更新&刪除(Update & Remove)

levius / 3158人閱讀

摘要:操作通常配合來完成。因為是個數(shù)組,因此,我們可以直接使用數(shù)組操作自我毀滅方法極為簡單,找到要刪除的,執(zhí)行就結(jié)束了。如上述代碼,我們要刪除屬性,代碼如下到目前為止,的我們都介紹完了,下面一篇文章以轉(zhuǎn)小程序為例,我們來實戰(zhàn)一波。

??通過前兩篇文章的介紹,大家已經(jīng)了解了CreateRetrieve,我們接著介紹UpdateRemove操作。Update操作通常配合Create來完成。我們這篇文章主要介紹幾個常用的NodePath`APIreplace、insert、remove`。具體也可以看babel-handbook中的Manipulation章節(jié)。

replaceWith 使用新的節(jié)點進(jìn)行替換 將加法運(yùn)算替換成乘法
const code = `const c = a + b`
const ast = babylon.parse(code)

traverse(ast, {
  BinaryExpression(path) {
    // 注意這里要有判斷,否則會無限進(jìn)入`BinaryExpression`
    // https://stackoverflow.com/questions/37539432/babel-maximum-call-stack-size-exceeded-while-using-path-replacewith
    if (path.node.operator === "+") {
      path.replaceWith(t.binaryExpression("*", path.node.left, path.node.right))
    }
  }
})

console.log(generate(ast, {}, code).code) // const c = a * b;
this.count替換為this.data.count

??轉(zhuǎn)換前后的AST展示如下圖:

??我們需要做的是,找到符合this.countThisExpression,然后把它替換為this.data

const code = `this.count`
const ast = babylon.parse(code)

traverse(ast, {
  MemberExpression(path) {
    if (
      t.isThisExpression(path.node.object) &&
      t.isIdentifier(path.node.property, {
        name: "count"
      })
    ) {
      path
        .get("object")    // 獲取`ThisExpresssion`
        .replaceWith(
          t.memberExpression(t.thisExpression(), t.identifier("data"))
        )
    }
  }
})
console.log(generate(ast, {}, code).code) // this.data.count;
replaceWithSourceString 直接使用代碼替換

??上個例子中將this.count替換為this.data.count的部分,通過t.memberExpression可以構(gòu)造node。更簡單的操作可以直接使用replaceWithSourceString,個人覺得這個API很好用。

path.get("object").replaceWithSourceString("this.data")
插入操作

??插入是樹操作的一種常見操作。子節(jié)點是個Array,前、中、后各種位置都可以插入新節(jié)點。下面來介紹下pushContainerunshiftContainer、insertBefore、insertAfter操作。

??這里以給obj對象新增一個屬性myprop: "hello my property"為例:

const code = `
const obj = {
  count: 0,
  message: "hello world"
}
`
const ast = babylon.parse(code)

const property = t.objectProperty(
  t.identifier("myprop"),
  t.stringLiteral("hello my property")
)
pushContainer 父節(jié)點的操作

??父節(jié)點為子節(jié)點Array插入一個node

traverse(ast, {
  ObjectExpression(path) {
    path.pushContainer("properties", property)
  }
})
insertAfter 兄弟節(jié)點的操作

??insertAfter也可以完成上述操作,需要找到message屬性,然后在后面插入node就搞定啦

traverse(ast, {
  ObjectProperty(path) {
    if (
      t.isIdentifier(path.node.key, {
        name: "message"
      })
    ) {
      path.insertAfter(property)
    }
  }
})

??unshiftContainerinsertBefore與上面兩個相對應(yīng),這里不再舉例了,大家可以自己試一試。

??因為properties是個數(shù)組,因此,我們可以直接使用數(shù)組操作

traverse(ast, {
  ObjectExpression(path) {
    // path.pushContainer("properties", property)
    path.node.properties.push(property)
  }
})
Remove 自我毀滅

??Remove方法極為簡單,找到要刪除的NodePath,執(zhí)行Remove就結(jié)束了。如上述代碼,我們要刪除message屬性,代碼如下:

traverse(ast, {
  ObjectProperty(path) {
    if (
      t.isIdentifier(path.node.key, {
        name: "message"
      })
    ) {
      path.remove()
    }
  }
})

到目前為止,AST的CURD我們都介紹完了,下面一篇文章以vue轉(zhuǎn)小程序為例,我們來實戰(zhàn)一波。

文章版權(quán)歸作者所有,未經(jīng)允許請勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。

轉(zhuǎn)載請注明本文地址:http://systransis.cn/yun/107868.html

相關(guān)文章

  • Babylon-AST初探-代碼查詢(Retrieve)

    摘要:針對語法樹節(jié)點的查詢操作通常伴隨著和這兩種方法見下一篇文章。注意上述代碼打印出的和中的并不完全一致。如函數(shù),在中的為,但其實際的為。這個大家一定要注意哦,因為在我們后面的實際代碼中也有用到。 ??在上一篇文章中,我們介紹了AST的Create。在這篇文章中,我們接著來介紹AST的Retrieve。??針對語法樹節(jié)點的查詢(Retrieve)操作通常伴隨著Update和Remove(這兩...

    wangdai 評論0 收藏0
  • Babylon-AST初探-實戰(zhàn)

    摘要:生成屬性這一步,我們要先提取原函數(shù)中的的對象。所以這里我們還是主要使用來訪問節(jié)點獲取第一級的,也就是函數(shù)體將合并的寫法用生成生成生成插入到原函數(shù)下方刪除原函數(shù)程序輸出將中的屬性提升一級這里遍歷中的屬性沒有再采用,因為這里結(jié)構(gòu)是固定的。 ??經(jīng)過之前的三篇文章介紹,AST的CRUD都已經(jīng)完成。下面主要通過vue轉(zhuǎn)小程序過程中需要用到的部分關(guān)鍵技術(shù)來實戰(zhàn)。 下面的例子的核心代碼依然是最簡單...

    godiscoder 評論0 收藏0
  • Insert Delete GetRandom O(1) & Duplicates allo

    摘要:思路可以實現(xiàn)時間復(fù)雜度的和,但是要求也是,只用是不可以的。但是在里面查找的時間復(fù)雜度依然是,可以想到用來記錄對應(yīng)的,這樣查找的時間也是常數(shù)。用可以保持順序,但是的時間復(fù)雜度是。 380. Insert Delete GetRandom O(1) Design a data structure that supports all following operations in aver...

    2shou 評論0 收藏0
  • Python+Pygame實操之玩命吃水果游戲的完成

      吃豆人和削蘋果這兩個游戲想必大家都知道吧,本文運(yùn)用Python里的Pygame控制模塊編寫出一個融合吃豆人+切水果的新手游:玩命吃蘋果,有興趣的話可以認(rèn)識一下  引言  哈哈哈!木木子今天浮現(xiàn)——早已來給大家看了不少具體內(nèi)容啦~  涉及到的人工智能、新手、網(wǎng)絡(luò)爬蟲、數(shù)據(jù)統(tǒng)計分析(這一塊的通常但是審批)手機(jī)游戲...  PS:  吃豆人我寫過了哈  Python+Pygame實戰(zhàn)之吃豆豆游戲的實...

    89542767 評論0 收藏0
  • LRU & LFU Cache

    摘要:首先要做到是,能想到的數(shù)據(jù)結(jié)構(gòu)只有兩三種,一個是,一個是,是,還有一個,是。不太可能,因為長度要而且不可變,題目也沒說長度固定??梢宰龅胶投际?。因為還有函數(shù),要可以,所以還需要一個數(shù)據(jù)結(jié)構(gòu)來記錄順序,自然想到。 LRU Cache 題目鏈接:https://leetcode.com/problems... 這個題要求O(1)的復(fù)雜度。首先要做到get(key)是O(1),能想到的數(shù)據(jù)結(jié)...

    wenshi11019 評論0 收藏0

發(fā)表評論

0條評論

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