#java #javascript #filter #compression #minify
#java #javascript #Фильтр #сжатие #минимизировать
Вопрос:
Я пытаюсь создать (или найти существующий, который я могу использовать) веб-фильтр, который будет сжимать файл JavaScript во время выполнения. Я пытался создать один на основе YUICompressor, но я получаю странные ошибки из него, когда я пытаюсь передать в него источник на основе строк вместо реального файла.
Теперь я ожидаю, что меня засыплют ответами типа «Сжатие / минимизация в реальном времени — плохая идея», но есть причина, по которой я не хочу делать это во время сборки.
У меня есть веб-приложение JavaScript, которое лениво загружает свой JavaScript. Он загрузит только то, что ему действительно нужно. Файлы JavaScript могут указывать зависимости, и у меня уже есть фильтр, который объединит запрошенные файлы и любые зависимости, которые еще не загружены, в один ответ. Это означает, что в JavaScript существует большое количество различных комбинаций, которые будут отправлены пользователю, что делает попытку собрать все пакеты во время сборки непрактичной.
Итак, чтобы повторить. В идеале я ищу существующий фильтр javascript в реальном времени, который я могу просто подключить к своему приложению.
Если такового не существует, я ищу советы о том, что я могу использовать в качестве строительных блоков. YUICompressor не совсем меня понял, и GoogleClosure, похоже, является всего лишь веб-API.
Приветствую, Питер
Комментарии:
1. Оказывается, в версии 2.4.2 yui есть некоторые проблемы. Вернулся к версии 2.3.6, и она сразу же начала работать…
2. Почему бы сначала не сжать каждый js, а затем объединить те, которые вам нужны во время выполнения?
3. Так что это определенно возможно сделать, и можно использовать YUICompressor. Демиан и ВайЛим правильно указали, что минимизация перед конкатенацией выполнит свою работу. Я просто не был в нужном месте, чтобы подумать об этом. Я буду сжимать во время сборки.
4. Просто для информации — Closure также имеет Java API. На самом деле это написано на Java.
5. Попробуйте wro4j: alexo.github.com/wro4j . Это может помочь вам выбрать из дюжины компрессоров и упростить способ управления ресурсами.
Ответ №1:
Взгляните на уменьшитель JavaScript от Дугласа Крокфорда. Источник находится здесь: JSMin.java
. Это не фильтр и содержит только код для минимизации. Мы превратили это в фильтр, где мы также объединяем и минимизируем JavaScript на лету. Это работает хорошо, особенно если у вас есть браузеры и результаты кэша CDN.
Обновление: Я не учел, что мы также кэшируем их на сервере. Они восстанавливаются только в том случае, если изменились какие-либо ресурсы, необходимые для создания объединенного и уменьшенного вывода. По сути, вместо того, чтобы «компилировать» их во время сборки, мы обрабатываем каждую комбинацию один раз во время выполнения.
Комментарии:
1. Демиан имеет некоторый смысл. Я изо всех сил пытаюсь оправдать попытку сделать это в реальном времени. Почему вы решили пойти этим путем, а не сжимать во время сборки?
2. Я обновил с разъяснением того, как мы также кэшируем на стороне сервера. Мы генерируем их на лету только по мере необходимости, а не беспокоимся о том, что это этап сборки. Во многих случаях имеет смысл просто сделать это во время сборки, наш способ был проще из-за многих других сложностей. Вы просили решение для минимизации во время выполнения на Java, я просто говорю, что это может сработать 🙂
3. JSMin только нормализует пробелы, на самом деле он не делает больше умных действий, таких как замена длинных символов более коротким и т.д.
Ответ №2:
У меня уже есть фильтр, который объединит запрошенные файлы и любые зависимости, которые еще не загружены, в один ответ
Ооочень.. Почему бы просто не минимизировать их перед загрузкой / объединением?
(И да, сжатие «на лету» ужасно дорого и определенно не стоит выполнять для каждого загруженного файла .js)
Комментарии:
1. В том, что вы говорите, есть определенная логика. Мне действительно нравится идея иметь возможность легко отлаживать выпущенный код. Я могу добиться этого, располагая сжатые и несжатые файлы рядом.