【发布时间】:2014-09-09 06:00:30
【问题描述】:
每次我更新 infoweb\menu\module\assets 中的 css 或 js 文件时,我都必须清空 backend\web\assets 文件夹
有没有办法自动清除资产缓存?
【问题讨论】:
每次我更新 infoweb\menu\module\assets 中的 css 或 js 文件时,我都必须清空 backend\web\assets 文件夹
有没有办法自动清除资产缓存?
【问题讨论】:
我在视图文件中使用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
【讨论】:
在你的视图中添加这个:
use vendor\myVendorName\myPackageName\assets\AppAsset;
AppAsset::register($this);
在你的配置中添加这个:
'components' => [
'assetManager' => [
'linkAssets' => true,
],
]
清空资产文件夹,然后刷新,完成
【讨论】:
还有额外的属性
if (YII_ENV_DEV) {
...;
...;
...;
$config['components']['assetManager']['forceCopy'] = true;
...;
...;
}
发布之前发布过的文件
【讨论】:
如果您正在开发自己的插件,您可以强制发布每个捆绑包的资产 (注意:$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,
];
}
【讨论】:
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 中创建一个新目录,并且仍然需要定期清理。但是,除了浏览器缓存,刷新页面会跟随最新的变化。
【讨论】:
我在 main-local.php 中为这样的开发环境配置了assetManager::forceCopy=true
return [
'components' => [
...
'assetManager' => [
'forceCopy' => true,
]
...
],
];
【讨论】:
如果您的环境是生产环境,我建议使用Cache Busting:
return [
// ...
'components' => [
'assetManager' => [
'appendTimestamp' => true,
],
],
];
有关资产的更多信息,请阅读Assets Yii2 documentation。
【讨论】:
sudo rm -rf frontend/web/assets/*
sudo chmod 777 frontend/web/assets
./yii cache/flush-all
如果这不起作用:
sudo rm -rf vendor/*
composer install
【讨论】: