yii2 资产包 - 单个文件位置

yii2 asset bundle - single file position

我正在 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> 标签底部。没关系。
但我想在 <head> 标签中发布一个 be_in_head_tag.js 文件。当我使用 $jsOptions 时,它会将所有 JS 文件移动到 <head> 标签中。
是否可以只为一个文件设置选项?

其中一个变体将该文件变成单独的资产 class:

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 添加依赖项,例如:

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

我不知道是否有官方的方法(可能不会,因为它会使 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);
}

我很高兴地说,在文件级别执行此操作的能力已在某个时候添加到 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 文件的选定部分中。