sencha Touch 緩衝問題解析

來源:互聯網
上載者:User

這個問題困擾了我好幾個月,每次使用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應該把這塊好好寫個文檔,害死人啊~

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.