Как минимизировать различные файлы javascript во время выполнения с помощью Java

#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. В том, что вы говорите, есть определенная логика. Мне действительно нравится идея иметь возможность легко отлаживать выпущенный код. Я могу добиться этого, располагая сжатые и несжатые файлы рядом.