解决 Yii2 assets 不自动更新问题
问题描述:core 里的 Asset (AssetBundle)更新 js 或 css 时,更新内容没有直接同步到其他模块
-- 如果想节约时间,直接拖到文章底部看结果就好~
一、项目目录结构(大概介样子)

二、需求
我希望在 core 建一个目录来管理各模块共同的 js 和 css(非共同放 backend/web 里就好)
三、core 静态目录

注:$sourcePath 指定静态文件资源目录,$css 说明要引入的 css 文件,$js 说明要引入的 js 文件
四、具体配置
\core\common\config\bootstrap.php
Yii::setAlias('@statics', dirname(dirname(__DIR__)) . '/statics');
注:这里定义上一步 $sourcePath 里用到的目录别名
\core\common\config\main.php
<?php
// 检查目录下文件的修改时间
if (!function_exists('_checkfilemtime_')) {
function _checkfilemtime_($dir, $path, $pathHash) {
$handle = opendir($dir);
$hash = '';
while (false !== ($entry = readdir($handle))) {
if ($entry === '.' || $entry === '..') {
continue;
}
$file = $dir . '/' . $entry; if (is_dir($file)) {
_checkfilemtime_($file, $path, $pathHash);
} else {
$dist = Yii::getAlias('@backend') . '/web/assets/' . $pathHash . str_replace($path, '', $file);
if (!is_dir(dirname($dist))) {
mkdir(dirname($dist), 0755, true);
} // 两个文件的修改时间相差5分钟及以上,则重新生成文件
if (!file_exists($dist) || (filemtime($file)-filemtime($dist))>=300) {
file_put_contents($dist, file_get_contents($file));
}
}
}
};
} return [
...
'components' => [
...
'assetManager' => [
'hashCallback' => function ($path) {
// 保持和 vendor\yiisoft\yii2\web\AssetManager.php 里 hash 函数的算法一致
$pathHash = (is_file($path) ? dirname($path) : $path) . filemtime($path);
$pathHash = sprintf('%x', crc32($pathHash . Yii::getVersion())); // 处理二级目录
if (is_dir($path)) {
$path = str_replace("\\", "/", $path);
_checkfilemtime_($path, $path, $pathHash);
} return $pathHash;
}
],
...
]
];
注:
1、Yii2 默认的 asset 管理器只会判断 assets 内一级文件的修改时候(生成hash值),不会扫描判断 assets 内二级目录下的文件。这里需要自定义处理;
2、需要在配置里设定 components.assetManager.hashCallback 函数来自定义处理静态资源的 hash 判断(返回的 hash 值一样则不会重新 publish);
3、所以,一个简单的做法就是:扫目录,判断 filemtime,重新生成 hash 值。例如这篇文章说一这样:https://upliu.net/yii2-assetbundle-does-not-update-auto.html
4、如果直接用 filemtime 重新生成 hash 值,会有一个新问题。那就是 backend/web/assets 下的目录会越来越多(你修改了文件就会生成一个新目录,但旧目录不会被删除)。生成太多无用的旧目录也是挺让人头疼的。
5、所以,我的处理方法是:不改变 return 的 hash 值(不会生成新的目录),只替换有更新的文件。具体操作请看上面代码~
https://www.cnblogs.com/tujia/p/11114759.html
完
解决 Yii2 assets 不自动更新问题的更多相关文章
- js进阶解决浏览器缓存不能自动更新的问题(在ajax的url上带上一个参数,可以是日期,或者是随机数)(随机数Math.random)(取得日期的毫秒数:new Date().getTime();)
js进阶解决浏览器缓存不能自动更新的问题(在ajax的url上带上一个参数,可以是日期,或者是随机数)(随机数Math.random)(取得日期的毫秒数:new Date().getTime();) ...
- 忘记时间戳的存在——Yii2超实用的自动更新时间戳的Behavior(改进版)
本文改进了Yii2中内置行为类TimestampBehavior,使得时间戳字段(如created_at,updated_at) 完全自己更新,方便得让你忘记它们的存在. Yii2的内置行为类Time ...
- 解决“iOS 7 app自动更新,无法在app中向用户展示更新内容”问题
转自cocoachina iOS 7能在后台自动app,这对开发者来说和用户都很方便,但是还是有一些缺点.用户不会知道app本次更新的内容,除非他们上到app的App Store页面去查看.开发者也会 ...
- tk.mybatis通用插件updateByPrimaryKeySelective无法自动更新ON UPDATE CURRENT_TIMESTAMP列的解决办法
tk.mybatis是一个很好用的通用插件,把CRUD这些基本的数据操作全都用动态SQL语句自动生成了,mapper和xml里十分清爽,但是昨天发现有一个小坑,记录在此: 有一张表,结构如下(已经简化 ...
- 解决Debina系统自动更新软件包的问题
不知从何时开始,我的电脑每天开机连接上网络之后,不断的在下载数据,状态栏显示网速达到每秒1到2兆.开始我还不太在意,不过后来由于带宽全部被这种莫名其奥妙的下载占据了,我连网页都无否正常浏览了,所以我决 ...
- 解决Intellij Idea下修改jsp页面不自动更新
解决Intellij Idea下修改jsp页面不自动更新 On frame deactivation:被设置成了Do nothing 解决办法:改为Update resources(更新资源)或者Up ...
- 关闭win10 自动更新 及蓝屏解决办法
"控制面板-管理工具-服务"(或在"此电脑"鼠标右键,点击"管理"),找到Windows Update项目后,将"启动类型&quo ...
- VueApp 自动更新解决plus is not defined问题
一,今天用VueApp 做自动更新调用按照网上列子直接 Plus 打包编译后出现了plus is not defined 发现需要引用document.addEventListener("p ...
- 解析大型.NET ERP系统 自动更新
C/S架构的应用程序需要支持自动更新功能,当新版本程序发布后,正在运行的客户端能检测到新版本的程序,通知用户是否下载更新.工作以来参与过几个自动更新模块的设计与维护,撰文总结自动更新模块设计与实现. ...
随机推荐
- Mybatis框架进行批量导入和删除有三种方式
首先创建一个数据库 CREATE TABLE user ( id varchar(32) CHARACTER SET utf8 NOT NULL, name varchar(50) CHARA ...
- django小知识(2)
昨日内容回顾 1.choices参数 class Userinfo(models.Model): username = ... age = ... gender_choice = ( (1,'male ...
- ovirt磁盘类型(IDE, virtio, virtio-scsi)
ovirt磁盘类型辨析(IDE, virtio, virtio-scsi) 通过一张表格,简单明了的说明这三种硬盘的不同: 整体上来看这三者的最大不同还是挂载磁盘的数量.根据在ovirt的上测试,一台 ...
- Windows Automation API和自动化测试
https://zhuanlan.zhihu.com/p/22083601\ 感谢轮子哥点赞,这会儿消息扎堆过来了,轮带逛果然不是随便说说的…… 第二篇一个简单的Windows Automation ...
- Linux yum 包 下载地址
yum包网址: http://www.rpmfind.net/linux/rpm2html/search.php?query=yum
- MySQL的简单概念及软件安装
数据库的简介 一.数据库的基本概念:数据.数据库.数据库管理系统.数据库系统 数据:数据(Data)是用来记录信息的可识别符号,是信息的具体表现形式. 数据库:(1)数据库(Database,DB)是 ...
- vim文本编辑器——删除、复制、剪切、更改某一个字符、替换、撤销、关键字搜索
1.删除: (1)删除光标所在处的字符: 如上图所示:点击一次x键只能删除一个字符. (2)删除光标所在处后的n个字符(nx): 删除前: 输入6x: (3)删除光标所在的行(dd): 删除前: 输入 ...
- 使用google autoservice 自动生成java spi 描述文件
spi 是一种服务发现的标准,对于开发中我们通常需要编写 META-INF/services 文件夹中定义的类. google auto 中的autoservice 可以帮助我们生成对应的配置,很方便 ...
- 【CSP-S膜你考】即时战略(模拟)
Problem B. 即时战略 (rts.c/cpp/pas) 注意 Input file: rts.in Output file: rts.out Time Limit : 2 seconds Me ...
- bootstrap入门&栅格系统
一.概述 1. 概念: 一个前端开发的框架,Bootstrap,来自 Twitter,是目前很受欢迎的前端框架.Bootstrap 是基于 HTML.CSS.JavaScript 的,它简洁灵活,使得 ...