Оптимизируем Загрузку Библиотеки Extjs До Двух Запросов

Хочу поделиться решением, которое я использую для оптимизации загрузки админки, разработанной с использованием библиотеки ExtJS. Это решение применимо не только непосредственно к ExtJS, но и для этой библиотеки оно очень актуально.

Заранее предупреждаю, что решение работает очень плохо, если почти не работает, с семьей 60- и 70-летних интернет-исследователей.



Проблема:

Чуть ли не первое, что сразу отпугивает большинство разработчиков и заказчиков перед началом разработки на extjs, это «блин, это же почти мегабайт Javascript!?!» На самом деле так оно и есть, и если включить в список загрузки файлы стилей css и изображения, то можно получить полтора-два.

Приправим блюдо плагинами, что неизбежно, ведь в этом преимущество extjs — мощных плагинов, тогда для начала прилагается множество скриптов, каждый из которых требует запроса к серверу.

В результате при каждом посещении админки клиент (получивший бесплатные четки) скачивает все скрипты и дизайн.

Это пагубно влияет на скорость загрузки страниц в браузере.

И это требует от пользователя дополнительного терпения, что не добавляет никаких плюсов в карму разработчика.

Если вы думали, что я опишу метод загрузки скриптов «по требованию», который существует и для ExtJS, то нет. Моё решение хоть и сырое, но позволяет получить всё сразу, хотя и накладывает определённые ограничения.

Так…

Решение:



1. Объедините множество файлов в один.

Создаем список файлов, необходимых для полноценной работы, и объединяем файлы библиотек, плагинов и помощников в один большой JavaScript-файл.

То же самое делаем со стилями и тоже формируем из них один файл.

Это уменьшит количество запросов от клиента к серверу, но недостаточно.

В комплект разработчика уже входят готовые файлы «все-в-одном», но часто бывает, что в базовую библиотеку вносятся изменения, в основном в стилях, иногда меняются шрифты, иногда меняются изображения.

А если есть изменения в коде JavaScript, то рекомендую описывать их как плагин для ExtJS.

2. Вставка картинок в файл стилей.

Использование URI SRC данных ( http://en.wikipedia.org/wiki/Data_URI_scheme ), позволяет вставлять содержимое изображения непосредственно в файл стилей.

Это хорошо работает практически во всех браузерах, за исключением 6/7 Internet Explorer, а в 8 Explorers есть ограничение на размер данных.

Мне повезло, я не такой как все, мой клиент отказался от IE. Преимущество такого решения в том, что клиент получает все изображения стиля сразу и в процессе рендеринга не наблюдает, как постепенно та или иная часть визуальных компонентов «обрастает» дизайном.

А также никаких лишних запросов к серверу.

Вот как выглядят данные uri в css (взято из вики):

ul.checklist > li.complete { margin-left: 20px; background: url('data:image/png;base64, iVBORw0KGgoAAAANSUhEUgAAABAAAAAQAQMAAAAlPW0iAAAABlBMVEUAAAD/ //+l2Z/dAAAAM0lEQVR4nGP4/5/h/1+G/58ZDrAz3D/McH8yw83NDDeNGe4U g9C9zwz3gVLMDA/A6P9/AFGGFyjOXZtQAAAAAElFTkSuQmCC') top left no-repeat; }

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

Например, в ExtJS (2.0) изображение флажка представляет собой спрайт со всеми состояниями флажка.

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

Когда я разделил картинку из спрайта на составляющие, эта проблема исчезла.



3. Сжатие.

Полученные файлы теперь необходимо сжать.

Для этого я лично использую Юикомпрессор .

Вы можете использовать любую другую программу сжатия.

Пример использования с yuicompressor

java -jar yuicompressor.jar --type js extjs.js java -jar yuicompressor.jar --type css extjs.css

Сжатие хорошее, но недостаточное.

Использование Apache mod_deflate дает потрясающий эффект. Мои результаты примерно такие: После склейки: js — 1000кб, css — 1000кб (да-да, много изображений в base64).

После сжатия: js — 800кб, css — 700кб.

После mod_deflate клиент скачивает вот что: js — 170кб, css — 200кб.

Как видите, размер файла по-прежнему большой, но есть уверенность, что клиент получит всю среду extjs в два запроса: один на яваскрипт, второй на стили.



4. Кэширование и срок действия.

Самое тривиальное решение — настроить apache mod_expires для этих двух файлов, чтобы клиент, скачав их один раз, не скачивал повторно, тогда размер 500кб для скачивания будет не так заметен.

А для принудительной аннулирования мы будем использовать в имени файла метку времени (тип ext.1249090480.js).

При новом развертывании номер файла просто меняется и клиент скачивает новую версию при следующем входе в админку.



link rel="stylesheet" type="text/css" href="extjs.1245678910.css" script type="text/javascript" src="extjs.1245678910.js"

Для автоматизации я написал скрипт, выполняющий шаги с 1 по 3. Опубликовано на форуме ExtJS и на Пастебин .

Теги: #extjs #JavaScript #CSS #оптимизация #Чулан

Вместе с данным постом часто просматривают:

Автор Статьи


Зарегистрирован: 2019-12-10 15:07:06
Баллов опыта: 0
Всего постов на сайте: 0
Всего комментарий на сайте: 0
Dima Manisha

Dima Manisha

Эксперт Wmlog. Профессиональный веб-мастер, SEO-специалист, дизайнер, маркетолог и интернет-предприниматель.