問題:
- 當我們修改js和css檔案時往往需要清除浏覽器的緩存,否則有些效果就看不到更新過後的。
- 通過對js,css檔案内容進行hash運算,生成一個檔案的唯一hash字元串(如果檔案修改則hash号會發生變化)
- 替換html中的js,css檔案名,生成一個帶版本号的檔案名,這樣加版本号的靜态檔案就不會存在緩存的問題了。
解決:
- gulp有自動化添加版本hash的插件gulp-rev,它的效果是更改檔案名,如下
<link rel="stylesheet" href="./css/jquery.e-calendar-de29b48f93.css">
<link rel="stylesheet" href="./css/base-8688d776d1.css">
<link rel="stylesheet" href="./css/style-93423ee3ca.css">
gulp直接更改了檔案名,而我們想要的效果則是下面這種添加版本号。
<link rel="stylesheet" href="./css/jquery.e-calendar.css?v=de29b48f93">
<link rel="stylesheet" href="./css/base.css?v=8688d776d1">
<link rel="stylesheet" href="./css/style.css?v=93423ee3ca">
- 是以我們需要更改一下gulp的檔案,更改gulp-rev和gulp-rev-collector
打開node_modules\gulp-rev\index.js
-
第144行 manifest[originalFile] = revisionedFile; 更新為:
manifest[originalFile] = originalFile + ‘?v=’ + file.revHash;
打開nodemodules\gulp-rev\nodemodules\rev-path\index.js
- 10行 return filename + ‘-’ + hash + ext;
- 更新為: return filename + ext;
打開node_modules\gulp-rev-collector\index.js
- 31行if ( !_.isString(json[key]) ||path.basename(json[key]).replace(new RegExp( opts.revSuffix ), ” )
-
更新為: if ( !_.isString(json[key]) || path.basename(json[key]).split(‘?’)[0] !== path.basename(key) ) {
可能你會找不到這一句沒關系,把40行按下修改
let cleanReplacement = path.basename(json[key]).replace(new RegExp( opts.revSuffix ), '' );
修改為:
let cleanReplacement = path.basename(json[key]).split('?')[0];
再執行gulp指令,得到的結果如下(效果正确):
<link rel="stylesheet" href="../css/default.css?v=803a7fe4ae">
<script src="../js/app.js?v=3a0d844594"></script>