什么是 broccolo-tree-traverser
Broccoli-tree-traverser 是一个 NPM 包,它提供的是对 Broccoli 的树结构进行遍历的模块。Broccoli 是一个基于文件系统的构建工具,但是在要对项目进行 Builder 时,需要我们对整个项目生成一颗树,才可以进行各种操作。而这颗树也是我们以后会频繁操作到的。
安装方法
npm install broccoli-tree-traverser --save-dev
如何遍历树
使用 broccoli-tree-traverser 进行遍历的方法非常简单,它只提供了一个函数 accept(tree, visitor),可以传入一个木头结构和一个访问者的函数。在访问者函数中,定义节点被访问的行为。当访问者遍历到一个节点时,只要调用一下 accept(Node, visitor) 就可以遍历到当前节点的子树。这样递归进行就能遍历整个树了。因为遍历是传入 Visitor,所以 Visitor 的返回值可以决定是否需要遍历子树或是停止遍历。
const traverser = require('broccoli-tree-traverser') traverser.accept(tree, visitor)
-- -------------------- ---- ------- -- -------- ----- --------- - ---------------------------------- ----- -- - -------------- ----- ---- - ---------------- -- ------------------ -------- --------------- - ---------------------------- ------ ----- - -- ----- ----- ---- - - --------- ---- --------- - - --------- ---- --------- - - --------- ------ --------- - - --------- -------- --------- - - --------- ---------- --------- - - --------- ------------ ---------- ----------- ----------- ----------- ------------ ----- - - - - - - -- - --------- -------- --------- -- - - -- - --------- -------- --------- - - --------- ------------ --------- -- - - -- - - -- ------------------ ---------------------- -----------
遍历的同时修改节点
Broccoli-tree-traverser 在遍历时,可以同时进行节点的修改,在遍历访问者的拓展接口上,它还提供了一个 enter 函数,可以在进入节点时进行修改。同时,还可以用 leave 函数,在离开节点时进行修改。node 的最终状态,就是 enter 和 leave 函数重写后的结果。
-- -------------------- ---- ------- -- -------- ----- --------- - ---------------------------------- ----- -- - -------------- ----- ---- - ---------------- -- ------------------ -------- --------------- - ---------------------------- ------ ----- - -- ---------------------------------- -------- ------------- - -------------- -- ------- ------ ----- - -------- ------------- - --------------- -- ------- ------ ----- - -- ----- ----- ---- - - --------- ---- --------- - - --------- ---- --------- - - --------- ------ --------- - - --------- -------- --------- - - --------- ---------- --------- - - --------- ------------ ---------- ----------- ----------- ----------- ------------ ----- - - - - - - -- - --------- -------- --------- -- - - -- - --------- -------- --------- - - --------- ------------ --------- -- - - -- - - -- ---------------- ---------------------- ---------- - ------ -------- ------ ------- --- -------------------------------- ----- ---
遍历子树,或是跳过子树的某个节点
在被访问者回调的同时,返回一个 boolean 值。如果返回 true,那么会访问子树,之后进入子树会存在一个遍历的指针;如果返回 false,那么将不会访问子树。如果使用 async/runinng.run 抛出异常,则遍历将被立即跳出。
-- -------------------- ---- ------- -- -------- ----- --------- - ---------------------------------- ----- -- - -------------- ----- ---- - ---------------- -- ------------------ -------- --------------- - ---------------------------- ------ ----- - -- ----- ----- ---- - - --------- ---- --------- - - --------- ---- --------- - - --------- ------ --------- - - --------- -------- --------- - - --------- ---------- --------- - - --------- ------------ ---------- ----------- ----------- ----------- ------------ ----- - - - - - - -- - --------- -------- --------- -- - - -- - --------- -------- --------- - - --------- ------------ --------- -- - - -- - - -- ------------------ -- ------------------------------------ ------ -------- ----------------------- - ---------------------------- -- ---------------- --- ---------- - ------ ------ - ------ ----- - ---------------------- -------------------
总结
以上就是 broccoli-tree-traverser 的使用教程。通过简单的示例,我们了解了它在树的结构里,提供的遍历方法以及节点修改的方法,这都是在 Broccoli Builder 这样的复杂构建器中非常有用的工具。再次强调,Broccoli-tree-traverser 是一个非常不错的 NPM 包,可供开发者参考及使用。
来源:JavaScript中文网 ,转载请注明来源 https://www.javascriptcn.com/post/60066c89ccdc64669dde5183