
Security News
Browserslist-rs Gets Major Refactor, Cutting Binary Size by Over 1MB
Browserslist-rs now uses static data to reduce binary size by over 1MB, improving memory use and performance for Rust-based frontend tools.
managejs是使用nodejs编写的基于语法树的js源码分析操作工具。通过managejs,可以使用类似jQuery的操作方式来操作你的javascript源代码。
npm install managejs
npm test
var managejs = require('managejs');
var testStr = 'var a = function (m,n){}';
var rootNode = managejs.transfer(testStr);//return root node
var fnNodes = rootNode.find('FunctionExpression','a');
console.log(fnNodes.stringify());
//function (m,n){}
fnNodes.append('var test = "xxx"');
console.log(fnNodes.stringify());
//function (m,n){var test = "xxx"}
transfer
用于返回javascript源码的根节点find
使用语法树节点类型,还有对应的标识来查找节点append
用于往function里面注入一段代码javascript源码被词法语法分析后,会变成语法树。每个树节点对应一段源码。可以点此通过mozilla的文档了解。
如果不是很清楚一段源码的语法树结构,可以通过Esprima的在线解析器查看。
比如上面那段代码var a = function (m,n){}
解析成语法树为:
{
"type": "Program",
"body": [
{
"type": "VariableDeclaration",
"declarations": [
{
"type": "VariableDeclarator",
"id": {
"type": "Identifier",
"name": "a"
},
"init": {
"type": "FunctionExpression",
"id": null,
"params": [
{
"type": "Identifier",
"name": "m"
},
{
"type": "Identifier",
"name": "n"
}
],
"defaults": [],
"body": {
"type": "BlockStatement",
"body": []
},
"rest": null,
"generator": false,
"expression": false
}
}
],
"kind": "var"
}
]
}
managejs使用节点类型+标识符的方式来查找定位节点。之后这些节点会具有一系列的方法用于处理当前节点。并且支持链式操作可以继续在此节点的基础上往下查找。
选择器有四个查找函数:
param {string} type 语法树节点类型(ast type),所有SpiderMonkey支持的类型都可以。 https://developer.mozilla.org/en-US/docs/Mozilla/Projects/SpiderMonkey/Parser_API
param {string} reg 匹配的字符串,支持正则写法。
return {JsNodeList} 返回找到的节点集合对象
查找函数,通过(id)来查找。什么是当前节点的标识(id)呢?
var t = 表达式;
var a = {
t:表达式
};
t = 表达式;
//t就是当前表达式的标识(id)
function fnName(){};
//fnName就是当前表达式的标识
if(exp){}
while(exp){}
for(exp){}
//exp就是当前表达式的标识
example:
root = require('managejs').transfer("var test222 = 'xxxx'");
root.findById('Literal','test');
param {string} type 语法树节点类型(ast type)
param {string} reg 匹配的字符串,支持正则写法。
return {JsNodeList} 返回找到的节点集合对象
使用字符串匹配,会将当前节点解析成字符串进行查找
example:
root = require('managejs').transfer("var test222 = 'xxxx'");
root.findByString('Literal','xx');
param {string} type 语法树节点类型(ast type)
param {string} reg 匹配的字符串,支持正则写法。
return {JsNodeList} 返回找到的节点集合对象
查找函数,是findById与findByString的结合体,会先尝试使用findById查找,如果找不到,就使用字符串匹配查找。
example:
root = require('managejs').transfer("var test222 = 'xxxx'");
root.find('Literal','xx');
//sam as
root.find('Literal','test');
param {string} type 语法树节点类型(ast type)
param {function} fn 匹配的函数,函数返回值为true代表匹配成功,否则匹配失败。
return {JsNodeList} 返回找到的节点集合对象
自定义函数匹配,会将当前jsNode作为参数注入。
example
root = require('managejs').transfer("var test222 = 'xxxx'");
root.findById('Literal',function(jsNode){
console.log(jsNode.astObj) //抽象语法树节点
console.log(jsNode.stringify()) //将当前节点解析为字符串
console.log(jsNode.parentJsNode()) //父节点
return /xx/.test(jsNode.stringify()); //为true代表匹配成功
});
function (m,n){}
是一个FunctionExpression节点。我们通过标识a来最终找到这个节点。
查到到的对象都是JsNodeList的节点集合对象。可以通过一些函数来操作这些节点。
有些api是部分节点类型才支持的,有些是所有都支持的。
用于将一段javascript字符串 解析成一个JsNodeList对象
example
root = require('managejs').transfer("code");
root.stringify();
findById,findByString,find,findByFn,详见介绍章节选择器部分
解析当前节点生成源代码
example:
root = require('managejs').transfer("var test222 = 'xxxx'");
root.stringify(); //var test222 = 'xxxx'
获取当前节点所在的语句(statement)节点
example
root = require('managejs').transfer("var test222 = 'xxxx'");
root.findById('Literal','test*') // 'xx'
root.findById('Literal','test*').getCurrentStatement() //var test222 = 'xxxx'
example
root = require('managejs').transfer("var test222 = 'xxxx'");
root.findById('Literal','xx').replaceWith("'hahaha'"); //var test222 = 'hahaha'
下面的函数是只有语句类型的节点才能使用,包括函数声明等等。如果当前的节点不是语句类型的可以使用上面的getCurrentStatement获得父级语句节点。
example:
root = require('managejs').transfer("var a = 'xxxx';var b = 'xx'");
test = root.findById('Literal','a').getCurrentStatement()
root.findByString('VariableDeclaration','b').insertBefore(test)
example:
root = require('managejs').transfer("var a = 'xxxx';var b = 'xx'");
test = root.findById('Literal','a').getCurrentStatement()
root.findByString('VariableDeclaration','b').insertAfter(test)
Function包括 FunctionDeclaration,FunctionExpression。
example:
root = require('managejs').transfer("var a = function(m,n){}");
root.find('FunctionDeclaration','a').getParam(0).stringify();
//m
example:
root = require('managejs').transfer("var a = function(m,n){}");
root.find('FunctionDeclaration','a').addParam('x').stringify();
//x
root = require('managejs').transfer("var a = function(m,n){}");
root.find('FunctionDeclaration','a').allParam().stringify();
//mn
root = require('managejs').transfer("function test(a,b,c){}");
root.find('CallExpression','test').splice(1,1,'m').stringify();//m
example:
root = require('managejs').transfer("var a = function(m,n){var t = 0;}");
root.find('FunctionDeclaration','a').append('var test =1;').stringify();
root = require('managejs').transfer("var a = function(m,n){var t = 0;}");
root.find('FunctionDeclaration','a').prepend('var test =1;').stringify();
通过key获取值节点 example:
root = require('managejs').transfer("var a = {m:1,n:2}");
root.find('ObjectExpression','a').get(0).stringify();
//1
root = require('managejs').transfer("var a = {m:1,n:2}");
root.find('ObjectExpression','a').add('s','3');
root.find('ObjectExpression','a').get(-1).stringify();
//3
如果希望生成带引号的key或者value,可以add('"s"','3')。带引号的值会解析成Literal,否则会解析成Identifier。
root = require('managejs').transfer("var a = {m:1,n:2}");
root.find('ObjectExpression','a').add('s','3');
root.find('ObjectExpression','a').get(-1).stringify();
//3
root = require('managejs').transfer("var a = [1,2,3,4]");
root.find('ArrayExpression','a').get(-1).stringify();//4
root = require('managejs').transfer("var a = [1,2,3,4]");
root.find('ArrayExpression','a').splice(1,1,'4').stringify();//[1,4,3,4]
root = require('managejs').transfer("var a = [1,2,3,4]");
root.find('ArrayExpression','a').push('5');
root.find('ArrayExpression','a').get(-1).stringify();//5;
example:
root = require('managejs').transfer("if(a){}");
root.find('IfStatement','a').append('var test =1;').stringify();
root = require('managejs').transfer("if(a){}");
root.find('IfStatement','a').append('var test =1;').stringify();
example:
root = require('managejs').transfer("var a = test(m,n)");
root.find('CallExpression','a').get(-1).stringify();
//n
root = require('managejs').transfer("test(a,b,c)");
root.find('CallExpression','test').splice(1,1,'m');
root.find('CallExpression','test').stringify();//test(a,m,c)
MIT
FAQs
a lib let you use jquery style to manage javascript source code。
The npm package managejs receives a total of 1 weekly downloads. As such, managejs popularity was classified as not popular.
We found that managejs demonstrated a not healthy version release cadence and project activity because the last version was released a year ago. It has 1 open source maintainer collaborating on the project.
Did you know?
Socket for GitHub automatically highlights issues in each pull request and monitors the health of all your open source dependencies. Discover the contents of your packages and block harmful activity before you install or update your dependencies.
Security News
Browserslist-rs now uses static data to reduce binary size by over 1MB, improving memory use and performance for Rust-based frontend tools.
Research
Security News
Eight new malicious Firefox extensions impersonate games, steal OAuth tokens, hijack sessions, and exploit browser permissions to spy on users.
Security News
The official Go SDK for the Model Context Protocol is in development, with a stable, production-ready release expected by August 2025.