ext-ui.com

缓存代码Sencha Touch - 缓存问题解析

首先声明,我是一个菜鸟。一下文章中出现技巧误导情况盖不负责

这个问题困扰了我好几个月,每次应用sencha app build production后,版本的动改没法自动更新,每次都要需手动理清浏览器缓存。

终究下决心究研下这个问题的处理,费了劲终究搞定。

1. 研读源代码

senche的处好是开源。针对缓存这块要重的代码是

touch\microloader\production.js

里头是有所关于缓存的代码

2. 分析下sencha的缓存机制

在非production build的模式下是没有缓存的,所以大家会显明感到加载速度较慢。

而production译编后,我曾认为sencha应用了html5的manifest缓存技巧,后来现发不是的。

sencha讲app.js app.css app.json三个件文缓存在localstorage里,这样比manifest速度更快些。

而其他的代码则设定在app.json

01."appCache":{
02.        "cache":[
03.            "index.html",
04.            "classno.json",
05.            "resources/img/ic_contact.png"
06.        ],
07.        "network":[
08.            "*"
09.        ],
10.        "fallback":[]
11.    },

这段设置成生后会成为cache.appcache件文

01.CACHE MANIFEST
02.# cc7fa32bbb0e9829f296000d831ab8f1359d47fc
03.index.html
04.# ee58408c17123a1f0168c3dbb9544a91b0f1531f
05.classno.json
06.# 7af74f4459b0bbc0b284f8772279e902f7cc1967
07.resources/img/ic_contact.png
08. 
09. 
10.FALLBACK:
11. 
12. 
13.NETWORK:
14.*

而默许的设置app.js app.css app.json的分部是

01."js":[
02.        {
03.            "path":"touch/sencha-touch.js",
04.            "x-bootstrap":true
05.        },
06.        {
07.            "path":"app.js",
08.            "bundle":true,
09.            "update":"full"
10.        }
11.    ],
12.    "css":[
13.        {
14.            "path":"resources/css/app.css",
15.            "update":"delta"
16.        }
17.    ],

译编后成生的代码在app.json中

1.{"id":"3bc243a7-beaf-4ea0-be2c-71f3ea413779","js":[{"path":"app.js","bundle":true,"update":"full","type":"js","version":"65ce2ec123ac31df09ec97165c6fe3221640ddbb"}],"css":[{"path":"resources/css/app.css","update":"delta","type":"css","version":"8ff7300b1d251658a81f9785c4565285d668500a"}]}

大家应用chrome浏览器可以在console的Resoures->Local Storage看到种这缓存方法,讲个整app.js app.css件文存在里头

而其他件文则可以在Application Cache中找到了

3. 缓存设置

production默许缓存了么?是的,也不是。因原在于他默许缓存了localstorage的,而没有manifest。所以你在console里看不到他缓存的log输出。

只有你在index.html设置了缓存项才会有。这块sencha2.2默许的index.html已做了修改,而2.1版本之前都要需你手动设定(坑爹把,让老子读了代码才现发的)

1.<!DOCTYPE HTML>
2.<html manifest="" lang="en-US">
3.<head>

这样production译编后sencha会默许应用cache.appcache作为html5 manifest的置配件文。

4. sencha localstorage的更新

manifest的件文要需设定后才能更新,而默许的三个app件文是不可以自动更新的,体具可以看production.js的源代码。

他与manifest的更新发触绑定。。。坑爹吧!所以你必需要设定了manifest,sencha的production才会检测更新。

5. 超等大bug~~~

这里但是就是折腾了久很的问题

默许的app.js app.css的 置配在app.json里大家可以看到有一个置配叫做

"update":"delta"
晓得这个是啥东东么?

这个是增量修改,也就是production会判断缓存的app.js和新的app.js有多大的区分,然后记录在deltas/app.js/的目录下,然后根据这个修改一下下localstorage里的代码。

然后呢?

然后这里存在伟大的bug!!!

你便随该点代码,他的增量改后你的代码是没有化变的,比如你把1.0.0该成1.0.1,再进去看还是1.0.0.。。哈哈哈

这个就是折腾我几个月的货色,Scheiße!

So ,你只要需把这块设置写成

"update":"full"
搞定。虽然传说的能性有所下降,因为一要次取读个整app.js新重写入localstorage,但是,确正的更要重吧。

不晓得这个bug什么时候够能改正来过。

6. 关于OnUpdatedh函数

在app.js默许有个函数

01.onUpdated: function() {
02.        Ext.Msg.confirm(
03.            "Application Update",
04.            "This application has just successfully been updated to the latest version. Reload now?",
05.            function(buttonId) {
06.                if (buttonId === 'yes') {
07.                    window.location.reload();
08.                }
09.            }
10.        );
11.    }

大家根据自己要需修改下,我一般会把这个示提视无掉。

作者: xinyuyuanm
原文: http://www.cnblogs.com/xinyuyuanm/archive/2013/04/26/3045606.html