AssetManager::$bundles

Предварительное обсуждение найденных ошибок перед отправкой их авторам фреймворка, а также внесение новых предложений.
Ответить
IvanChe
Сообщения: 89
Зарегистрирован: 2012.11.25, 18:55

AssetManager::$bundles

Сообщение IvanChe »

Не знаю баг это или нет, но поведение явно не интуитивно понятное.
Я настроил сжатие скриптов, всё хорошо сработало: создались сжатые файлы(all.min.js и all.min.css), создался конфиг с переопределенными бандлами. Но на странице стали загружаться и только что созданные сжатые файлы, и просто файлы из бандлов не сжатые.
Причина оказадась в том, как определять бандл. Если мы в бандле пишем так:

Код: Выделить всё

class BootstrapAsset extends AssetBundle
{
    public $sourcePath = '@frontend/assets/vendor/bootstrap';
    public $css = [
        'css/bootstrap.css',
    ];
    public $depends = [
        'yii\bootstrap\BootstrapAsset',
    ];
} 
то всё будет норм и на странице загрузится только файл all.min.css.
Но если мы напишем так:

Код: Выделить всё

class BootstrapAsset extends AssetBundle
{
    public function init()
    {
        $this->sourcePath = '@frontend/assets/vendor/bootstrap';

        $this->css = [
            'css/bootstrap.css',
        ];

        $this->depends = [
            \yii\bootstrap\BootstrapAsset::className(),
        ];
    }
} 
то на странице будут загружаться и css/bootstrap.css, и all.min.css
Почему так происходит ?
zelenin
Сообщения: 10596
Зарегистрирован: 2013.04.20, 11:30

Re: AssetManager::$bundles

Сообщение zelenin »

кажется мне, чтовы нашли неверную закономерность.
IvanChe
Сообщения: 89
Зарегистрирован: 2012.11.25, 18:55

Re: AssetManager::$bundles

Сообщение IvanChe »

несколько раз проверил на нескольких бандлах. А именно на 3х бандлах проверил на 2х разных серверах. Долго искал причину, почему вместе с сжатым файлом выводятся и обычные. Заметил, что выводились так не для всех бандлов, которые пожались. Стал их сравнивать, долго ковырялся в ядре yii. Попробовал вынести из метода init() объявление свойств и всё стало норм.
Выложу более подробно код.
В layouts/main.php вызываю

Код: Выделить всё

frontend\assets\AppAsset::register($this);
Основной бандл frontend\assets\AppAsset

Код: Выделить всё

class AppAsset extends AssetBundle
{
    public function init()
    {
        $this->basePath = '@webroot';
        $this->baseUrl = '@web';
        $this->css = [
            'css/all.css',
        ];
        $this->js = [
            'js/functions.js',
            'js/cookie.js',
        ];
        $this->depends = [
            'yii\web\YiiAsset',
            'frontend\assets\BootstrapAsset',
            'yii\bootstrap\BootstrapPluginAsset',
            \frontend\assets\BxSliderAsset::className(),
        ];
    }
}
Бандл frontend\assets\BootstrapAsset

Код: Выделить всё

class BootstrapAsset extends AssetBundle
{
    public function init()
    {
        $this->sourcePath = '@frontend/assets/vendor/bootstrap';

        $this->css = [
            'css/bootstrap.css',
        ];

        $this->depends = [
            \yii\bootstrap\BootstrapAsset::className(),
        ];
    }
}
Новый бандл для пожатых файлов

Код: Выделить всё

class AppMinAsset extends AssetBundle
{
    public function init()
    {
        $this->basePath = '@webroot/min';
        $this->baseUrl = '/min';
    }
}
Стоило мне вынести в AppAsset бандле определение свойств из метода init(), как сразу стал рендерить только 1 нужный сжатый файл. Иначе рендерил сжатый файл самым первым, а затем все файлы, которые он сжимал ) И скрипты, и стили - аналогично.
vismut
Сообщения: 64
Зарегистрирован: 2014.10.01, 16:46

Re: AssetManager::$bundles

Сообщение vismut »

parent::init() делал?
Ответить