qiuxis 2016-11-23 23:58:36 7419次浏览 4条回复 4 1 0

有2需求 1、我有页面 index.php?r=site/index 还有 index.php?r=site/error 等多个页面 如果每个页面加载的前端文件都一样会非常浪费资源,另外有些前端文件会彼此影响可能还出现错误,这该如何是好? 如何让这些页面根据需要去加载前端文件呢?

2、另外我还想在用 composer 更新我系统的时候,这些前端文件也跟着更新?这该如何是好?

可行方案举例

backend/asset/Myasset.php

<?php
namespace backend\assets ;

use yii\base\Exception;
use yii\web\AssetBundle as BaseAdminLteAsset;
 
class Myasset extends BaseAdminLteAsset
{
    public $sourcePath = '@bower';
    public $css = [
        'bootstrap/dist/css/bootstrap.min.css',
    ];
    public $js = [];
    public $depends = [
        'backend\assets\AppAsset',
        'backend\assets\YiiAsset',
    ];
 
    /**
     * @inheritdoc
     */
    public function init()
    {
        $action_id = \Yii::$app->controller->action->id ;
        if ($action_id =='error') {
            $this->depends[] = 'backend\assets\ErrorAsset';
        } else {
            $this->depends[] = 'backend\assets\CssJsAsset';
        }

        parent::init();
    }
}

?>

backend/asset/ErrorAsset.php

<?php
namespace backend\assets ;

use yii\web\AssetBundle;
 
class ErrorAsset extends AssetBundle
{
    public $sourcePath = '@bower';
    public $css = [
        'font-awesome/css/font-awesome.min.css',
    ];
    public $js =[
        'adminedd/dist/js/111.js',
        'adminedd/dist/js/222.js',
    ];
}
?>

backend/asset/CssJsAsset.php

<?php
namespace backend\assets ;

use yii\web\AssetBundle;
 
class CssJsAsset extends AssetBundle
{
    public $sourcePath = '@bower';
    public $css = [
        'font-awesome/css/font-awesome.min.css',
		'font-awesome/css/ssddd.css',
    ];
    public $js =[
        'adminedd/dist/js/111.js',
        'adminedd/dist/js/222.js',
		'adminedd/dist/js/444.js',
		'adminedd/dist/js/444.js',
    ];
}
?>

backend/views/layouts/main.php

<?php 
...
backend\assets\Myasset::register($this);
...
?>

前端工具直接都下载到 @bower (vendor/bower) 文件夹下

composer.json

...
  "require": {
    "php": ">=5.4.0",
    "yiisoft/yii2": ">=2.0.6",
 
 
    "bower-asset/Font-Awesome": "*",
    "bower-asset/ionicons": "*"
  },
...

注:跟着测试有问题留言

觉得很赞
  • 回复于 2016-11-24 00:02 举报

    粗看以为是提问,细看原来是教程。

  • 回复于 2016-11-24 00:04 举报

    每个页面加载同样的资源未必会非常浪费资源,因为浏览器会有缓存。
    当然,首次加载时,越少越好,减少等待时间,提升用户的体验。

    1 条回复
    回复于 2016-11-24 00:11 回复

    嗯,也是有道理的。有些页面可能就加载一个前端文件就行了。抛砖引玉,好不容易有人回复,THANKS ( ̄▽ ̄)"

  • 回复于 2016-12-05 15:55 举报
     if ($action_id =='error') {
            $this->depends[] = 'backend\assets\ErrorAsset';
        } else {
            $this->depends[] = 'backend\assets\CssJsAsset';
        }
    

    这里 $action_id =='error',建议使用依赖注入(DI),在 new 的时候传入配置参数,根据参数判断依赖的 asset,采用这种方式来达到 松耦合。

    2 条回复
    回复于 2016-12-05 17:42 回复

    有个例子就好了

    回复于 2016-12-14 10:29 回复

    额忘记了 AssetBundle 的实例化方式是通过 register 静态方法在视图中注册,也就是说没法在 new 的时候传入配置参数。
    那么只好用一种相当 low 的方式,就是添加一个静态属性,在视图中设置它,在 bundle 的 init 方法里根据这个属性来判断添加那个依赖。

    AppAsset.php

    class AppAsset extends AssetBundle
    {
        public static $group;
        ....
        public function init() {
            if(self::$group == 'error') {
               .....
            }
        }
    }
    

    view.php

    use app\assets\AppAsset;
    
    AppAsset::$group = 'error';
    AppAsset::register($this);
    
    
    觉得很赞
  • 回复于 2017-04-24 13:45 举报

    mark下

您需要登录后才可以回复。登录 | 立即注册