最近用cocos js在做h5遊戲,經常更新之後,要清理瀏覽器緩存才能更新資源,代碼,但是如果是嵌入到app裏的h5遊戲,比如直播中嵌入遊戲,不要說很多用戶不知道在哪裏清緩存,就算用戶知道,這樣的操作也非常影響用戶體驗,所以就研究了下用版本號進行熱更新的辦法。
其實說起來很簡單,主要就是找到CCBoot.js,在:項目名\frameworks\cocos2d-html5\CCBoot.js,裏面有個_loadConfig,這個函數是加載project.json的,給這裏的project.json加上版本號,每次更新的時候,只要修改project.json裏面相應的js文件的版本號,退出之後再進,就會加載新的js文件.
下面放上原來的函數和修改的地方,以及修改過後的函數
原函數
_loadConfig: function () {
// Load config
// Already loaded
if (this.config) {
this._initConfig(this.config);
return;
}
// Load from document.ccConfig
if (document["ccConfig"]) {
this._initConfig(document["ccConfig"]);
}
// Load from project.json
else {
try {
var cocos_script = document.getElementsByTagName('script');
for(var i = 0; i < cocos_script.length; i++){
var _t = cocos_script[i].getAttribute('cocos');
if(_t === '' || _t) {
break;
}
}
var _src, txt, _resPath;
if(i < cocos_script.length){
_src = cocos_script[i].src;
if(_src){
_resPath = /(.*)\//.exec(_src)[0];
cc.loader.resPath = _resPath;
_src = cc.path.join(_resPath, 'project.json'); //這裏加版本號
}
txt = cc.loader._loadTxtSync(_src);
}
if(!txt){
txt = cc.loader._loadTxtSync("project.json");//這裏加版本號
}
var data = JSON.parse(txt);
this._initConfig(data || {});
} catch (e) {
cc.log("Failed to read or parse project.json");
this._initConfig({});
}
}
},
修改過後的函數
_loadConfig: function () {
// Load config
// Already loaded
if (this.config) {
this._initConfig(this.config);
return;
}
// Load from document.ccConfig
if (document["ccConfig"]) {
this._initConfig(document["ccConfig"]);
}
// Load from project.json
else {
try {
var cocos_script = document.getElementsByTagName('script');
for(var i = 0; i < cocos_script.length; i++){
var _t = cocos_script[i].getAttribute('cocos');
if(_t === '' || _t) {
break;
}
}
var _src, txt, _resPath;
if(i < cocos_script.length){
_src = cocos_script[i].src;
if(_src){
_resPath = /(.*)\//.exec(_src)[0];
cc.loader.resPath = _resPath;
var time = new Date(); //加上時間戳
time = time.getTime();
_src = cc.path.join(_resPath, 'project.json?version='+time);
}
txt = cc.loader._loadTxtSync(_src);
}
if(!txt){
txt = cc.loader._loadTxtSync("project.json?version="+time);
}
var data = JSON.parse(txt);
this._initConfig(data || {});
} catch (e) {
cc.log("Failed to read or parse project.json");
this._initConfig({});
}
}
},