yii2资产包 - 单个文件位置

时间:2015-06-01 12:27:41

标签: yii2 assetbundle

我在Yii2框架上做一个网络应用程序。定义(扩展)新的AssetBundle

class NeonAsset extends AssetBundle {
   public $sourcePath = '@app/themes/neon/';

   public $css = [
    'css/font-icons/entypo/css/entypo.css',
    '...',
    '...'        
   ];

   public $js = [
      'js/be_in_head_tag.js',
      '...',
      '...',
   ];
}

渲染时,CSS文件发布在<head>标记中,JS文件发布在<body>标记的底部。没关系。
但我希望在be_in_head_tag.js标记中发布一个<head>文件。当我使用$jsOptions时,它会将所有JS文件移动到<head>标记中 是否可以只为一个文件制作选项?

3 个答案:

答案 0 :(得分:7)

其中一个变体将该文件转换为单独的资产类:

class HeadPublishAsset extends AssetBundle {
    public $sourcePath = '@app/themes/neon/';
    public $js = ['js/be_in_head_tag.js'];
    public $jsOptions = ['position' => \yii\web\View::POS_HEAD];
}

并为您的基类添加依赖项,如:

class NeonAsset extends AssetBundle {
    ...
    public $depends = ['app\assets\HeadPublishAsset'];
    ...
}

答案 1 :(得分:0)

我不知道是否有正式的方式(可能不会使options对象的规范过于复杂),但是与接受的答案相比,还有另一种更简单的方法。 t要求您创建另一个AssetBundle

您需要做的就是创建另一个数组,例如:

public $head_js =
[
  "path/to/src.js"
];

然后覆盖registerAssetFiles函数,如下所示:

public function registerAssetFiles($view)
{
  foreach($this->head_js as $js)
  {
    $options = [];
    $options["position"] = \yii\web\View::POS_HEAD;
    $url = Url::to($this->baseUrl . "/" . $js);
    $view->registerJsFile($url, $options);
  }

  parent::registerAssetFiles($view);
}

答案 2 :(得分:0)

我很高兴地说,在某些时候,已经在Yii2中添加了在文件级别执行此操作的功能。但是,它没有出现在任何文档示例中。我已经测试并确认...

class NeonAsset extends AssetBundle {
   public $sourcePath = '@app/themes/neon/';

   public $css = [
    'css/font-icons/entypo/css/entypo.css',
    '...',
    '...'        
   ];

   public $js = [
      ['js/be_in_head_tag.js', 'position' => \yii\web\View::POS_HEAD],
      '...',
      '...',
   ];
}

$js数组中包含的选项现在传递到相关方法,并导致文件包含在html文件的选定部分中。