2012-09-05 64 views
4

如何使用uglifyjs解析JavaScript表達式?雖然一個優秀的圖書館,缺乏文檔使其更難以理解!如何使用uglifyjs/uglifyjs2解析步行和評估javascript表達式

這些鏈接在一定程度上對我有所幫助。

現在我知道這是需要做

  • 解析生成AST
  • 創建自定義的自助遊
  • 翻譯AST
  • 什麼
  • 生成代碼
  • 評估和演示生成的代碼

這是正確的嗎?或者我錯過了什麼?

一個簡單的例子步行者代碼玩弄會更有益和讚賞

+0

散步,看看[此線索](http://stackoverflow.com/questions/5827612/node-js-fs-readdir -recursive目錄搜索) – Roshambo

回答

2

我也是新uglifyjs。 我認爲這是一個很好的圖書館,但它缺乏良好的文檔或示例。 我認爲非常好用的uglifyjs的一個用途是創建一個靜態分析工具。 因此,我想分享一個我寫的小腳本,它在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