這個問題困擾了我好幾個月,每次使用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
"appCache":{ "cache":[ "index.html", "classno.json", "resources/img/ic_contact.png" ], "network":[ "*" ], "fallback":[] },
這段設定產生後會成為cache.appcache檔案
CACHE MANIFEST# cc7fa32bbb0e9829f296000d831ab8f1359d47fcindex.html# ee58408c17123a1f0168c3dbb9544a91b0f1531fclassno.json# 7af74f4459b0bbc0b284f8772279e902f7cc1967resources/img/ic_contact.pngFALLBACK:NETWORK:*
而預設的設定app.js app.css app.json的部分是
"js":[ { "path":"touch/sencha-touch.js", "x-bootstrap":true }, { "path":"app.js", "bundle":true, "update":"full" } ], "css":[ { "path":"resources/css/app.css", "update":"delta" } ],
編譯後產生的程式碼在app.json中
{"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版本之前都需要你手動設定(坑爹把,讓老子讀了代碼才發現的)
<!DOCTYPE HTML><html manifest="" lang="en-US"><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預設有個函數
onUpdated: function() { Ext.Msg.confirm( "Application Update", "This application has just successfully been updated to the latest version. Reload now?", function(buttonId) { if (buttonId === 'yes') { window.location.reload(); } } ); }
大家根據自己需要修改下,我一般會把這個提示無視掉。
最後,大家感謝我吧~
sencha應該把這塊好好寫個文檔,害死人啊~