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 文件的选定部分中。
我正在 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 文件的选定部分中。