2009-11-09 63 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方法存在,因此它知道不要重命名它们。