使用解析器从javascript中提取私有函数
我试图使用解析器(通过uglify js,但任何其他的都可以)从输入字符串中提取私有函数使用解析器从javascript中提取私有函数,javascript,uglifyjs,Javascript,Uglifyjs,我试图使用解析器(通过uglify js,但任何其他的都可以)从输入字符串中提取私有函数 a.js的内容 var UglifyJS = require('uglify-js'); var ast = UglifyJS.parse(require('fs').readFileSync('b.js').toString()); var stream = UglifyJS.OutputStream({}); // need to manipulate ast here to extract the
a.js的内容
var UglifyJS = require('uglify-js');
var ast = UglifyJS.parse(require('fs').readFileSync('b.js').toString());
var stream = UglifyJS.OutputStream({});
// need to manipulate ast here to extract the `sum` function
ast.print(stream)
console.log(stream+'')
var addRandom = (function() {
function sum(x, y) {
return x + y
};
return function (input) {
return sum(input, Math.random());
};
})();
var UglifyJS = require('uglify-js'),
fs = require('fs');
function showPrivates(file) {
var privates = {};
UglifyJS.parse(fs.readFileSync(file).toString('UTF-8')).walk(new UglifyJS.TreeWalker(function(node) {
if (node instanceof UglifyJS.AST_Defun) {
var stream = UglifyJS.OutputStream({});
node.print(stream);
privates[node.name.name] = stream.toString('UTF-8');
}
}));
return privates;
}
console.log(showPrivates('b.js').sum);
var addRandom = (function() {
function sum(x, y) {
return x + y;
};
function random(x) {
return Math.floor(Math.random()*x);
};
return function (input) {
return sum(input, random(10));
};
})();
b.js的内容
var UglifyJS = require('uglify-js');
var ast = UglifyJS.parse(require('fs').readFileSync('b.js').toString());
var stream = UglifyJS.OutputStream({});
// need to manipulate ast here to extract the `sum` function
ast.print(stream)
console.log(stream+'')
var addRandom = (function() {
function sum(x, y) {
return x + y
};
return function (input) {
return sum(input, Math.random());
};
})();
var UglifyJS = require('uglify-js'),
fs = require('fs');
function showPrivates(file) {
var privates = {};
UglifyJS.parse(fs.readFileSync(file).toString('UTF-8')).walk(new UglifyJS.TreeWalker(function(node) {
if (node instanceof UglifyJS.AST_Defun) {
var stream = UglifyJS.OutputStream({});
node.print(stream);
privates[node.name.name] = stream.toString('UTF-8');
}
}));
return privates;
}
console.log(showPrivates('b.js').sum);
var addRandom = (function() {
function sum(x, y) {
return x + y;
};
function random(x) {
return Math.floor(Math.random()*x);
};
return function (input) {
return sum(input, random(10));
};
})();
运行节点a.js
会产生
var fn=function(){function sum(x,y){return x+y}function addRandom(input){return sum(input,Math.random())}return{addRandom:addRandom}}();
。。。但是我需要在输出之前操作ast,以提取sum
函数。我想打印出来的是
function sum(x,y){return x+y}
如何在输出之前提取所需的AST树部分?结果表明,使用TreeWalker是可以管理的
a.js的内容
var UglifyJS = require('uglify-js');
var ast = UglifyJS.parse(require('fs').readFileSync('b.js').toString());
var stream = UglifyJS.OutputStream({});
// need to manipulate ast here to extract the `sum` function
ast.print(stream)
console.log(stream+'')
var addRandom = (function() {
function sum(x, y) {
return x + y
};
return function (input) {
return sum(input, Math.random());
};
})();
var UglifyJS = require('uglify-js'),
fs = require('fs');
function showPrivates(file) {
var privates = {};
UglifyJS.parse(fs.readFileSync(file).toString('UTF-8')).walk(new UglifyJS.TreeWalker(function(node) {
if (node instanceof UglifyJS.AST_Defun) {
var stream = UglifyJS.OutputStream({});
node.print(stream);
privates[node.name.name] = stream.toString('UTF-8');
}
}));
return privates;
}
console.log(showPrivates('b.js').sum);
var addRandom = (function() {
function sum(x, y) {
return x + y;
};
function random(x) {
return Math.floor(Math.random()*x);
};
return function (input) {
return sum(input, random(10));
};
})();
b.js的内容
var UglifyJS = require('uglify-js');
var ast = UglifyJS.parse(require('fs').readFileSync('b.js').toString());
var stream = UglifyJS.OutputStream({});
// need to manipulate ast here to extract the `sum` function
ast.print(stream)
console.log(stream+'')
var addRandom = (function() {
function sum(x, y) {
return x + y
};
return function (input) {
return sum(input, Math.random());
};
})();
var UglifyJS = require('uglify-js'),
fs = require('fs');
function showPrivates(file) {
var privates = {};
UglifyJS.parse(fs.readFileSync(file).toString('UTF-8')).walk(new UglifyJS.TreeWalker(function(node) {
if (node instanceof UglifyJS.AST_Defun) {
var stream = UglifyJS.OutputStream({});
node.print(stream);
privates[node.name.name] = stream.toString('UTF-8');
}
}));
return privates;
}
console.log(showPrivates('b.js').sum);
var addRandom = (function() {
function sum(x, y) {
return x + y;
};
function random(x) {
return Math.floor(Math.random()*x);
};
return function (input) {
return sum(input, random(10));
};
})();
。。。看看
console.log(showPrivates('b.js').sum);
// function sum(x,y){return x+y}
你想提取sum来在你的脚本中使用它吗?我想从源代码中提取私有函数作为字符串值来处理。保留原始格式对我来说并不重要。我希望能够提取私有实用程序函数,并通过将它们写入中间文件进行测试。在这个问题中,我特别想知道如何根据私有函数的名称从ast树中提取任意私有函数。@仇恨者请不要在否决投票时停下来,请随意在评论中表达您的蔑视,这样我们就可以了解您需要遍历ast的错误,但是,除了以下内容之外,我找不到任何关于节点对象的有用文档:@MinusFour,这是我已经看到的页面:)也许我需要使用一个不同的解析器/格式化程序来定制输出。我自己也得出了同样的结论。这是一个很好的简洁版本,与我在自己的答案中所说的差不多。控制台.log
应该在顶级.walk
调用之后,否则当有多个私有函数时,它将继续输出旧函数和新函数。