Как воспользоваться закрывающим компилятором при использовании библиотеки? - PullRequest
4 голосов
/ 11 ноября 2011

Я недавно играл с удивительным инструментом от Google, который выполняет некоторую оптимизацию кода и частичное выполнение, например, для этого потребуется что-то вроде:

//Just an alias for an elementByID selector
function $(bar){
    return document.getElementById(bar);
}

//Call the selector
alert($("foo").value);

И сократить его до alert(document.getElementById("foo").value);,это довольно круто с точки зрения оптимизации.

Я объясняю это только потому, что думал бы, что эта концепция работает для больших библиотек, таких как jQuery, которая в основном пытается абстрагироваться от множества вещей, которые делает JavaScript, таких каквыберите по идентификаторам.

В быстром тесте я загрузил весь производственный файл jQuery в компилятор и добавил один бит текста в конце: alert($("#foo").val());

И довольноК сожалению, компилятор не смог отобразить дизайн и результат jQuery на простом примере, который был у меня выше, но скорее мой вывод составляет около 85 КБ текста с alert($("#foo").K()); в конце.По сути, я просто уменьшил код и не воспользовался потрясающей функцией, показанной выше.

Поэтому мой вопрос: если я в конечном итоге использую библиотеку, как я могу кодировать таким образом, чтобыЗакрывающий компилятор может упростить мой код до его родного JS (или что-то более эффективное, чем 85 КБ неиспользуемого кода)?В качестве альтернативы, какой дизайн следует выбрать, если он хочет создать небольшую библиотеку, которая будет играть хорошо?

Ответы [ 2 ]

2 голосов
/ 13 ноября 2011

AFAIK, jQuery (пока) не написан для оптимизации в расширенном режиме компилятора Closure.У него есть файл "externs", который позволяет не переименовывать его общедоступные свойства и классы, но он не включает большинство оптимизаций (например, удаление мертвого кода), как вы обнаружили.Что очень жаль, потому что объект jQuery, если написано свойство, довольно легко и удобно поддается функции виртуализации прототипа Closure Compiler.

Немного не по теме

Если вы непривязанный к jQuery, вы можете рассмотреть Dojo Toolkit, который может быть изменен для использования с компилятором Closure при одновременном включении большинства оптимизаций (особенно удаления мертвого кода).

Подробнее см. в этом документе .

1 голос
/ 11 ноября 2011

jQuery прилагает особые усилия, чтобы минимизировать себя и в процессе становится непрозрачным для компилятора Closure.

Closure Library - пример библиотеки, написанной для эффективного использования компилятора Closure.

Как правило, компилятор лучше всего работает с наследованием прототипов и простыми структурами:

/ ** @constructor * / function Class () {} Class.prototype.f = function () {};

С явно экспортированным интерфейсом: window ['MyLib'] = {'method', method};

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

...