18

js ライブラリのビルド環境を整えようとしています。Web 上のレビューによると、UglifyJS は、NodeJSで動作する、最も優れた圧縮モジュールの 1 つと思われます。したがって、コードを縮小するための最も推奨される方法は次のとおりです。

var jsp = require("uglify-js").parser;
var pro = require("uglify-js").uglify;

var orig_code = "... JS code here";
var ast = jsp.parse(orig_code); // parse code and get the initial AST
ast = pro.ast_mangle(ast); // get a new AST with mangled names
ast = pro.ast_squeeze(ast); // get an AST with compression optimizations
var final_code = pro.gen_code(ast); // compressed code here

ここに見られるように、pro.ast_mangle(ast)変数名をマングルする必要がありますが、そうではありません。このパイプから得られるのは、スペースのない JavaScript コードだけです。最初は、自分のコードは圧縮用に最適化されていないと思っていましたが、Google Closureで試してみたところ、かなりの圧縮が得られました (変数名とすべてが壊れていました)。

UglifyJS の専門家、私が間違っていることへのヒントはありますか?

更新

実際のコードは大きすぎてここで参照できませんが、このようなスニペットでさえ壊れません。

;(function(window, document, undefined) {

    function o(id) {
        if (typeof id !== 'string') {
            return id;  
        }
        return document.getElementById(id);
    }   

    // ...

    /** @namespace */
    window.mOxie = o;

}(window, document));

これは私が得るものです(スペースだけが取り除かれると思います):

(function(window,document,undefined){function o(id){return typeof id!="string"?id:document.getElementById(id)}window.mOxie=window.o=o})(window,document)
4

4 に答える 4

19

わかりました、Uglify JS の最新バージョンでは、mangle オプションを明示的に true として渡す必要があるようです。そうしないと、何も mangle しません。このような:

var jsp = require("uglify-js").parser;
var pro = require("uglify-js").uglify;

var orig_code = "... JS code here";
var options = {
    mangle: true
};

var ast = jsp.parse(orig_code); // parse code and get the initial AST
ast = pro.ast_mangle(ast, options); // get a new AST with mangled names
ast = pro.ast_squeeze(ast); // get an AST with compression optimizations
var final_code = pro.gen_code(ast); // compressed code here
于 2012-06-12T11:50:00.367 に答える
10

デフォルトでは、uglify はトップレベルの名前を壊しません。

試してみてください: -mt または --mangle-toplevel — トップレベル スコープ内のマングル名も (デフォルトではこれを行いません)。

于 2012-06-09T11:42:08.540 に答える
0

グローバル スコープの変数は他のスクリプトで使用できるため、Uglify は、それらを表示する必要がある場合に備えて、特別なスイッチなしでは変数を変更しません。-mt/ toplevelswitch/setting を使用するか、グローバル スコープの汚染を停止し、これらの変数を外部に表示するつもりがないことを明確に示すことができます。プライベート スコープ。

于 2012-06-09T11:45:21.530 に答える