Yii2组合和压缩资产不适用于成捆的捆包

问题描述 投票:8回答:1

我无法理解Yii2资产的合并和压缩方式。我仍然阅读了指南(http://www.yiiframework.com/doc-2.0/guide-structure-assets.html)中的部分,但仍然无法使它起作用,或者至少不了解此问题的基本知识。

从给出的示例中,我无法重现该问题并解决以下情况。

AppAsset包含应用程序的主要css / js。应该在此处包含共享的基本代码。该文件依赖于另一个名为ExternalAssets的文件,该文件又依赖于YiiAsset,BootstrapAsset等。

CheckoutAsset包含仅与结帐过程相关的代码。上述内容也应包括在内,因为它添加了自定义功能,但仅与本节相关。 $取决于AppAsset。

ProductViewAsset与上述相同,但与给定产品的可视化有关。

给出资产配置:

'bundles' => [
    'yii\web\JqueryAsset',
    'rmrevin\yii\fontawesome\AssetBundle',
    'yii\web\YiiAsset',
    'yii\bootstrap\BootstrapAsset',
    'yii\bootstrap\BootstrapPluginAsset',
    'yii\widgets\ActiveFormAsset',
    'frontend\assets\ExternalAssets',
    'frontend\assets\AppAsset',
],
'targets' => [
    'app' => [
        'class' => 'yii\web\AssetBundle',
        'basePath' => '@webroot/assets',
        'baseUrl' => '@web/assets',
        'js' => 'js/app-{hash}.js',
        'css' => 'css/app-{hash}.css',
        'depends' => [ ],
    ],
]

此时,我可以压缩所有应该通用的内容(尽管可能会剥离一些不必要的文件),但是在使用ProductViewAsset或CheckoutAsset的页面中,其中包含的文件不会在同样的时尚。

也许可以在签出过程中将所有内容压缩到单个文件(通用数据+签出数据),或者可能不是由于缓存原因。不知道这是否可能,但我无法使其工作。据我所知。我尝试这样做是因为它看起来很自然,但是在尝试创建不同的资产捆绑包组时,我开始出现类似这样的错误PHP注意'yii \ base \ ErrorException',并显示消息'Undefined index:frontend \ assets \ ExternalAssets'

'targets' => [
    'app' => [
        'class' => 'yii\web\AssetBundle',
        'basePath' => '@webroot/assets',
        'baseUrl' => '@web/assets',
        'js' => 'js/app-{hash}.js',
        'css' => 'css/app-{hash}.css',
        'depends' => [
           // 'frontend\assets\ExternalAssets'
        ],
    'checkout' => [
        'class' => 'yii\web\AssetBundle',
        'basePath' => '@webroot/assets',
        'baseUrl' => '@web/assets',
        'js' => 'js/checkout-{hash}.js',
        'css' => 'css/checkout-{hash}.css',
        'depends' => [
           'frontend\assets\AppAssets'
        ],
    ],

也许我在这里寻找错误的方法,但是我无法完全弄清楚这样做的最佳方法。我认为将所有内容压缩到单个文件比不合并和压缩文件要好,但我认为在这种情况下可以优化合并和压缩方法。

谢谢!

php compression yii2 assets
1个回答
0
投票

分组资产捆绑我们已经说明了如何将所有资产捆绑包合并为一个捆绑包,以最大程度减少对应用程序中引用的资产文件的HTTP请求。在实践中,这并非总是可取的。例如,假设您的应用程序有一个“前端”和一个“后端”,每个后端使用一组不同的JavaScript和CSS文件。在这种情况下,将两端的所有资产束组合为一个是没有意义的,因为“前端”不使用“前端”的资产束,这将浪费发送网络的带宽。请求“前端”页面时的“后端”资产。

要解决上述问题,您可以将资产捆绑包分成几组,并为每个组组合资产捆绑包。以下配置显示了如何对资产捆绑包进行分组:

return [
    ...
    // Specify output bundles with groups:
    'targets' => [
        'allShared' => [
            'js' => 'js/all-shared-{hash}.js',
            'css' => 'css/all-shared-{hash}.css',
            'depends' => [
                // Include all assets shared between 'backend' and 'frontend'
                'yii\web\YiiAsset',
                'app\assets\SharedAsset',
            ],
        ],
        'allBackEnd' => [
            'js' => 'js/all-{hash}.js',
            'css' => 'css/all-{hash}.css',
            'depends' => [
                // Include only 'backend' assets:
                'app\assets\AdminAsset'
            ],
        ],
        'allFrontEnd' => [
            'js' => 'js/all-{hash}.js',
            'css' => 'css/all-{hash}.css',
            'depends' => [], // Include all remaining assets
        ],
    ],
    ...
];

如您所见,资产捆绑包分为三组:allShared,allBackEnd和allFrontEnd。它们每个都依赖于一组适当的资产捆绑。例如,allBackEnd取决于app \ assets \ AdminAsset。当使用此配置运行资产命令时,它将根据上述规范组合资产束。

© www.soinside.com 2019 - 2024. All rights reserved.