簡體   English   中英

使用解析器從javascript中提取私有函數

[英]Extract private function from javascript using parser

我試圖使用解析器(通過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 `sum` function
ast.print(stream)
console.log(stream+'')

b.js內容

var addRandom = (function() {
    function sum(x, y) {
        return x + y
    };

    return function (input) {
        return sum(input, Math.random());
    };
})();

運行node 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'),
    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);

b.js內容

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}
var UglifyJS = require('uglify-js');
var code = require('fs').readFileSync('b.js').toString();
var stream = UglifyJS.OutputStream({});
var toplevel = UglifyJS.parse(code);
var walker = new UglifyJS.TreeWalker(function(node){
    if (node instanceof UglifyJS.AST_Defun) {
        node.print(stream);
    }
});

toplevel.walk(walker);
console.log(stream + '');

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM