Автоматическое подключение js файлов в Yii Framework
Если посмотреть js файлы многих сайтов, то, в большинстве случаев, можно увидеть файлы типа scripts.js, main.js, functions.js и т.д. в которых тысячи строк самых разных скриптов, и половина которых скорее всего не нужна на этой странице. Другой крайностью является десятка два подключаемых файлов, которые создают лишнюю нагрузку на сервер.
При разработке приложений на Yii я выработал следующую методику организации js файлов.
В webroot/js создаются папки с названиями контроллеров, например:
- js/site
- js/articles
Если для реализации функционала экшена контроллера необходим свой js код, то он кладется в свою папку и файл с названием экшена.
- js/articles
- js/articles/update.js
- js/articles/selectground.js
Бывают случаи, когда необходимо вынести общую часть когда — создается файл shared.js который включается для всех экшенов.
В процессе разработки удобно, когда код разнесен по разным файлам, в продакшене используется объединение и сжатие скриптов с помощью расширения cclientscriptminify.
На заключение, код который автоматически подключает необходимые файлы, поместить в components/Controller.php
/** * Вспомогательные действия * * @param $action * @return bool */ public function beforeAction($action) { parent::beforeAction($action); $actionScriptFile = Yii::getPathOfAlias("webroot.js.".Y::app()->controller->id) .'/'.Y::app()->controller->action->id . '.js'; if (file_exists($actionScriptFile)) { Yii::app()->clientScript->registerScriptFile(Html::asset($actionScriptFile)); } $sharedScriptFile = Yii::getPathOfAlias("webroot.js.".Y::app()->controller->id) .'/shared.js'; if (file_exists($sharedScriptFile)) { Yii::app()->clientScript->registerScriptFile(Html::asset($sharedScriptFile)); } return true; }