[Ext JS 4]效能最佳化

來源:互聯網
上載者:User
一般的最佳化技巧

1. 檢查你定義的時間監聽器

正確的設定事件監聽器對效能會有很大的影響。 舉例來說, 在定義一個store的時候,設定一個load 的事件去觸發從後台讀取資料,如果設定single 的值為true的話,則load的事情就只有在第一次取資料的時候會觸發了。

listeners: {    load: onFirstLoadData,    single: true}

給一個完整的例子:

<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd"><html><head><meta http-equiv="Content-Type" content="text/html; charset=UTF-8"><title>Insert title here</title><script type="text/javascript" src="extjs/ext-all.js"></script><link href="extjs/resources/ext-theme-neptune/ext-theme-neptune-all.css" rel="stylesheet" type="text/css" /><script>var myStore;Ext.onReady(function(){Ext.define('User', {    extend: 'Ext.data.Model',    fields: [        {name: 'firstName', type: 'string'},        {name: 'lastName',  type: 'string'}    ]}); myStore = Ext.create('Ext.data.Store', {     model: 'User',     proxy: {         type: 'ajax',         url: 'users.json',         reader: {             type: 'json',             root: 'users'         }     },     autoLoad: true,     listeners:{     single: true,     load: function(){alert("store load event");}          } });  Ext.create('Ext.grid.Panel', {    title: 'Sample',    store: myStore,    columns: [        { text: 'SurName',  dataIndex: 'lastName' },        { text: 'Name', dataIndex: 'firstName' }    ],    height: 200,    width: 400,    renderTo: Ext.getBody()    });});function loadStore(){myStore.load();}</script></head><body><input type=button value="load Store" onclick="loadStore()"><div id="my-div"></div></body></html>

注意 ext 的 js 和 css 檔案需要下載匯入.

這裡實現的效果就是點擊 load Store 按鈕, 如果加了single: true, 則load 這個事件就不會執行了。

另外一個需要注意的事件是 afterrender, 它在所有的DOM元素存在時觸發。在渲染後修改元素會迴流和降慢程式。 相反的,可以使用beforerender在渲染之前調整類和設定樣式。而一些必須在渲染後啟動並執行代碼,在 Ext JS 4.1 中有提供一個新的事件 -- boxready, 它運行在一個組件大小被確定之後。

2. 移除doLayout 和 doComponentLayout 呼叫

盡量移除高代價的呼叫。 在Ext js 4之前的版本中,doLayout 是用來告知架構你已經完成了一個組件或容器,接下來去計算它的布局。 在Ext JS 4.0 中這些呼叫也有時用來處理直接的DOM更新或是解決一些特定的缺陷。

在Ext JS 4.1中, 布局的觸發方式改變了,你的代碼不需要呼叫 doLayout 或doComponentLayout。 如果你還需要呼叫這個方法來處理缺陷,請提交缺陷報告給sencha吧。

3. 減少容器嵌套

每一個容器都是只需時間去初始化,渲染和布局。嵌套越少,程式的速度就會越快。舉例來說:

{    id: 'container1',    items: [{        id: 'container2',        items: [{            id: 'component3'            }]    }]}

完全可以使用以下方式替換:

{    id: 'container1',    items: [{        id: 'component3'        }]}

4. 使用 Containers ,而少使用Panels

Ext JS的Panels 比 Containers 功能更強大,當然代價也更高。顯示指定 xtype:'container',避免預設使用 'panel',類似

{    xtype: 'container', // defaultType is 'panel'    items: [ ... ]}


5. 減少邊界布局嵌套
在Ext JS 4.1 中,有很多方法來替代邊界布局嵌套。移除這些嵌套可以減少初始化,渲染和布局組件的時間。在Ext JS的早期版本中,有些狀況是必須使用嵌套,舉例來說,在同一個區塊有兩個或更多的執行個體,如果在中心地區上需要兩個北邊的地區,就需要嵌套邊界布局了。 現在,可以直接指定兩個北邊地區作為一個邊界布局的部分。

在Ext JS 4.1 中,地區可以動態方式添加,而不需要一次把所有區塊定義出來,不用的時候,又把他們隱藏起來。還可以使用weight 的屬性設定地區的優先順序--舉例來說,

設定西邊的優先順序高於北邊。

6. 減少DOM的讀寫

Ext JS 4.1 已經調整了布局和DOM的互動以儘可能的減少DOM的讀寫。客制的代碼也應該盡量遵循這個規則,因為DOM的讀寫會降低程式的速度, 高的開銷和混寫導致

迴流。 盡量使用beforerender 控制樣式和類,避免使用 setStyle,addCls,removeCls或其他DOM元素修改的方式。

作為一般規則, 操縱在DOM讀寫時分批次的操作會對效能有一定的提升。

使用Ext JS 4.1 提供的兩個新的方法 Ext.suspendLayouts 和dExt.resumeLayouts來減少額外的
布局。這兩個方法有助於協調更新到多個組件和容器。

Ext JS 頁面分析器

Ext JS 4.1 提供了一個新的工具用來分析應用程式的效能。使用它可以快速的測量系統系統並對相關的代碼做更改。頁面分析器有許多功能還是實驗性的,但是布局標籤最佳化是比較有用的效能最佳化的功能。

可以在開發套件的以下路徑找到這個工具

./examples/page-analyzer/page-analyzer.html

因為瀏覽器安全的原因,頁面分析器只允許在同一台伺服器上使用, 所以使用時需要把整個 page-analyzer的檔案夾複製到應用程式的相關目錄下。

另外, 要確保頁面分析器的版本和你構建Ext JS版本要匹配,否則它是不能正常啟動並執行。

接下來,看一下如何使用頁面分析器:

1. 在瀏覽器中通過URL開啟頁面分析器

2. 輸入需要分析的頁面地址

3. 點擊"load ", 展現結果。

4. 點擊 Layout 的標籤,可以看到:

5.  但單個組件上有多個布局時, 在代碼中減少不必要的布局會提升系統的效能。

網格最佳化

使用Ext JS  grid會遇到一個特別的效能問題,特別是在處理大型的資料集的時候。當處理小型的資料,速度不是問題。但當grid 處理"無限滾動"展現時,就會出現效能瓶頸了。因為無限滾動依賴於頁面的緩衝。

當使用者在滾動時,快取資料變成可見的接著有消失在頁面的頂部並且不再儲存在DOM中了。調整這個的主要方法是儘可能的讓DOM盡量小,在用戶端快取資料進而減少資料在服務端的往返。

滾動術語

當一個 data store 的buffered 配置成true的時候,一個PagingScroller 的對象會被建立出來用於監控視圖的滾動(網格被配置成data views),同時用來為下一步提供快速的資料。

在中,使用者滾動視圖向下查看資料集,PagingScroller維護了滾動方向的一段前面地區的記錄和一段後面地區的記錄。

PagingScroller 要求data store保證trailingBufferZone和leadingBufferZone都已經在緩衝中。

滾動的時候,如果資料已經在緩衝中就直接顯示,如果不再就要通過ajax 方式擷取,這個時候頁面會mask 住。如何設定緩衝的大小,可以使用 Infinite Grid Tuner這個工具

使用例子像以下這樣


聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在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.