DIV CSS 佈局教程網

 DIV+CSS佈局教程網 >> 網頁腳本 >> JavaScript入門知識 >> JavaScript基礎知識 >> javascript的加載、解析、執行對浏覽器渲染的影響
javascript的加載、解析、執行對浏覽器渲染的影響
編輯:JavaScript基礎知識     

javascript的加載方式,總得來說是在頁面上使用script來聲明,以及動態的加載這些方式,而動態的加載,在很多js庫中都能夠很好的去處 理,從而不至於阻塞其他資源的加載,並與其並行加載下來。這樣的動態異步的加載方式羅列起來有:Ajax的方式、DOM Element Insert、Iframe、document.write、defer等等。這些都能夠很好的處理js在加載的時候不會阻塞資源加載的問題,但是,js 的執行仍然會阻塞浏覽器的渲染。或許這是不得不需要付出的代價,有沒有一些方式去緩解js在執行的時候對浏覽器的渲染所造成的延遲的影響呢?

  首先,讓我們從UI Thread、UI Queue、UI Upate的角度去分析整個頁面和javascript的行為。浏覽器在加載HTML到最後呈現出來的這段過程,整個就是一個UI Thread進程,這個UI Thread裡是一個浏覽器的響應隊列,而UI Queue則是浏覽器的行為隊列,包括UI Update,javascript的執行行為。那麼在頁面加載的過程中,UI Queue裡面就儲存了UI Update、js加載、js解析、js執行等。不管是UI Thread,還是UI Queue,都是按照順序來的。頁面在剛開始未遇到js的加載和執行的時候,是UI Update的一個過程,一旦遇到js,就會等待js的加載、解析、執行完畢之後,接著又開始UI Update,如此這樣的一個相應順序。

 

  那麼當js的加載是異步了之後呢,這個時候,js的加載和解析不會在UI Queue的執行隊列裡,而是等到js加載、解析完畢,一到執行的時候,就添加到UI Queue隊列中,從而阻塞了UI Queue中後面的行為(UI Update)的執行。這就是開頭所說的在js的執行期總會阻塞頁面的渲染,也就是UI Update。但是這個動態加載的方式跟普通在頁面中使用script標簽來加載的時候的優勢是:將js的加載、解析的行為獨立出來,不影響浏覽器的UI Update,知道執行期才阻塞。這就很多的程度上加快了頁面的渲染和展現。

  再來說說defer和async屬性,defer屬性最開始是為IE所實現的,現代的浏覽器也都逐漸實現了,那麼它的工作原理是什麼呢。它的作用跟上 面動態加載的優勢很相同,js的加載和解析是獨立的,但是有一點不同的是:使用了defer屬性之後,js代碼會等到DOM加載完成的時候才執行,這個時 候就又更大限度的讓浏覽器盡快的UI Update部分完成,讓js的執行對浏覽器的渲染所造成的影響更小化。那麼async呢,是跟上面所說的動態加載js的優勢是一樣的,也是獨立js的加 載、解析,解析完成的時候就立即添加到UI Queue隊列中去等待執行,阻塞後面的UI Update行為。

  那麼怎樣將js的執行對UI Update的影響更小呢?使用HTML5的Worker機制吧,將復雜的js執行交給Worker去執行,Worker是一個獨立的js執行環境,這個 環境裡沒有window、DOM的概念,只是用來處理復雜的運算,再將處理後的結果通過postMessage方法發送會浏覽器,Worker和頁面之間 通過postMessage方法來實現跟浏覽器的數據交換。這樣,將復雜運算交給Worker之後,在頁面中所執行的js代碼,將會是大大的減小,減小到 只需要處理一個onmessage事件,將頁面的js執行時間最小化。

杯具的還是defer、async、Worker還不能夠完全的被目前市面上流行的浏覽器所兼容,期待浏覽器統一的那一天

XML學習教程| jQuery入門知識| AJAX入門| Dreamweaver教程| Fireworks入門知識| SEO技巧| SEO優化集錦|
Copyright © DIV+CSS佈局教程網 All Rights Reserved