從git克隆uglifyjs2源碼后,進入目錄:
npm link
編譯並安裝uglifyjs2成功,就可以直接調用uglifyjs命令了。但是在進行全局混淆時出現了問題,雖然指定了文件topvar.json為全局變量的cache文件,還是出現:
1)全局變量混淆后的名字與局部變量的混淆名沖突;
2)不同全局變量的混淆名沖突。
查閱文檔並做了一些測試,無奈都未成功。最終翻閱代碼並做如下改動:
1)在scope.js文件中修改SymbolDef.prototype.mangle函數:
1 // 為了避免混淆時TopLevel中的變量名與局部作用域中的變量名沖突, 對於Toplevel的變量增加前后綴雙下划線
2 if (this.scope instanceof AST_Toplevel) { 3 console.log(this.name + "=>" + this.mangled_name); 4 this.mangled_name = "__" + this.mangled_name + "__"; 5 }
對於全局變量的混淆,添加雙下划線前后綴,避免沖突。在這修改之后,在計算next_mangled_name時需要過濾掉已經使用過的全局符號。
2)在函數next_mangled_name函數中增加如下處理:
1 while (true) { 2 name = base54(++scope.cname); 3 // 雙下划線過濾
4 if (in_use['__' + name + '__'] || !is_identifier(name) || member(name, options.reserved)) continue; 5 if (!names[name]) break; 6 holes.push(scope.cname); 7 }
如此這般之后,全局變量混淆的問題才算是徹底解決。