Используйте закрывающий компилятор для удаления неиспользуемых частей jQuery - PullRequest
10 голосов
/ 13 мая 2011

Можно ли использовать компилятор закрытия для удаления неиспользуемых частей jQuery?

У меня есть скрипт, который использует только сетевые (json) функции jQuery, и я хотел бы минимизировать скрипт, который удаляет все остальное.

Я пытался вызвать его с помощью:

    java -jar compiler.jar --compilation_level=ADVANCED_OPTIMIZATIONS --js=jquery-latest.js --js=my_script.js  --js_output_file=out.js

Но я получаю файл, не меньший, чем обычный минимизированный источник jQuery.

Редактировать: я долженУкажите причину этого.Этот скрипт будет включен на сторонние веб-сайты, и для него требуется более поздняя версия jQuery (1.5 или 1.6).Я подумал, что самый простой способ справиться с этим - связать последнюю версию скрипта (доступно только для моего скрипта, не затрагивая window.jQuery), удалив неиспользуемые части, чтобы уменьшить размер.Таким образом, если у них уже есть более старая версия jQuery, это не помешает.

Ответы [ 4 ]

6 голосов
/ 13 мая 2011

Невозможно удалить «неиспользуемые» методы в jQuery, потому что вы можете вызывать методы безумными способами, такими как:

<input id="test" value="hello!"/>

alert($('#test')[prompt('Method?')]()); // input "val" in the prompt box

Компилятор закрытия не может знать, какие методы будут использованы или нет.

Fiddle: http://jsfiddle.net/garreh/xDDXt/


В некоторых примечаниях:

  • Только последняя производственная версия jQuery (1.6)31kb.При надлежащем контроле кэширования он будет загружен один раз и кэширован локально браузером.
  • Вы, вероятно, сделаете себе одолжение, чтобы оптимизировать вещи, как правило, гораздо большего размера, например изображения.
  • ... или сокращение запросов браузера, например использование техники спрайтов CSS для лучшей оптимизации вашего сайта.
  • Поместите тег jQuery code <script> внизу страницы, чтобы добиться большего распараллеливания загрузки.http://developer.yahoo.com/blogs/ydn/posts/2007/07/high_performanc_5/
5 голосов
/ 14 мая 2011

Прежде всего, для удаления мертвого кода нужен расширенный режим.Я вижу, что вы уже используете его.

Во-вторых, ваш код должен быть написан, чтобы соответствовать строгим ограничениям использования расширенного режима.Я полагаю, что вы сделали это и тщательно проверили свой код - иначе скомпилированный код не будет работать.

Тогда вам нужно обратиться к файлу jQuery "externs" - вы можете получить его извеб-сайт Закрытия Компилятора.Без этого файла externs Closure переименует свойства и функции в jQuery, что не должно.

Наконец, jQuery не написан для работы с расширенным режимом компилятора Closure.Есть много мест, где он создает «псевдонимы», которые нельзя оптимизировать.При наличии хотя бы одного псевдонима в пределах базы кода весь объект jQuery будет извлечен и все под ним.

Краткий ответ: без большой работы невозможно использовать расширенный режим компилятора Closure с jQuery дляудаление мертвого кода.

Не по теме: На данный момент Dojo Toolkit является единственной популярной библиотекой JavaScript (кроме библиотеки Closure), которую можно использовать с компилятором Closure в расширенном режиме.Поддерживаются все расширенные функции Closure Compiler (например, удаление мертвого кода, виртуализация методов, выравнивание пространства имен и т. Д.).

Проверьте эту ссылку для документа TODO: http://dojo -toolkit.33424.n3.nabble.com/file/n2636749/Using_the_Dojo_Toolkit_with_the_Closure_Compiler.pdf?by-user=t

1 голос
/ 13 мая 2011

Существует множество причин, по которым компилятор не будет ничего делать с библиотекой jQuery, начиная с самого "экспорта" jQuery:

window.jQuery = jQuery

В расширенном режиме эта идиома используется, чтобы сообщить компилятору, что значение используется внешним образом для сценария, поэтому сам объект никогда не будет удален, иерархии имен оставлены не свернутыми и т. Д.

Если вы удалите это, jQuery внедряется в оболочку функции анонимной функции, которая предотвращает многие из глобальных оптимизаций области действия режима ADVANCED (иерархии имен, обнаружение классов для анализа типов и т. Д.).

Однако, если вы удалите это, ничего не изменится, но я не искал следующую проблему.

0 голосов
/ 13 мая 2011

Попробуйте ender.

Это философия - комбинированный набор микро-фреймворков.Не нуждайтесь в функции, поэтому не встраивайте ее в ender.

Если вам просто нужен ajax, добавьте модуль ajax в вашу сборку ender.

...