你是否遇到过:改了css,改了js,替换了图片,但是没有生效的情况呢?
这个问题其实是浏览器缓存了css,js,和图片所造成的
解决方案:
1:如果你是前后端分离的开发模式,那么使用webpack等打包工具生成md5就可以解决了,这个方案是目前的主流方法。
但是,现在还存在大部分并非是前后端分离的项目需要我们维护
那么,我们可以通过使用一些脚本语言来动态改变对应url的版本号来解决
贴上php代码:
<?php /* Creat by xiaolu289 2017/9/7 11:19 该脚本解决更换图片后浏览器还是旧图片的问题 */ $baseDir = __DIR__; $publicDir = "{$baseDir}/Public"; $viewDir = "{$baseDir}/Application/Home/View"; $cssDirs = array( "{$publicDir}/css", "{$publicDir}/mobile/css", ); $imgReg = "/([\w-]+\.(?:png|jpg|gif))(?:\?[\w]+=[\w]+)?/"; $cssReg = "/([\w-]+\.(?:css))(?:\?[\w]+=[\w]+)?/"; $VERSION = time(); /* 队列方式遍历文件夹 参考链接:http://blog.csdn.net/nuli888/article/details/52144752 */ function read_dir_queue($dir){ $files=array(); $queue=array($dir); while($data=each($queue)){ $path=$data['value']; if(is_dir($path) &&$handle=opendir($path)){ while($file=readdir($handle)){ if($file=='.'||$file=='..') continue; $files[] = $real_path=$path.'/'.$file; if (is_dir($real_path)) $queue[] = $real_path; } } closedir($handle); } return $files; } // 遍历所有css目录 foreach($cssDirs as$item){ $cssFiles = read_dir_queue($item); foreach($cssFiles as$item){ if(is_file($item)){ // 设置版本号 $fileContent=file_get_contents($item); file_put_contents($item,preg_replace($imgReg,"$1?v={$VERSION}",$fileContent)); } } } // 遍历view目录 $viewFiles=read_dir_queue($viewDir); foreach($viewFiles as$item){ if(is_file($item)){ // 设置版本号 $fileContent=file_get_contents($item); $fileContent=preg_replace($imgReg,"$1?v={$VERSION}",$fileContent); file_put_contents($item,preg_replace($cssReg,"$1?v={$VERSION}",$fileContent)); } }