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 资产清除缓存的主要内容,如果未能解决你的问题,请参考以下文章

从 Rails 资产管道中清除缓存

json 版本化资产(强制清除缓存)

如何为 Blazor Web Assembly 实现缓存清除

android 清除缓存功能如何实现

linux中缓存怎样清除

求助高手:怎么清除NETBIOS的缓存