假设我们有一些 JavaScript es 模块作为文本
const ESMText = "export const answer = 42;"
我检查了 ECMAScript documents,
export
的逻辑相当复杂,有没有一种简单的方法可以找到所有导出而不执行它或实现几乎完整的规范词法分析东西(分词器等...)?
应该在浏览器中使用 JavaScript(也许是 wasm)完成
应该提到:显然使用现有解析器解析文件是正确的答案,但问题的重点是找到一种有点棘手的方法来做到这一点
使用正则表达式可以轻松完成,但有两种我无法处理的极端情况:
// destructuring assignment
export const { name1, name2: bar } = o;
export const [ name1, name2 ] = array;
//simultaneous declaration and assignment
export const name1 = 1, name2 = 2/*, … */;
也许有人会想出一些东西
有许多 JavaScript 解析器:acorn、esprima、Babel 等。您最好的选择可能是使用其中之一。
https://astexplorer.net/ 可让您试验不同的解析器以查看它们生成的抽象语法树。
是的,您可以使用像
esprima
这样的js解析器并提取导出的名称。
像下面的例子:
const esprima = require('esprima');
function getExportedNames(jsCode) {
const parsedCode = esprima.parseScript(jsCode, { sourceType: 'module' });
const exportedNames = parsedCode.body.filter(node => node.type === 'ExportNamedDeclaration')
.map(exportNode => exportNode.specifiers.map(spec => spec.exported.name))
.reduce((acc, curr) => acc.concat(curr), []);
return exportedNames;
}
const ESMText = "export const answer = 42;export function foo() {}"
const exportedNames = getExportedNames(ESMText);
console.log(exportedNames); // output: ['answer', 'foo']