2009-11-09 54 views
4

我測試google closure-compiler並希望編譯facebox Plugin與選項「高級」,錯誤發生函數試圖找到「a.H」。谷歌關閉編譯jQuery插件

有沒有人試圖用這個選項編譯jQuery插件,結果很好。

謝謝。顯然,這重新命名了jQuery方法,但是有可能包含jQuery並重新命名所有方法嗎?。

EDIT

與選項 「externs_url」 代碼例如:

with closure-compiler

JS輸入代碼

// ==ClosureCompiler== 
// @output_file_name default.js 
// @formatting pretty_print 
// @compilation_level ADVANCED_OPTIMIZATIONS 
// @warning_level QUIET 
// @externs_url http://code.jquery.com/jquery-1.5.min.js 
// ==/ClosureCompiler== 

// ADD YOUR CODE HERE 

var test = function($, context) { 

    var 
    _self = this; 

    _self.mymethod = function() { 

    var lista = $("a", context); 

    lista.attr("target", "_blank"); 

    return lista.html(); 

    }; 


    return {"mymethod":_self.mymethod}; 

}.call({}, jQuery, context);  

JS輸出中代碼

(function(b, c) { 
    this.a = function() { 
    var a = b("a", c); 
    a.attr("target", "_blank"); 
    return a.html() 
    }; 
    return{mymethod:this.a} 
}).call({}, jQuery, context); 
+1

This is SOOO close,just change http://code.jquery.com/jquery-1.5.min.js to http://closure-compiler.googlecode.com/svn/trunk/contrib/externs/jquery- 1.5.js,它的工作原理。我已經在下面回答了extern的回答。 – Gabe 2011-09-03 05:59:28

回答

4

當試圖壓縮jQuery插件的自定義JS庫時,我遇到了同樣的問題。關閉(除非你給它一個理由)只會重命名插件中的任何jQuery庫調用。更糟糕的是,它甚至不會警告你(它怎麼可能呢?它假定你程序員知道你在做什麼!)解決方案是引用外部js文件(或指向庫的url指針)。我使用的Web工具: http://closure-compiler.appspot.com/home

通過應用fowlloing序言,我是能夠編譯成功的文件:

// ==ClosureCompiler== 
// @compilation_level ADVANCED_OPTIMIZATIONS 
// @warning_level QUIET 
// @output_file_name default.js 
// @formatting pretty_print 
// @externs_url http:// ajax.googleapis.com/ajax/libs/jquery/1.4.2/jquery.js 
// @externs_url http:// ajax.googleapis.com/ajax/libs/jqueryui/1.8.0/jquery-ui.js 
// ==/ClosureCompiler== 

其餘正在編譯器的唯一問題意識到插件名稱,不能簡化版:

(function($) { $.fn.extend({ <name>:function(options) { } }); })(jQuery); 

因爲這是揭露世界的名字。有任何想法嗎?

+2

你很近,但你不通過JavaScript傳遞庫js文件,你需要傳遞externs文件(而不是http:// ajax.googleapis.com/ajax/libs/jquery/1.4.3/jquery。 js使用http://closure-compiler.googlecode.com/svn/trunk/contrib/externs/jquery-1.4.3.js。我有一個更完整的文章在http://stackoverflow.com/questions/2226298/using -google-closure-compiler/7291380#7291380 – Gabe 2011-09-03 05:55:27

+0

試過了你發佈的代碼,它確實有效,但是設置「warning_level QUIET」意味着在編譯代碼時你缺少很多問題,我還沒有意識到它需要一個庫文件並嘗試查找所有導出。 – Gabe 2011-09-03 06:27:01

1

當我試着Closure編譯器改變了我訪問的函數的名字。所以當我使用(作爲例子)$.each(// code)編譯器將其更改爲$.a(// code)。我相信你的問題。

+0

是的,但你可以解決這個問題。因爲我包含jQuery並失敗。 – 2009-11-09 21:47:31

0

我想你必須在你的應用程序中包含所有的腳本才能在它們之間工作。

1

是的,你就必須既串聯的jquery.jsplugin.js成一個文件,但目前的jQuery的某些部分不符合高級編譯選擇正確的壓縮,但你可以仍然使用簡易編輯

我相信jQuery團隊很快就會發佈一個可以使用高級編譯選項編譯的版本。

如果你有興趣高級彙編查看這些tutorials。一旦你讀完了,你就會明白爲什麼有些部分需要改變,然後才能使用高級編譯沒有錯誤地編譯它們。

+0

@Maiku森謝謝你。我將按照教程查看更多選項。我將jQuery.min與jQuery一起使用[「Method」]來查看我是否使用Advanced Compilation來編譯我的腳本。 – 2009-11-10 12:34:12

+0

對不起,但使用「externs_url」選項可以做到這一點。 – 2011-02-22 14:03:09

4

對於使用高級選項正確編譯的jQuery插件,您必須稍微修改源代碼。所有外部函數都應該使用帶引號的字符串,而不是點語法。這將確保閉包編譯器將保留外部函數名稱。例如;

$.fn.pluginName = function(opts) { 
    // plugin code 
} 

將編譯到

$.a.b=function(){}; 

這是相當無用的。但是,如果您更改源有點

$.fn['pluginName'] = function(opts) { 
    // plugin code 
} 

將輸出這個

$.a.pluginName=function(){}; 

好多了!

5

jQuery庫本身can't be compiled with ADVANCED_OPTIMIZATIONS,但您可以使用指定整個jQuery API的Closure Compiler externs文件,通過高級優化來編譯自己的代碼。從Closure Compiler repository下載與您的jQuery版本相關的externs文件。在這個例子中,我將使用版本1.4.3

以下假定您的應用程序的代碼是application.jscompiler.jar是谷歌關閉編譯器jar文件(在this zip file提供):

java -jar compiler.jar \ 
--compilation_level ADVANCED_OPTIMIZATIONS \ 
--externs jquery-1.4.3.externs.js \ 
--js_output_file output.js \ 
application.js 

的實習醫生文件告訴Closure Compiler哪些jQuery方法存在,因此它知道不要重命名它們。