Google Closure Compiler с приложениями jQuery

Вы можете сделать это с помощью функции трассировки (реквизиты для Spacedman для улучшения исходной версии этого для отслеживания возвратов и использования некоторого приятного отступа):

def tracefunc(frame, event, arg, indent=[0]):
      if event == "call":
          indent[0] += 2
          print "-" * indent[0] + "> call function", frame.f_code.co_name
      elif event == "return":
          print "<" + "-" * indent[0], "exit function", frame.f_code.co_name
          indent[0] -= 2
      return tracefunc

import sys
sys.settrace(tracefunc)

main()   # or whatever kicks off your script

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

Если это становится проблемой, вы можете извлечь «реальное» имя функции из исходного кода: Python отслеживает имя файла и номер строки - или попросите сборщика мусора выяснить, какой объект функции ссылается на объект кода. Может быть более одной функции, разделяющей объект кода, но любое из их имен может быть достаточно хорошим.

Возвращаясь к этому четыре года спустя, мне следует сказать, что в Python 2.6 и позже вы можете получить более высокую производительность, используя sys.setprofile(), а не sys.settrace(). Можно использовать ту же самую функцию трассировки; это просто, что функция профиля вызывается только при вводе или выходе функции, поэтому функция внутри функции выполняется на полной скорости.

38
задан Tauren 10 July 2010 в 07:25
поделиться

2 ответа

Google Closure Compiler не зависит от jQuery или любой другой библиотеки. Он имеет два типа оптимизаций -

  • Простая
  • Расширенная

Я пробовал применять расширенные оптимизации, но это сильно сломало мое приложение. Если он делает то же самое, вы можете либо попытаться исправить свое приложение, либо использовать простую оптимизацию. С простой оптимизацией размер уменьшился на 32%, а с продвинутой - примерно на 68%, но это все равно не помогло.

Перемещение конкатенации JS автоматизированным способом в ваш процесс сборки - это определенно путь к успеху. См. Управление зависимостями JavaScript.

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

Я рассматриваю Google Closure Library в благоприятном свете, но еще не начал ее использовать, так как на данный момент я сильно вложился в MooTools. Если посмотреть на ее API, кажется, что она имеет довольно широкий охват того, что она может предложить, помимо манипуляций с DOM, обработки AJAX, обработки событий и т.д.

10
ответ дан 27 November 2019 в 03:51
поделиться

Я считаю, что начиная с версии 1.4.2 (возможно, раньше) jQuery по умолчанию минимизирован с использованием компилятора Google Closure. Так что, вероятно, лучше продолжать ссылаться на jQuery / jQuery UI через google CDN. Тем не менее, интеграция компилятора Closure в процесс сборки по-прежнему дает преимущества для объединения и минимизации файлов JS. А именно, уменьшение количества JS-запросов на загрузку страницы и меньший объем передаваемых данных в надежде улучшить производительность загрузки страницы на стороне клиента. Вот некоторые из проблем, с которыми мы столкнулись при интеграции компилятора Closure в наш процесс сборки:

  1. Создание команды компиляции - Нам требовалось средство автоматического вызова компилятора со всеми необходимыми параметрами в процессе сборки.Для нас это означало написание консольного приложения для создания команды. Если в вашей среде доступны сценарии оболочки, это может быть преимуществом.

  2. Управление зависимостями - Компилятор Closure имеет возможность автоматически сортировать порядок объединенного JS таким образом, чтобы зависимости сохранялись. Чтобы использовать эту функцию, файлы JS должны быть аннотированы goog.provide \ goog.require , чтобы сообщить компилятору, каковы зависимости ( - manage_closure_dependencies ). Компилятор также исключит любой JS, который не требуется (т. Е. Не упоминается с помощью оператора goog.require ) из объединенного JS. Вот несколько вещей, на которые следует обратить внимание:

    • Если вы хотите включить все ваши JS-файлы в объединенный вывод, убедитесь, что вы включили «манифестный» JS-файл в компиляцию, которая содержит только goog.require операторов для каждого включаемого файла в комбинированном сценарии (т.е. нет операторов goog.provide ).
    • Если вы не используете Closure Library, убедитесь, что вы компилируете с использованием SIMPLE_OPTIMIZATIONS или выше. В противном случае компилятор не удалит операторы goog.provide / goog.require . В качестве альтернативы вы также можете определить свои собственные goog.provide / goog.require JS-функции, чтобы избежать ошибок.
    • Убедитесь, что нет циклических зависимостей , иначе столкнитесь с последствиями.
  3. Компиляция отладочной версии объединенного сценария - При необходимости вы можете скомпилировать отладочную версию объединенного сценария, используя - флаг PRETTY_PRINT форматирования. Это выведет эквивалентный сценарий, отформатированный с неповрежденными пробелами, для разработки / отладки.

Хотя документация по компилятору Closure временами может быть скудной, ее по большей части достаточно, чтобы начать работу, и она постоянно улучшается - так что проверяйте обновления регулярно, а не только SO;)

Надеюсь, это поможет.

9
ответ дан 27 November 2019 в 03:51
поделиться
Другие вопросы по тегам:

Похожие вопросы: