4

我正在测试google 闭包编译器并希望使用“高级”选项编译facebox 插件,试图找到“aH”的函数发生错误。

有没有人试图用这个选项编译 jQuery 插件,结果很好。

谢谢你。

编辑: 显然这重命名了 jQuery 方法,但是是否可以包含 jQuery 并同样重命名所有方法?

编辑

带有选项“externs_url”的代码示例:

带有闭包编译器

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);
4

6 回答 6

5

jQuery 库本身不能用 编译ADVANCED_OPTIMIZATIONS,但您可以使用指定整个 jQuery API 的 Closure Compiler externs 文件来编译您自己的代码并进行高级优化。从Closure Compiler 存储库下载与您的 jQuery 版本相关的 externs 文件。在示例中,我将使用版本 1.4.3

以下假设您的应用程序代码在application.jsGoogle compiler.jarClosure Compiler jar 文件中(在此 zip 文件中可用):

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

externs 文件告诉 Closure Compiler 存在哪些 jQuery 方法,因此它知道不重命名它们。

于 2010-12-03T23:03:04.030 回答
4

我在尝试压缩 jQuery 插件的自定义 JS 库时遇到了同样的问题。闭包(除非你给它一个不这样做的理由)只会重命名插件中的任何 jQuery 库调用。更糟糕的是,它甚至不会警告你(它怎么可能?它假设你程序员知道你在做什么!)解决方案是引用外部 js 文件(或指向库的 url)。我使用了网络工具: 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);

因为这是暴露在世人面前的名字。有任何想法吗?

于 2010-07-27T17:06:59.557 回答
4

要使用高级选项正确编译 jQuery 插件,您必须稍微修改源代码。所有外部函数都应该使用带引号的字符串而不是点语法。这将确保闭包编译器将保留外部函数名称。例如;

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

将编译为

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

这是非常没用的。但是,如果你稍微改变一下来源

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

会输出这个

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

好多了!

于 2010-11-08T14:03:56.820 回答
1

当我尝试 Closure 编译器时,我访问的函数的名称发生了变化。因此,当我使用(作为示例)$.each(// code)时,编译器将其更改为$.a(// code ). 我相信有你的问题。

于 2009-11-09T21:33:06.483 回答
1

是的,您必须将jquery.jsplugin.js连接到一个文件中,但目前 jQuery 的某些部分无法使用Advanced Compilation选项正确压缩,但您仍然可以使用Simple Compilation

我确信 jQuery 团队很快就会发布一个可以使用高级编译选项进行编译的版本。

如果您对高级编译感兴趣,请查看这些教程。阅读 em 后,您将了解为什么需要更改某些部分才能使用Advanced Compilation无错误地编译 em。

于 2009-11-10T03:37:22.647 回答
0

我认为您必须在应用程序中包含所有脚本才能使其在所有脚本中工作。

于 2009-11-09T22:09:28.347 回答