介绍
ESprima是一个用JavaScript编写的ECMAScript解析器,其目标是支持ECMAScript 5.1+。esprimaq则是对于Esprima做了进一步扩展的版本,主要增加了诸如支持newline-tolerant indentations,propagating parenthesis, auto semicolon insertion等功能。
本文主要介绍如何在前端开发中使用npm包esprimaq以及如何应用其相关功能。
安装
使用npm安装即可:
npm install esprimaq
用法
解析JavaScript代码
esprimaq.parse()方法可以解析JavaScript代码并生成AST(Abstract Syntax Tree)对象。
var esprima = require('esprimaq'); var code = 'var a = 1;'; var ast = esprima.parse(code); console.log(ast);
解析出来的ast可以方便我们进行静态代码分析或者生成代码等操作。
处理newline-tolerant indentations
esprimaq会自动处理newline-tolerant indentations,我们可以使用其中的源代码:
var esprimaq = require('esprimaq'); var code = 'if (a \n === 5) \n\n {\n console.log("Indented code");\n};'; var ast = esprimaq.parse(code); console.log(code); console.log(ast.body[0].test);
输出为:
if (a === 5) { console.log("Indented code"); };
代码中if、==、左右括号之间的空行被略过了。看到的输出应该是这样的:
-- -------------------- ---- ------- - ------- ------------------- ----------- ------ ------- - ------- ------------- ------- --- -- -------- - ------- ---------- -------- -- ------ --- - -
处理propagating parenthesis
ESprimaQ会自动处理propagating parenthesis:
var esprimaq = require('esprimaq'); var code = 'console.log(["abc","def", \n "g",].length);'; var ast = esprimaq.parse(code); console.log(ast.body[0].expression.arguments[0].elements.length);
解析出来的AST对象:
-- -------------------- ---- ------- - ------- ----------------- --------- - ------- ------------------- ----------- ------ --------- - ------- ------------- ------- --------- -- ----------- - ------- ------------- ------- ----- - -- ------------ - - ------- ------------------- ----------- ------ --------- - ------- ------------------ ----------- - - ------- ---------- -------- ------ ------ --------- -- - ------- ---------- -------- ------ ------ --------- -- - ------- ---------- -------- ---- ------ ------- - - -- ----------- - ------- ------------- ------- -------- - - - -
处理auto semicolon insertion
esprimaq可以处理auto semicolon insertion:
var esprimaq = require('esprimaq'); var code = 'var x = 5\nconsole.log(x)'; var ast = esprimaq.parse(code); console.log(ast.body);
解析出来的AST对象:
-- -------------------- ---- ------- - - ------- ---------------------- -------- -- ------ -- --------------- - - ------- --------------------- -------- -- ------ -- ----- - ------- ------------- -------- -- ------ -- ------- --- -- ------- - ------- ---------- -------- -- ------ -- -------- -- ------ --- - - -- ------- ----- -- - ------- ---------------------- -------- --- ------ --- ------------- - ------- ----------------- -------- --- ------ --- --------- - ------- ------------------- -------- --- ------ --- ----------- ------ --------- - ------- ------------- -------- --- ------ --- ------- --------- -- ----------- - ------- ------------- -------- --- ------ --- ------- ----- - -- ------------ - - ------- ------------- -------- --- ------ --- ------- --- - - - - -
这便是auto semicolon insertion的奇妙,逐一分析代码后我们会发现,console.log(x)之前是没有分号的。但是在解释js时,auto semicolon insertion会将需要分号的地方自动加上分号,最终解析器的输出也有分号。
总结
esprimaq是ESprima的扩展版本,增加了newline-tolerant indentations, propagating parenthesis, auto semicolon insertion等功能。在前端开发中,我们可以使用esprimaq解析代码,并进行处理,充分发掘esprimaq的功能,优化代码的编写,提高代码质量。
来源:JavaScript中文网 ,转载请注明来源 https://www.javascriptcn.com/post/59711