加勒比HEZYO黑人专区-久久精品国产99国产精品亚洲-精品国产18久久久久久-久久人妻少妇嫩草AV

歡迎光臨 織晶網絡官網!

  • 服務支持
  • 020-39182790
服務支持您現在的位置:首頁 > 服務支持

如何加快JavaScript加載和執行效率?

作者:織晶客服部   發布于:2018/12/22 16:59:33  點擊量:  來源:織晶網絡

注解:JavaScript 是一種輕量級的編程語言,它可以在網頁上實現復雜的功能,廣泛用于客戶端Web開發。無論你在電腦上,手機上,還是其他設備上瀏覽的所有網頁,以及無數基于HTML5的手機App,交互邏輯都是由JavaScript驅動的。

無論當前 JavaScript 代碼是內嵌還是在外鏈文件中,頁面的下載和渲染都必須停下來等待腳本執行完成。JavaScript 執行過程耗時越久,瀏覽器等待響應用戶輸入的時間就越長。瀏覽器在下載和執行腳本時出現阻塞的原因在于,腳本可能會改變頁面或 JavaScript 的命名空間,它們對后面頁面內容造成影響。一個典型的例子就是在頁面中使用document.write()

JavaScript 代碼內嵌示例

 

當瀏覽器遇到< script>標簽時,當前 html 頁面無從獲知 JavaScript 是否會向< p>標簽添加內容,或引入其他元素,或甚至移除該標簽。因此,這時瀏覽器會停止處理頁面,先執行 JavaScript代碼,然后再繼續解析和渲染頁面。同樣的情況也發生在使用 src 屬性加載 JavaScript的過程中,瀏覽器必須先花時間下載外鏈文件中的代碼,然后解析并執行它。在這個過程中,頁面渲染和用戶交互完全被阻塞了。

腳本位置

HTML 4 規范指出 < script> 標簽可以放在 HTML 文檔的< head>< body>中,并允許出現多次。web 開發人員一般習慣在 < head> 中加載外鏈的 JavaScript,接著用 < link> 標簽用來加載外鏈的 CSS 文件或者其他頁面信息。

低效率腳本位置示例。

然而這種常規的做法卻隱藏著嚴重的性能問題。在清單 2 的示例中,當瀏覽器解析到 < script> 標簽(第 4 行)時,瀏覽器會停止解析其后的內容,而優先下載腳本文件,并執行其中的代碼,這意味著,其后的 styles.css 樣式文件和< body>標簽都無法被加載,由于< body>標簽無法被加載,那么頁面自然就無法渲染了。因此在該 JavaScript 代碼完全執行完之前,頁面都是一片空白。

由于腳本會阻塞頁面其他資源的下載,因此推薦將所有< script>標簽盡可能放到< body>標簽的底部,以盡量減少對整個頁面下載的影響。

推薦的代碼放置位置示例

這段代碼展示了在 HTML 文檔中放置< script>標簽的推薦位置。盡管腳本下載會阻塞另一個腳本,但是頁面的大部分內容都已經下載完成并顯示給了用戶,因此頁面下載不會顯得太慢。這是優化 JavaScript 的首要規則:將腳本放在底部。

組織腳本

由于每個< script>標簽初始下載時都會阻塞頁面渲染,所以減少頁面包含的< script>標簽數量有助于改善這一情況。這不僅針對外鏈腳本,內嵌腳本的數量同樣也要限制。瀏覽器在解析 HTML 頁面的過程中每遇到一個< script>標簽,都會因執行腳本而導致一定的延時,因此最小化延遲時間將會明顯改善頁面的總體性能。

這個問題在處理外鏈 JavaScript 文件時略有不同。考慮到 HTTP 請求會帶來額外的性能開銷,因此下載單個 100Kb 的文件將比下載 5 20Kb 的文件更快。也就是說,減少頁面中外鏈腳本的數量將會改善性能。

通常一個大型網站或應用需要依賴數個 JavaScript 文件。您可以把多個文件合并成一個,這樣只需要引用一個< script>標簽,就可以減少性能消耗。文件合并的工作可通過離線的打包工具或者一些實時的在線服務來實現。

需要特別提醒的是,把一段內嵌腳本放在引用外鏈樣式表的< link>之后會導致頁面阻塞去等待樣式表的下載。這樣做是為了確保內嵌腳本在執行時能獲得最精確的樣式信息。因此,建議不要把內嵌腳本緊跟在< link>標簽后面。

無阻塞的腳本

減少 JavaScript 文件大小并限制 HTTP 請求數在功能豐富的 Web 應用或大型網站上并不總是可行。Web 應用的功能越豐富,所需要的 JavaScript 代碼就越多,盡管下載單個較大的 JavaScript 文件只產生一次 HTTP 請求,卻會鎖死瀏覽器的一大段時間。為避免這種情況,需要通過一些特定的技術向頁面中逐步加載 JavaScript 文件,這樣做在某種程度上來說不會阻塞瀏覽器。

無阻塞腳本的秘訣在于,在頁面加載完成后才加載 JavaScript 代碼。這就意味著在 window 對象的 onload事件觸發后再下載腳本。有多種方式可以實現這一效果。

延遲加載腳本

HTML 4 < script>標簽定義了一個擴展屬性:deferDefer 屬性指明本元素所含的腳本不會修改 DOM,因此代碼能安全地延遲執行。defer 屬性只被 IE 4 Firefox 3.5 更高版本的瀏覽器所支持,所以它不是一個理想的跨瀏覽器解決方案。在其他瀏覽器中,defer 屬性會被直接忽略,因此< script>標簽會以默認的方式處理,也就是說會造成阻塞。然而,如果您的目標瀏覽器支持的話,這仍然是個有用的解決方案。

defer 屬性使用方法示例


帶有 defer 屬性的< script>標簽可以放置在文檔的任何位置。對應的 JavaScript 文件將在頁面解析到< script>標簽時開始下載,但不會執行,直到 DOM 加載完成,即onload事件觸發前才會被執行。當一個帶有 defer 屬性的 JavaScript 文件下載時,它不會阻塞瀏覽器的其他進程,因此這類文件可以與其他資源文件一起并行下載。

任何帶有 defer 屬性的< script>元素在 DOM 完成加載之前都不會被執行,無論內嵌或者是外鏈腳本都是如此。清單 5 的例子展示了defer屬性如何影響腳本行為:

defer 屬性對腳本行為的影響

這段代碼在頁面處理過程中彈出三次對話框。不支持 defer 屬性的瀏覽器的彈出順序是:“defer”“script”“load”。而在支持 defer 屬性的瀏覽器上,彈出的順序則是:“script”“defer”“load”。請注意,帶有 defer 屬性的< script>元素不是跟在第二個后面執行,而是在 onload 事件被觸發前被調用。

如果您的目標瀏覽器只包括 Internet Explorer Firefox 3.5,那么 defer 腳本確實有用。如果您需要支持跨領域的多種瀏覽器,那么還有更一致的實現方式。

HTML 5 < script>標簽定義了一個新的擴展屬性:async。它的作用和 defer 一樣,能夠異步地加載和執行腳本,不因為加載腳本而阻塞頁面的加載。但是有一點需要注意,在有 async 的情況下,JavaScript 腳本一旦下載好了就會執行,所以很有可能不是按照原本的順序來執行的。如果 JavaScript 腳本前后有依賴性,使用 async 就很有可能出現錯誤。




上一篇:JavaScript中的 if...else 條件判斷語句

下一篇:JavaScript 函數的使用