2016-02-11 85 views
0

雖然JavaScript註釋點(事實上,在一般評論)是他們由編譯器解析,我想知道是否有實際讀取使用JavaScript註釋的方式 - 即閱讀JavaScript註釋

/* Hello, world! */ 
function readComment() { 
    alert(readsTheCommentSomehow()) //Would alert "Hello, World!" 
} 

類似這樣的用例可能類似於Javadoc,或者像獲取代碼以更改它依賴於其上方註釋的更酷的東西。我相信還有其他理由也想要這樣做。

到目前爲止,我已經考慮過這樣做的唯一途徑是通過實際(不知)讓JavaScript的閱讀自己的代碼,由之類的東西/*\n//*/拆分並返回意見的方式。

這真的是解決這個問題的最好方法,還是我錯過了什麼?

+0

唯一的辦法是加載文件作爲文本並編寫您自己的解析器。 – epascarello

回答

2

評論被編譯器解析(然後丟棄)。提供解析器的許多工具(如esprimaBabel)公開了哪些中間階段(抽象語法樹),哪些是can be used to extra comments

當代碼是執行時,註釋已被丟棄,以及其他任何不會影響代碼運行的實際內容。

有很多JS文檔工具(如JSDoc),它們使用註釋來提供文檔並簡單地將它們從解析中獲取,通常不需要執行代碼。一旦你有一個解析器可以產生帶有註釋節點的AST,你可以走這棵樹並將註釋與下面的節點聯繫起來。

請注意,空白通常在註釋之前被丟棄,或者如果可以的話,完全被解析器忽略(這在JS中與ASI更加困難)。

0

您可以使用AST分析器和像babel這樣的轉換器來讀取和更改代碼。以下是關於如何根據您的意見讀取和改變遊碼簡單,簡單的例子:http://astexplorer.net/#/5ezZ2lwYHQ

原代碼:

// does something 
// and other stuff 
function doSomething() { 
    console.log('hello'); 
} 

通天AST變壓器:

export default function ({types: t}) { 
    return { 
    visitor: { 
     FunctionDeclaration(path) { 
     if (path.node.leadingComments) { 
      const text = path.node.leadingComments.map(comment => comment.value).join('\n'); 
      const change = t.expressionStatement(
      t.callExpression(
       t.memberExpression(t.identifier('console'), t.identifier('log')), 
       [ 
        t.stringLiteral(`Function has comments:${text}`) 
       ])); 

      path.node.body.body.unshift(change); 
     } 
     } 
    } 
    }; 
}