0

私はグーグルクロージャーコンパイラーの初心者であり、クロージャーツールサイトのドキュメントを読んだ後、jsを作成してテストを行います。

ただし、高度なコンパイルレベルを使用しても、コンパイルされたコードは簡単に逆コンパイルできることがわかりました。

たとえば、これは次のコードです。

//2
window["_NameSpace_"]={};
window["_NameSpaceInternal_"]={};
(function() {
    _NameSpaceInternal_.Class = function() {
        var clazz = function() {
            this["init"] && this["init"].apply(this, arguments);
        };
        var pros = {}, arg;
        for(var c = 0, k = arguments.length; c < k; ++c) {
            arg = arguments[c];
            if( typeof arg === 'function') {
                if(c == 0 && k > 1) {
                    var F = function() {
                    };
                    F.prototype = arg.prototype;
                    pros = new F;
                    arg = arg.prototype;
                }
            } else {
                if(arg.init) {
                    clazz = arg["init"];
                    delete arg["init"]
                }
            }
        }
        for(var p in arg)
            pros[p] = arg[p]
        clazz.prototype = pros;
        return clazz;
    };
})();

(function(d){
    d["Person"]=_NameSpaceInternal_.Class({
        "init":function(name){
            this.name=name; 
        },
        "whatever":function(aaa){
        }
    });
})(_NameSpace_);

コンパイル後(私は人間が読むためのきれいなフォーマットを作ります):

window.__MapNS__ = {};
window.__MapNSImpl__ = {};
__MapNSImpl__.a = function() {
    function c() {
        this.init && this.init.apply(this, arguments)
    }
    for (var b = {}, a, d = 0, e = arguments.length; d < e; ++d) if (a = arguments[d], "function" === typeof a) 0 == d && 1 < e && (b = function() {}, b.prototype = a.prototype, b = new b, a = a.prototype);
    else {
        a.b && (c = a.init, delete a.init)
    }
    if (!b || !a) throw Error("You must provide an object to copy from and to");
    for (var f in a) b[f] = a[f];
    c.prototype = b;
    return c
};
(function(c) {
    c.Person = __MapNSImpl__.a({
        init: function(b) {
            this.name = b
        },
        whatever:function(x){
        }
    })
})(__MapNS__);

たとえば、「Person」のクラス定義を取得します。コンパイル後、「Person」のすべてのメソッドは、これらのメソッドを公開する必要がある場合でも、明らかにハッカー向けです。

しかし、このようにコンパイルされたコードを作成できるかどうか疑問に思います。

...........
var xx="init",xxx="whatever",xxxx=="Person";
    c[xxxx] = __MapNSImpl__.a({
        xx: function(b) {
            this.name = b
        },
        xxx:function(x){
        }
    })

...........

グーグルマップの圧縮のように。

何か案が?

4

1 に答える 1

2

あなたが探している正確な答えは、Java APIを使用するか、コンパイラのカスタムビルドを作成することによって、コンパイラでAliasStringsパスを有効にすることです。パスは、gzipを考慮したときに大きなコードを生成する傾向があるため、デフォルトでは有効になっていません。

ほとんどのグーグル製品が達成するのと同じ効果を実際に得るには、コードに大幅な変更を加える必要があります。

  1. グローバルスコープでオブジェクトとメソッドを定義します。それらをグローバルに宣言した後、それらを名前空間に割り当てます。フラグを使用してoutput_wrapper、コンパイルされたコードを関数でラップし、グローバルスコープの衝突を防ぐことができます。例:

    function a() {}; window['Namespace']['obj'] = a;

  2. オブジェクトを直接定義します-ヘルパーメソッドを使用しないでください。だから代わりに

    var a = _NameSpaceInternal_.Class({"init":function(name){ this.name=name; });

    次のようなものを使用します:

    function a(){}; a.prototype.name = ""; a.prototype.init = function(name) { this.name=name; };

    これにより、引用符で囲まれた構文の使用が回避され、コンパイラがプロパティとメソッドの名前を変更できるようになります。

Closure-compilerを使用して最適にコンパイル/名前変更するコーディングスタイルのその他の多くの例については、ClosureLibraryを参照してください。

于 2012-05-18T12:19:11.813 に答える