Yii2 资产清除缓存
Posted
技术标签:
【中文标题】Yii2 资产清除缓存【英文标题】:Yii2 assets clear cache 【发布时间】:2014-09-09 06:00:30 【问题描述】:每次我更新 infoweb\menu\module\assets 中的 css 或 js 文件时,我都必须清空 backend\web\assets 文件夹 有没有办法自动清除资产缓存?
【问题讨论】:
也检查一下:***.com/questions/37723515/… 【参考方案1】:我在视图文件中使用CClientScript::registerScriptFile
方法:
Yii::app()->clientScript->registerScriptFile(
$this->getAssetsBase() . '/js/script.js'
);
如果我修改了 script.js,在下一页重新加载后我会看到所有的变化
对于 css 文件 - CClientScript::registerCssFile
Yii::app()->clientScript->registerCssFile(
$this->getAssetsBase() . '/css/style.css'
);
更新:如果您使用 yii 2.0 beta,您可以在此处阅读有关客户端助手机制更改的一些信息:link
【讨论】:
这不是我需要的 我在 yii2 doc 中发现了一个特殊的方法 publish(),你可以通过 forceCopy => true 传入方法 $options 参数,你编辑的文件将被重写到 assets 文件夹中,链接:yiiframework.com/doc-2.0/… 你能举一个有效路径的例子吗?【参考方案2】:在你的视图中添加这个:
use vendor\myVendorName\myPackageName\assets\AppAsset;
AppAsset::register($this);
在你的配置中添加这个:
'components' => [
'assetManager' => [
'linkAssets' => true,
],
]
清空资产文件夹,然后刷新,完成
【讨论】:
这样做有什么缺点吗?为什么这不是默认值? 我认为“选项跟随符号链接”不是服务器上的默认设置:stuff.cebe.cc/yii2docs/… 好的。如果你能回答这个问题,还有一件事:什么时候创建一个新的资产子文件夹(如“8f02e6b5”)?随着时间的推移,我有超过 20 个这样的文件夹。而且我不知道它们是什么时候创建的。在我看来,并不是 JS 文件中的每次更改都如此。 我认为 yii 为您在视图中注册的每个资产包创建一个资产文件夹,文件夹内是您的 js 文件,每次您进行更改时都会更新(如果您使用 linkassets => true但你明白了) 注意:使用 linkAssets 时,您还可以使用 chrome 的“将文件夹添加到工作场所”并在调试时更改浏览器中的 js 库。【参考方案3】:还有额外的属性
if (YII_ENV_DEV)
...;
...;
...;
$config['components']['assetManager']['forceCopy'] = true;
...;
...;
发布之前发布过的文件
【讨论】:
为什么人们不使用 gulp 或 grunt 以及像 bower 或 npm 这样的包管理器......?它就是这么简单.... 因为这是 Yii2 - AssetsBundle 的内置功能。 你可以结合资产管理器在yii中使用bower forceCopy 不建议在生产中使用,因为它非常昂贵(请参阅AssetManager::publish() 的注释)。 这是正确的@robsch,这就是为什么 JustSamter 的回答建议只为开发环境启用 forceCopy。【参考方案4】:如果您正在开发自己的插件,您可以强制发布每个捆绑包的资产 (注意:$sourcePath 应该设置)
<?php
namespace app\components\forms\redactorAssets;
use yii\web\AssetBundle;
class RedactorCutAsset extends AssetBundle
public $sourcePath = '@app/components/forms/redactorAssets/assets';
public $js = [
'cut.js',
];
public $publishOptions = [
'forceCopy'=>true,
];
【讨论】:
永远不要在扩展中这样做——当 3r-party 插件强制使用这个选项时,这是非常烦人的。刷新资产是一个应用程序问题,应该在应用程序级别解决。 我记得,这个解决方案仅适用于插件开发阶段【参考方案5】:AssetManager 将根据文件修改时间创建一个哈希。更改任何文件时,目录的修改时间都不会改变。
如果您的 AssetBundle 的目录为 $sourcePath
,则使用目录的修改时间,哈希不会更改,并且不会将任何内容复制到 web/assets
目录。
我建议在子类中覆盖AssetManager::hash()
或为AssetManager::$hashCallback
编写函数:
'components' => [
'assetManager' => [
'hashCallback' => function($path)
// if: $path is directory: figure out when files were changed in directory
// else: use original hash function in \yii\web\AssetManager
],
]
有关在捆绑中的所有资产文件中查找最大修改日期的示例实现,您可以查看 wookie @http://php.net/manual/en/function.filemtime.php#35779 的此评论
请注意,对任何资产文件的修改都会在web/assets
中创建一个新目录,并且仍然需要定期清理。但是,除了浏览器缓存,刷新页面会跟随最新的变化。
【讨论】:
【参考方案6】:我在 main-local.php 中为这样的开发环境配置了assetManager::forceCopy=true
return [
'components' => [
...
'assetManager' => [
'forceCopy' => true,
]
...
],
];
【讨论】:
你可以使用 YII_DEBUG 常量而不是对真/假进行编码,所以它在生产中被关闭【参考方案7】:如果您的环境是生产环境,我建议使用Cache Busting:
return [
// ...
'components' => [
'assetManager' => [
'appendTimestamp' => true,
],
],
];
有关资产的更多信息,请阅读Assets Yii2 documentation。
【讨论】:
【参考方案8】:sudo rm -rf frontend/web/assets/*
sudo chmod 777 frontend/web/assets
./yii cache/flush-all
如果这不起作用:
sudo rm -rf vendor/*
composer install
【讨论】:
以上是关于Yii2 资产清除缓存的主要内容,如果未能解决你的问题,请参考以下文章