Closure Compiler (расширенный режим) Как проектировать классы?

У меня есть класс, который имеет примерно такую ​​структуру:

function MyClass() {
    // constructur stuff
}

MyClass.prototype.myFunc = function () {
    // example function
};

MyClass.myStaticFunc = function () {
    // example static function
};

Я потратил некоторое время на настройку аннотаций компилятора закрытия и, наконец, избавился от всех предупреждений. И что вы знаете, это уменьшает размер на впечатляющие 100%. Итак, я прочитал об экспорте функций, но window['MyClass'] = MyClass будет экспортировать только конструктор. Честно говоря, я бы не стал экспортировать каждый метод по отдельности. Я думал, что компилятор будет экспортировать, а не запутывать все общедоступные методы, кроме тех, у которых есть аннотация @private.

Каков наилучший способ научить компилятор замыкания делать это и не экспортировать каждый метод по отдельности?


person Ingo Bürk    schedule 13.04.2013    source источник


Ответы (2)


Используя ADVANCED_OPTIMIZATIONS, вы должны экспортировать КАЖДЫЙ публичный метод и свойство. Если вы не хотите переименовывать общедоступные методы и свойства, используйте SIMPLE_OPTIMIZATIONS.

См. мой какой уровень компиляции мне подходит сообщение для более подробной информации.

person Chad Killingsworth    schedule 15.04.2013
comment
Но расширенные параметры делают гораздо больше, поэтому я хочу их использовать. Во всяком случае, использование аннотации экспорта сработало как шарм (см. Мой собственный ответ). - person Ingo Bürk; 15.04.2013
comment
Advanced Optimizations выполняет удаление мертвого кода в глобальном пространстве. Это единственное другое существенное отличие. - person Chad Killingsworth; 15.04.2013

Кажется, я нашел ответ: я могу аннотировать методы с помощью @export и запускать компилятор с помощью --generate_exports. Но, может быть, у кого-то есть еще лучший способ.

person Ingo Bürk    schedule 13.04.2013
comment
@expose ваш лучший способ. - person Chad Killingsworth; 15.04.2013
comment
Не могли бы вы объяснить, почему это лучше, чем @export? @expose предотвратит любую оптимизацию, что определенно плохо. И, как говорится в документации: @expose никогда не следует использовать в коде библиотеки. - person Ingo Bürk; 16.04.2013
comment
Это утверждение существует, потому что @expose предотвращает переименование и удаление мертвого кода. Это лучше, чем @export, потому что не требует специального флага во время компиляции. Конечно, если вы пишете библиотеку для использования другими, то вы не должны использовать ни то, ни другое в основном коде. Экспорт должен быть в конце кода или лучше в отдельном файле, потому что он блокирует переименование и удаление мертвого кода. - person Chad Killingsworth; 16.04.2013
comment
Почему @export блокирует переименование? Я не вижу, что происходит в моем выводе, кажется, он работает нормально. Что касается устранения мертвого кода, я не могу сказать прямо сейчас, потому что у меня нет мертвого кода (пока). Насколько я понимаю, @exports должно быть эквивалентно ручному экспорту методов, чего, кстати, я стараюсь избегать, так как мне не нравится идея экспортировать где-то еще в коде (подверженном ошибкам); аннотации я вижу прямо там, где пишу свой метод. - person Ingo Bürk; 16.04.2013
comment
Кроме того: я не против дополнительного флага компилятора. Для этого они и существуют ;) - person Ingo Bürk; 16.04.2013
comment
@export одновременно переименовывает свойство и сохраняет ссылку на исходное имя, создавая код, аналогичный foo.a=1;foo['prop']=foo.a;. @export производит foo.prop=1. Если у вас много внутренних ссылок на foo.prop, то @export даст меньшие результаты gzip. Если foo.prop предназначен в основном для внешнего потребления, то @expose даст меньшие результаты. Вот почему я ставлю лучше в кавычки - это зависит от использования. - person Chad Killingsworth; 16.04.2013
comment
Хорошо, спасибо. Я мог бы сравнить их когда-нибудь, но сейчас я выбираю @export. :) - person Ingo Bürk; 16.04.2013
comment
@expose больше не рекомендуется. @export теперь официально правильный метод. - person Chad Killingsworth; 17.04.2015
comment
Здесь я провел несколько экспериментов: syntaxsuccess.com/viewarticle/ - person TGH; 04.12.2016