0

我正在開發一個開發工具,它可以爲我提供一些代碼指標。Babel插件 - 在靜態代碼分析後得到結構化信息作爲輸出

我想每進口值經過源文件和計數用法(#loc)的工具。

I.e.對於lodash,我想知道isEqualcloneDeep的用法。 我想有作爲輸出:

+------------+------------+---------+ 
| Library | Imported | #LOC | 
+------------+------------+---------+ 
| Lodash  | isEqual |  20| 
| Lodash  | cloneDeep |  4| 
+------------+------------+---------+ 

什麼應該被工具找到實例文件

1 // aFile.js 
2 import {isEqual, cloneDeep} from 'lodash' 
3 // some code .. 
4 if (isEqual(variableA, variableB)) { 
5 // ^^^^^^^ 
6 } 
7 let myClonedObject = cloneDeep(myObject); 
8 //     ^^^^^^^^^ 

我開始實施爲巴貝爾的插件,因爲我知道這會讓我容易

  • 解析代碼的可讀格式(AST)
  • 訪問一個LL的導入聲明
  • 得到相關文獻
  • 計算用途

當前實現

export default function({ types: t }) { 
    return { 
    visitor: { 
     ImportDeclaration(path, state) { 
     if(path.get('source').node.value === 'lodash') { 
      path.get('specifiers').forEach(function(specifier) { 
      if(specifier.node.imported) { 
       const importedIdentifierName = specifier.node.imported.name; 
       if(importedIdentifierName === 'isEqual') { 
       const isEqualLoc = new Set(); 
       const {referencePaths} = path.scope.getBinding(importedIdentifierName); 
       referencePaths.forEach(function(referencePath) { 
        isEqualLOC.add(referencePath.node.loc.start.line); 
       }); 
       console.log(isEqualLOC.size); 
       } 
      } 
      }); 
     } 
     } 
    } 
    }; 
}; 

對於這個工具,我只能做讀碼操作(沒有變換/生成)。

我的問題:我怎樣才能分享巴貝爾插件(LIB /進口/#LOC)到babel-cli命令或任何其他API的結果所產生的信息?

我想和console.log記錄的結果(與特定的ID),但在我看來,像一個解決方法。 我想知道是否有一些明確的API公開信息從巴貝爾插件。

回答

1

這似乎喜歡的事,可能會更好用巴貝爾的事業而建,而是你自己的基本實現。目前巴貝爾沒有提供任何輸出統計數據或任何東西的方法。你可以例如改變你的插件到一個腳本,如

const fs = require('fs'); 
const babylon = require('bablylon'); 
const traverse = require('babel-traverse'); 

const data = fs.readFileSync('./thing.js'); 
traverse(babylon.parse(data), { 
    ImportDeclaration(path) { 
    // ... 
    }, 
}); 

// Do whatever output you want here 
+0

它是有道理的,謝謝! 這是我從@thejameskyle也得到了反饋。 我會盡快嘗試,並相應地更新此答案。 –