Yii2资产包 - 单文件位置

8
我正在使用Yii2框架开发Web应用。定义(扩展)了新的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个回答

9

其中的一个变体是将该文件作为单独的资产类别:

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'];
    ...
}

我原以为在基类中可以进行配置。但看起来这是唯一的方式。感谢您的回答。 - user779294

2

我很高兴地说,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文件的选择部分中。


0

我不知道是否有官方的方法来做到这一点(可能没有,因为这会使options对象的规范过于复杂),但是与被接受的答案相比,还有另一种更简单的方法,不需要您创建另一个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);
}

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接