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.cssmodule.min.js'

4

2 回答 2

1

依靠Yii2 文档的资产页面,无法开箱即用地实现此功能。

但是您可以覆盖类的init()方法AppAsset来实现解析文件夹(参见 FileHelper)并将其$this->js动态添加到数组中。

另一种方法(我个人使用)是解析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 回答
0

使用@naffiq 的建议,我想出了以下代码:

<?php

namespace frontend\assets;

use yii\web\AssetBundle;
use yii\helpers\FileHelper;

abstract class StarAssetBundle extends AssetBundle
{

    private $filePathOptions = [
        'only' => ['*.js'],
        'recursive' => false,
    ];

    public function init()
    {
        $realSourcePath = \Yii::getAlias($this->sourcePath);

        $fileHelper = new FileHelper();

        $jsFiles = $this->js;

        $parsedJsFiles = array();

        foreach($jsFiles as $uri){
            $path = $this->strReturnIfContainsStarAtEnd($uri);
            if($path){
                $dir = $realSourcePath.'/'.$path;
                $arrFiles = $fileHelper->findFiles($dir, $this->filePathOptions);
                foreach ($arrFiles as $file) {
                    $jsFilePath = $path . '/' . basename($file);
                    array_push($parsedJsFiles, $jsFilePath);
                }
            }
            else
            {
                array_push($parsedJsFiles, $uri);
            }
        }
        $this->js = $parsedJsFiles;

        parent::init();
    }
    private function strReturnIfContainsStarAtEnd($str){
        $strLen = strlen($str);
        $pos = strpos($str, "*", $strLen-1);
        if($pos !== false){
            return substr($str, 0, $strLen-2);
        }
        else{
            return false;
        }
    }
}

现在我可以添加仅编码路径的所有 .js 文件并在末尾添加 * - 'js/myModule/*'

于 2019-01-18T12:57:40.957 回答