2

我创建了一个 externs 文件,以便能够使用 Google Closure Compiler 的 ADVANCED_OPTIMIZATIONS 编译 jQuery Star Rating Plugin fyneworks.com/jquery/star-rating/#tab-Testing。

但是,即使我引用了标准的 jQuery extern,'$' 也会被重命名,这会破坏插件。

也许相关:如果我使用未修改的插件,“评级”也会被重命名。我可以通过以下方式修复该部分:

$.fn['rating'] = function(opts) {

谷歌闭包编译jQuery插件......但这并不能修复'$'(如果可能的话,使用未修改的插件会很好)。

从我对外部的尝试(这可能是错误的和/或不完整的):

// ??? for '$'

// this one does NOT prevent 'rating' from being renamed
function rating(arg1) {}

// the following seem to work: they prevent the functions from being renamed
rating.focus = function() {}
rating.blur = function() {}
rating.fill = function() {}
... etc.

命令行(和下载中的 rating.sh):

java -jar ../compiler-latest/compiler.jar --formatting pretty_print --compilation_level ADVANCED_OPTIMIZATIONS --externs externs/jquery-1.7.js --externs externs/jquery.rating-extern.js --js original/jquery.rating.js --js_output_file jquery.rating.gcc.js

错误信息:

Firefox:
$(".star1").rating is not a function
callback: function (value) {
jquery.ratingSampleCode.js (line 9)

Chrome:
Uncaught TypeError: Object [object Object] has no method 'rating'
jquery.ratingSampleCode.js:8

从我的示例代码:

$('.star1').rating({
    callback: function (value) {

测试: http: //prefabsoftware.com/test/rating-july15/

下载:prefabsoftware.com/test/rating-july15.zip

一些有用的链接:(我不允许将其指定为降价,因为我无法使用我的旧信誉点登录......)

  • 高级编译和外部:developers.google.com/closure/compiler/docs/api-tutorial3#externs
  • 示例 externs: contrib: code.google.com/p/closure-compiler/source/browse/#svn%2Ftrunk%2Fcontrib%2Fexterns) 包括 jQuery 本身,但不包括评级插件
  • 更多外部人员:code.google.com/p/closure-compiler/source/browse/#svn%2Ftrunk%2Fexterns

外部有一个简单的修复方法吗?还是更好的解决方案?

谢谢!


好的,这适用于 externs 文件:

$.prototype.rating = function(arg1) {}
jQuery.prototype.rating = function(arg1) {}

$.prototype.rating.focus = function() {}
... etc.
4

2 回答 2

1

根据您的描述,您似乎不正确地使用了外部文件。您的插件的外部文件将允许其他用户编译引用您的插件的代码。它根本不应该用于编译您的实际插件代码。要编译您的代码,您只需要 jQuery extern 文件。

jQuery 代码样式在 Closure-compiler 中存在已知问题。特别是,您需要避免以下情况:

  • $别名的任何使用。使用完整的jQuery命名空间。编译器不能很好地处理别名命名空间。
  • jQuery.fn别名。而是使用jQuery.prototype.
  • 使用jQuery.extend方法添加函数原型或公共方法。相反,将它们直接添加到原型中。(例如:jQuery.fn.extend({a: 'foo'});会变成jQuery.prototype.a = 'foo';);

使用 ADVANCED_OPTIMIZATIONS,请记住,您仍然必须导出或引用任何公共方法和原型。这可能意味着 SIMPLE_OPTIMIZATIONS 更适合您的项目。

有关详细信息,请参阅http://blogs.missouristate.edu/web/2011/02/14/jquery-plugins-and-closure-compiler/

于 2012-07-16T02:36:42.453 回答
0

查看最新的 externs:https ://github.com/iplabs/closure-compiler/tree/master/contrib/externs

于 2013-03-31T22:39:56.153 回答