Неочевидные моменты при работе с assets в Yii2

· yii php

Недавно пришлось настраивать сжатие ассетов Yii2 на одном из проектов. Для этого во фреймворке предусмотрен удобный cli-интерфейс. Работа с ним вкратце описана в документации.

Ниже перечислен ряд моментов, которые для меня оказались не очевидны.

Advanced-шаблон и алиас @app

В проекте я использую advanced-шаблон. Он позволяет разделять проект на три части:

  • Для пользователя (frontend)
  • Для администраторов и контент-менеджеров (backend)
  • Для работы с cli-интерфейсом приложения (console)

Для каждой из частей проекта так же предусмотрены алиасы @frontend, @backend и @console соответственно.

Однако у моих ассетов во frontend-части в свойстве sourcePath был прописан алиас @app вместо @frontend.

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

Как выяснилось, алиас @app для консоли в случае с advanced-шаблоном указывает на алиас @console и ассеты пытались распаковаться туда, что и сбивало с толку инструмент. Тот случай, когда неплохо бы лишний раз читать доки. :)

Вывод: в случае использования advanced-шаблона, нужно проверить, что ассеты, расположенные во frontend/assets используют в sourcePath алиас @frontend вместо @app. Аналогично и для backend-части приложения.

Ошибка file_put_contents

Функция file_put_contents падает с ошибкой в случае несуществующего пути до папки.

Вывод: следует проверять, что все пути к папкам в конфиге сжатия ассетов верные.

Невозможность доступа к baseUrl ассета после минификации

На заре создания проекта я хранил всю frontend-статику в папке assets. Путь до папки с финальными ассетами я получал комбинацией:

$asset = frontend\assets\AppAsset::register($this);
echo $asset->baseUrl;

Оказалось, это плохая практика. После сжатия свойство baseUrl у ассетов зануляется и картинки, шрифты и прочие вещи, которые до этого прекрасно отображались, перестают работать в production-окружении (в dev-окружении все в порядке).

Пришлось вынести папки со шрифтами и картинками в публичную часть сайта, а относительные пути в css переделать на абсолютные.

Вывод: в assets лучше хранить только то, что будем сжимать. Остальное выносить в публичную часть. К тому же так лишний раз не копируются большие объемы данных.

Не все расширения фреймворка совместимы с инструментом сжатия ассетов

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

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

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

Вывод: иметь в виду эту особенность при работе с расширениями использующими динамическое задание параметров ассетов в методе init().