Google закрытие компиляции JQuery плагин - PullRequest
4 голосов
/ 10 ноября 2009

Я тестирую Google Closure-компилятор и хочу скомпилировать Плагин Facebox с опцией "Advanced", возникает ошибка, при попытке найти функцию "aH". *

Кто-нибудь пытался скомпилировать с этой опцией плагины jQuery с хорошим результатом.

Спасибо.

EDIT: Очевидно, что это переименование методов jQuery, но возможно ли включить jQuery и переименовать все методы одинаково?.

EDIT

пример кода с опцией "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);

Ответы [ 6 ]

5 голосов
/ 04 декабря 2010

Сама библиотека jQuery не может быть скомпилирована с ADVANCED_OPTIMIZATIONS, но вы можете скомпилировать свой собственный код с расширенной оптимизацией с помощью файла externs компилятора Closure, который задает весь API jQuery. Загрузите файл externs, относящийся к вашей версии jQuery, из репозитория Closure Compiler . В примере я буду использовать версию 1.4.3

Предполагается, что код вашего приложения находится в application.js, а compiler.jar - это файл jar Google Closure Compiler (доступен в этот 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 существуют, поэтому он не знает, как их переименовать.

4 голосов
/ 08 ноября 2010

Чтобы плагин jQuery правильно компилировался с использованием расширенной опции, вы должны немного изменить исходный код. Все внешние функции должны использовать строки в кавычках вместо точечного синтаксиса. Это обеспечит сохранение компилятором закрытия имени внешней функции. Например;

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

скомпилируется в

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

что довольно бесполезно. Но, если вы измените источник немного

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

выведет это

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

НАМНОГО лучше!

4 голосов
/ 27 июля 2010

Я столкнулся с той же проблемой при попытке сжать пользовательскую библиотеку JS плагинов jQuery. Закрытие (если вы не укажете этому причину) просто переименует любые вызовы библиотеки jQuery из вашего плагина. И что еще хуже, он даже не предупредит вас (как это может быть? Он предполагает, что программист знает, что вы делаете!), Решение состоит в том, чтобы сослаться на внешний файл js (или URL-ссылки на библиотеку). Я использовал веб-инструмент: http://closure -compiler.appspot.com / дом

, применив преамбулу о птице, я смог успешно скомпилировать файл:

// ==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);

Потому что это имя раскрыто миру. Есть идеи?

1 голос
/ 10 ноября 2009

Да, вам придется объединить jquery.js и plugin.js в один файл, но в настоящее время некоторые части jQuery сжимаются неправильно с Расширенная компиляция , но вы все еще можете использовать Простая компиляция .

Я уверен, что команда jQuery скоро выпустит версию, которую можно скомпилировать с помощью опции Расширенная компиляция .

Если вы заинтересованы в Расширенной компиляции , ознакомьтесь с этими учебными пособиями . Прочитав их, вы поймете, почему некоторые части нужно изменить, прежде чем сможете скомпилировать их, используя Расширенная компиляция без ошибок.

1 голос
/ 10 ноября 2009

Когда я попробовал, компилятор Closure изменил имена функций, к которым я обращался. Поэтому, когда я использовал (в качестве примера) $.each(// code), компилятор изменил его на $.a(// code ). Я считаю, что это твоя проблема.

0 голосов
/ 10 ноября 2009

Я думаю, что вы должны включить все сценарии в ваше приложение, чтобы оно работало на всех из них.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...