[经验分享] h5游戏缓存根据版本去更新

目前引擎其实已经做了一个按照时间戳更新的方案,在 init 的 config 里面传入 noCache: true,但这样每次刷新都强制更新不太友好,下面提供一种方法根据版本更新

在creator的安装目录下,CocosCreator\resources\engine\cocos2d\core\load-pipeline,downloader.js里有downloadImage函数,进行下载图片资源。text-downloader.js里进行下载json资源,里面的代码都使用了urlAppendTimestamp函数

function downloadImage (item, callback, isCrossOrigin) {
    if (isCrossOrigin === undefined) {
        isCrossOrigin = true;
    }

    var url = urlAppendTimestamp(item.url);

text-downloader.js

var url = item.url,
            xhr = cc.loader.getXMLHttpRequest(),
            errInfo = 'Load ' + url + ' failed!',
            navigator = window.navigator;

        url = urlAppendTimestamp(url);

在utils.js中,可以看到,如果启用noCache则将url加上了当前时间戳

urlAppendTimestamp: function (url) {
        if (cc.game.config['noCache'] && typeof url === 'string') {
            if(_noCacheRex.test(url))
                url += '&_t=' + (new Date() - 0);
            else
                url += '?_t=' + (new Date() - 0);
        }
        return url;
    }

那么根据版本更新就容易了
首先在main.js或者其他地方,赋值cc.game.config[‘myversion’]=‘1.0.0.1’;cc.game.config[‘noCache’]=true;
然后修改

urlAppendTimestamp: function (url) {
        if (cc.game.config['noCache'] && typeof url === 'string') {
            if(_noCacheRex.test(url))
                url += '&_t=' + cc.game.config.myversion;
            else
                url += '?_t=' +cc.game.config.myversion;
        }
        return url;
    }

(这里我直接找到cocos2d-js-min.js里urlAppendTimestamp进行修改的,修改引擎文件好像要重新生成,麻烦就没弄)
这样访问就带有版本号,发布新版只要修改版本号即可全部更新图片和json资源

图片使用CDN
由于项目需要,需要结合PHP使用,图片资源需使用CDN上的路径,不能整站放CDN上
同样,先修改downloadImage函数
在设置url后加上

if(url.indexOf("http")<0){//防止本身需下载其他路径的头像资源
    url="http://downloads.xxx.com/h5/"+url;
}

json资源同样处理(修改text-downloader.js)

我使用的阿里的CDN,需要在域名CDN管理里面设置

希望creator在工具里面能实现noCache和根据版本号更新的功能

12赞

下午才提到,就有人做出来了,赞~~~ 这个功能未来版本我们可以提供

希望集成在编辑器中。

看到isCrossOrigin, 现在webGL渲染模式下已经没有跨域问题了吗?

跨域问题参考 http://forum.cocos.com/t/url/42848/2

正需要这个 nice

好棒棒啊~ 建议 url.indexOf("http")<0 写成 !url.startsWith('http'),更清晰一点

未来版本是那个版本。。。

可是这样不是相当于所有的资源都重新请求了么

大部分页游的更新方式,文件数量太多的时候版本文件会很大是个问题

音频文件要怎么才能加上时间戳呢?

同问 音频文件不行的吗? 这个功能按道理来说不难啊 官方为啥还不加上。。。

最好的更新方式是采用每个文件的md5值,但是我们这里好像不太现实···

md5 的方案我们会考虑在后续的版本中实现。

有些客户端不支持startsWith

把文件发布的时候,用MD5码更名。。才是妥妥的方案。 否则浏览器缓存机制一但失灵,就JJ了。。。 (PS:PC页游中,浏览器缓存失灵高发,痛过的人才知道。!)

麒麟子大大正解,后续我们会把 md5 更名的方案集成到引擎里面来,大概会放在 1.6 版本来做。

这个方法 creator 有内置 polyfill

目前在做网页版的,有什么成熟的方案,在creator 里面进行 缓存处理呢? 楼主那个方案你们觉得怎样呢?

貌似没有呢。