Yii2 asset bundle-позиция одного файла

Я делаю веб-приложение на Yii2 framework. Определенный (расширенный) новый 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 ответов


один из вариантов делает этот файл отдельным классом активов:

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

Я не знаю, есть ли официальный способ сделать это (возможно не так, как это сделает спецификация options объект слишком сложный), однако есть еще один более простой способ по сравнению с принятым ответом, который не требует от Вас создания другого AssetBundle.

все, что вам нужно сделать, это создать еще один массив, например:

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

затем переопределить


Я рад сказать, что возможность сделать это на уровне файла была добавлена в 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-файла.