2

アセットバンドルyii2のjsセクションにディレクトリ全体を追加する方法

こんな感じになると思います

class AppAsset extends AssetBundle
{
    public $basePath = '@webroot';
    public $baseUrl = '@web';
    public $css = [
        'css/site.min.css',
    ];
    public $js = [
        'js/myModule/*',
    ];
    public $depends = [
        'yii\web\YiiAsset',
        'yii\bootstrap\BootstrapAsset',
    ];
}

毎回(cssまたはjsを縮小するときに)アセットバンドルに次のようなものを書きたくないので、これが必要です

'css/site.min.css',

書く代わりに、'module.min.js', 'module2.min.js'ディレクトリからすべてのファイルを収集してアセットバンドルに追加する正規表現(ディレクトリ全体を追加する)のようなものを書きたいと思います。$js配列は次のようになります

'js/myModule/*',

では、それを実装する方法は?「すぐに使える」ソリューションはどこにありますか? 助けてください。私がこれを尋ねるのは、「私 (gulp やさまざまなミニフィケーターなどを使用している) がアセット バンドルに書き込むのは正常ですmodule.min.cssか? module.min.js

4

2 に答える 2

1

Yii2ドキュメントのアセット ページに依存して、この機能をすぐに実装する方法はありません。

ただし、クラスinit()のメソッドをオーバーライドして、フォルダーの解析を実装し ( FileHelperを介して)、配列に動的に追加することができます。AppAsset$this->js

それを行うもう 1 つの方法 (私が個人的に使用する方法) は、assets.jsongulp ファイルで使用されるファイルを解析し、gulp によって生成されるすべての js/css ファイルを追加することです。ここにコードサンプルがあります

<?php

namespace app\assets;

use yii\base\Exception;
use yii\web\AssetBundle;

class AppAsset extends AssetBundle
{
    public $basePath = '@webroot';
    public $baseUrl = '@web';
    public $css = [];
    public $js = [];
    public $depends = [
        'yii\web\YiiAsset',
        'yii\web\JqueryAsset',
        'yii\widgets\ActiveFormAsset',
        'yii\validators\ValidationAsset'
    ];

    public $packages = [];

    public function init()
    {
        parent::init();

        $content = @file_get_contents(\Yii::getAlias('@app/assets.json'));
        if (!$content) {
            throw new Exception('Could not read assests from path ' . \Yii::getAlias('@app/assets.json'));
        }
        $assetsData = json_decode($content, true);

        if (!empty($assetsData['scripts'])) {
            foreach ($assetsData['scripts'] as $script) {
                if (in_array($script['name'], $this->packages, true) && $this->loadInAjax($script)) {
                    $this->js[] = 'scripts/' . $script['name'] . '.js';
                }
            }
        }

        if (!empty($assetsData['styles'])) {
            foreach ($assetsData['styles'] as $style) {
                if (in_array($style['name'], $this->packages, true) && $this->loadInAjax($style)) {
                    $this->css[] = 'styles/' . $style['name'] . '.css';
                }
            }
        }

    }
}

それが役立つことを願っています。

于 2016-12-08T05:25:54.880 に答える