4

uglifyjsを使用して JavaScript 式を解析するには? 優れたライブラリですが、ドキュメントがないために理解が難しくなっています!

これらのリンクは私をある程度助けました。

今、私はこれが何をする必要があるかを知っています

  • 解析して AST を生成する
  • カスタム ウォークを作成する
  • AST を翻訳
  • コードを生成する
  • 生成コードの評価

これは正しいです?または何か不足していますか?

walker コードを使用した簡単な例は、非常に役に立ち、高く評価されます。

4

1 に答える 1

3

私はuglifyjsも初めてです。これは素晴らしいライブラリだと思いますが、適切なドキュメントや例が不足しています。私が非常に優れていると思う uglifyjs の用途の 1 つは、静的分析ツールの作成です。そのため、私が作成した小さなスクリプトを共有したいと思います。これは、js ファイルで、たとえばvar d=3;などの小さな名前を持つすべての変数を検索します。 これらの変数名はあまり説明的ではないため、大きなプログラムを維持するのが難しくなります。したがって、すべての変数名は3 文字以上にする必要があります。 もう少し興味深いことに、For..loops および For..in ループ内のカウンター変数を欠陥としてマークするべきではありません。

つまり、この smallVariables.js を作成できます。

var smallVariableNames = [];

function addBadVariableName(line,value){
    smallVariableNames.push(line + " "+value);
}

var UglifyJS = require("../tools/node"); //Please install node first
var parser = UglifyJS.parser             // Parse input.js file and create AST 
    , fs = require('fs')
    , filename = 'input.js';


var toplevel = UglifyJS.parse(String(fs.readFileSync(filename)));
var walker = new UglifyJS.TreeWalker(function(node){  //walk AST 
var statement = JSON.parse(JSON.stringify(node));

if  (node instanceof UglifyJS.AST_VarDef || node instanceof UglifyJS.AST_Constant) 

    {

    var parentForIn = walker.find_parent(UglifyJS.AST_ForIn); //in order to avoid init vars in for..in loops 
    var parentLoopVariable ="";
    if (parentForIn) {

        parentLoopVariable = JSON.parse(JSON.stringify(parentForIn));
        parentLoopVariable = parentLoopVariable["init"];
        parentLoopVariable = parentLoopVariable["definitions"];
        if (parentLoopVariable)
        parentLoopVariable = parentLoopVariable[0].name["end"].value;
    }
    var parentFor = walker.find_parent(UglifyJS.AST_For); //in order to avoid init vars in for loops 

    if (parentFor) {
         parentLoopVariable = JSON.parse(JSON.stringify(parentFor));
        parentLoopVariable = parentLoopVariable["init"];
        parentLoopVariable = parentLoopVariable["definitions"];
        if (parentLoopVariable)
            parentLoopVariable = parentLoopVariable[0].name["end"].value;
    }


        var expression = statement["name"];
        if (expression) {
            variableName = node.start.value
            if(variableName  && variableName.length < 3 && variableName !== parentLoopVariable)
                {
                    addBadVariableName(node.start.line,variableName); 
                }
        }


    }
});
toplevel.walk(walker);
for (line in smallVariableNames)
    console.log(smallVariableNames[line]);

簡単に言うと、このスクリプトは「input.js」ファイルを読み取り、解析し、ツリーまで歩いて、これらすべての小さな変数を見つけます。

これで、スクリプトをテストする方法ができました!! スクリプトをフォルダー %UGLIFY-JS%/test/ に保存しました。(node.js と uglify.js がインストールされている場合) 最も簡単な方法は、コマンドで実行することです: *node node_modules/uglify-js/test/smallVariables .js*

入力ファイルによっては、いくつかの行番号と小さな変数名が表示されます。このようにして、必要に応じて任意のルールを設定できます。AST ツリーは非常に強力なツールです。

また、次の記事が非常に役立つことがわかりました: http://lisperator.net/uglifyjs/walk

于 2013-03-04T12:36:57.880 に答える