一区二区三区日韩精品-日韩经典一区二区三区-五月激情综合丁香婷婷-欧美精品中文字幕专区

分享

JavaScript的性能優(yōu)化:加載和執(zhí)行

 卯金無(wú)刀 2013-09-06

 隨著Web2.0技術(shù)的不斷推廣,越來(lái)越多的應(yīng)用使用 JavaScript 技術(shù)在客戶端進(jìn)行處理,從而使JavaScript在瀏覽器中的性能成為開(kāi)發(fā)者所面臨的最重要的可用性問(wèn)題。而這個(gè)問(wèn)題又因JavaScript的阻塞特性變的復(fù)雜,也就是說(shuō)當(dāng)瀏覽器在執(zhí)行JavaScript代碼時(shí),不能同時(shí)做其他任何事情。本文詳細(xì)介紹了如何正確的加載和執(zhí)行 JavaScript代碼,從而提高其在瀏覽器中的性能。

 

無(wú)論當(dāng)前JavaScript代碼是內(nèi)嵌還是在外鏈文件中,頁(yè)面的下載和渲染都必須停下來(lái)等待腳本執(zhí)行完成。JavaScript執(zhí)行過(guò)程耗時(shí)越久,瀏覽器等待響應(yīng)用戶輸入的時(shí)間就越長(zhǎng)。瀏覽器在下載和執(zhí)行腳本時(shí)出現(xiàn)阻塞的原因在于,腳本可能會(huì)改變頁(yè)面或JavaScript的命名空間,它們對(duì)后面頁(yè)面內(nèi)容造成影響。一個(gè)典型的例子就是在頁(yè)面中使用document.write()。例如清單 1:

 

Html代碼 
  1. <html>  
  2. <head>  
  3.     <title>Source Example</title>  
  4. </head>  
  5. <body>  
  6.     <p>  
  7.     <script type="text/javascript">  
  8.         document.write("Today is " + (new Date()).toDateString());  
  9.     </script>  
  10.     </p>  
  11. </body>  
  12. </html>  

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

 

腳本位置 

HTML 4 規(guī)范指出 <script> 標(biāo)簽可以放在 HTML 文檔的<head>或<body>中,并允許出現(xiàn)多次。Web 開(kāi)發(fā)人員一般習(xí)慣在 <head> 中加載外鏈的 JavaScript,接著用 <link> 標(biāo)簽用來(lái)加載外鏈的 CSS 文件或者其他頁(yè)面信息。例如清單 2 

清單 2 低效率腳本位置示例

Js代碼 
  1. <html>  
  2. <head>  
  3.     <title>Source Example</title>  
  4.     <script type="text/javascript" src="script1.js"></script>  
  5.     <script type="text/javascript" src="script2.js"></script>  
  6.     <script type="text/javascript" src="script3.js"></script>  
  7.     <link rel="stylesheet" type="text/css" href="styles.css">  
  8. </head>  
  9. <body>  
  10.     <p>Hello world!</p>  
  11. </body>  
  12. </html>  

然而這種常規(guī)的做法卻隱藏著嚴(yán)重的性能問(wèn)題。在清單 2 的示例中,當(dāng)瀏覽器解析到 <script> 標(biāo)簽(第 4 行)時(shí),瀏覽器會(huì)停止解析其后的內(nèi)容,而優(yōu)先下載腳本文件,并執(zhí)行其中的代碼,這意味著,其后的 styles.css 樣式文件和<body>標(biāo)簽都無(wú)法被加載,由于<body>標(biāo)簽無(wú)法被加載,那么頁(yè)面自然就無(wú)法渲染了。因此在該JavaScript代碼完全執(zhí)行完之前,頁(yè)面都是一片空白。圖 1 描述了頁(yè)面加載過(guò)程中腳本和樣式文件的下載過(guò)程。 

圖 1 JavaScript 文件的加載和執(zhí)行阻塞其他文件的下載


我們可以發(fā)現(xiàn)一個(gè)有趣的現(xiàn)象:第一個(gè) JavaScript 文件開(kāi)始下載,與此同時(shí)阻塞了頁(yè)面其他文件的下載。此外,從 script1.js 下載完成到 script2.js 開(kāi)始下載前存在一個(gè)延時(shí),這段時(shí)間正好是 script1.js 文件的執(zhí)行過(guò)程。每個(gè)文件必須等到前一個(gè)文件下載并執(zhí)行完成才會(huì)開(kāi)始下載。在這些文件逐個(gè)下載過(guò)程中,用戶看到的是一片空白的頁(yè)面。

 

從 IE 8、Firefox 3.5、Safari 4 和 Chrome 2 開(kāi)始都允許并行下載 JavaScript 文件。這是個(gè)好消息,因?yàn)?lt;script>標(biāo)簽在下載外部資源時(shí)不會(huì)阻塞其他<script>標(biāo)簽。遺憾的是,JavaScript 下載過(guò)程仍然會(huì)阻塞其他資源的下載,比如樣式文件和圖片。盡管腳本的下載過(guò)程不會(huì)互相影響,但頁(yè)面仍然必須等待所有 JavaScript 代碼下載并執(zhí)行完成才能繼續(xù)。因此,盡管最新的瀏覽器通過(guò)允許并行下載提高了性能,但問(wèn)題尚未完全解決,腳本阻塞仍然是一個(gè)問(wèn)題。

 

由于腳本會(huì)阻塞頁(yè)面其他資源的下載,因此推薦將所有<script>標(biāo)簽盡可能放到<body>標(biāo)簽的底部,以盡量減少對(duì)整個(gè)頁(yè)面下載的影響。例如清單 3

 

清單 3 推薦的代碼放置位置示例 

Js代碼 
  1. <html>  
  2. <head>  
  3.     <title>Source Example</title>  
  4.     <link rel="stylesheet" type="text/css" href="styles.css">  
  5. </head>  
  6. <body>  
  7.     <p>Hello world!</p>  
  8.     <!-- Example of efficient script positioning -->  
  9.     <script type="text/javascript" src="script1.js"></script>  
  10.     <script type="text/javascript" src="script2.js"></script>  
  11.     <script type="text/javascript" src="script3.js"></script>  
  12. </body>  
  13. </html>  

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

組織腳本

 

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

這個(gè)問(wèn)題在處理外鏈 JavaScript 文件時(shí)略有不同??紤]到 HTTP 請(qǐng)求會(huì)帶來(lái)額外的性能開(kāi)銷(xiāo),因此下載單個(gè) 100Kb 的文件將比下載 5 個(gè) 20Kb 的文件更快。也就是說(shuō),減少頁(yè)面中外鏈腳本的數(shù)量將會(huì)改善性能。

通常一個(gè)大型網(wǎng)站或應(yīng)用需要依賴數(shù)個(gè) JavaScript 文件。您可以把多個(gè)文件合并成一個(gè),這樣只需要引用一個(gè)<script>標(biāo)簽,就可以減少性能消耗。文件合并的工作可通過(guò)離線的打包工具或者一些實(shí)時(shí)的在線服務(wù)來(lái)實(shí)現(xiàn)。

 

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

 

無(wú)阻塞的腳本

 

減少 JavaScript 文件大小并限制 HTTP 請(qǐng)求數(shù)在功能豐富的 Web 應(yīng)用或大型網(wǎng)站上并不總是可行。Web 應(yīng)用的功能越豐富,所需要的 JavaScript 代碼就越多,盡管下載單個(gè)較大的 JavaScript 文件只產(chǎn)生一次 HTTP 請(qǐng)求,卻會(huì)鎖死瀏覽器的一大段時(shí)間。為避免這種情況,需要通過(guò)一些特定的技術(shù)向頁(yè)面中逐步加載 JavaScript 文件,這樣做在某種程度上來(lái)說(shuō)不會(huì)阻塞瀏覽器。

無(wú)阻塞腳本的秘訣在于,在頁(yè)面加載完成后才加載 JavaScript 代碼。這就意味著在 window 對(duì)象的onload事件觸發(fā)后再下載腳本。有多種方式可以實(shí)現(xiàn)這一效果。

 

延遲加載腳本

 

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

 

清單 4 defer 屬性使用方法示例

Js代碼 
  1. <script type="text/javascript" src="script1.js" defer></script>  

帶有defer屬性的<script>標(biāo)簽可以放置在文檔的任何位置。對(duì)應(yīng)的 JavaScript 文件將在頁(yè)面解析到<script>標(biāo)簽時(shí)開(kāi)始下載,但不會(huì)執(zhí)行,直到 DOM 加載完成,即onload事件觸發(fā)前才會(huì)被執(zhí)行。當(dāng)一個(gè)帶有 defer 屬性的 JavaScript 文件下載時(shí),它不會(huì)阻塞瀏覽器的其他進(jìn)程,因此這類(lèi)文件可以與其他資源文件一起并行下載。

 

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

 

清單 5 defer 屬性對(duì)腳本行為的影響

Js代碼 
  1. <html>  
  2. <head>  
  3.     <title>Script Defer Example</title>  
  4. </head>  
  5. <body>  
  6.     <script type="text/javascript" defer>  
  7.         alert("defer");  
  8.     </script>  
  9.     <script type="text/javascript">  
  10.         alert("script");  
  11.     </script>  
  12.     <script type="text/javascript">  
  13.         window.onload = function(){  
  14.             alert("load");  
  15.         };  
  16.     </script>  
  17. </body>  
  18. </html>  

這段代碼在頁(yè)面處理過(guò)程中彈出三次對(duì)話框。不支持 defer 屬性的瀏覽器的彈出順序是:“defer”、“script”、“l(fā)oad”。而在支持 defer 屬性的瀏覽器上,彈出的順序則是:“script”、“defer”、“l(fā)oad”。請(qǐng)注意,帶有 defer 屬性的<script>元素不是跟在第二個(gè)后面執(zhí)行,而是在 onload 事件被觸發(fā)前被調(diào)用。

 

如果您的目標(biāo)瀏覽器只包括 Internet Explorer 和 Firefox 3.5,那么 defer 腳本確實(shí)有用。如果您需要支持跨領(lǐng)域的多種瀏覽器,那么還有更一致的實(shí)現(xiàn)方式。

 

HTML 5 為<script>標(biāo)簽定義了一個(gè)新的擴(kuò)展屬性:async。它的作用和 defer 一樣,能夠異步地加載和執(zhí)行腳本,不因?yàn)榧虞d腳本而阻塞頁(yè)面的加載。但是有一點(diǎn)需要注意,在有 async 的情況下,JavaScript 腳本一旦下載好了就會(huì)執(zhí)行,所以很有可能不是按照原本的順序來(lái)執(zhí)行的。如果 JavaScript 腳本前后有依賴性,使用 async 就很有可能出現(xiàn)錯(cuò)誤。

 

動(dòng)態(tài)腳本元素

 

文檔對(duì)象模型(DOM)允許您使用 JavaScript 動(dòng)態(tài)創(chuàng)建 HTML 的幾乎全部文檔內(nèi)容。<script>元素與頁(yè)面其他元素一樣,可以非常容易地通過(guò)標(biāo)準(zhǔn) DOM 函數(shù)創(chuàng)建:

 

清單 6 通過(guò)標(biāo)準(zhǔn) DOM 函數(shù)創(chuàng)建<script>元素

Js代碼 
  1. var script = document.createElement ("script");  
  2.    script.type = "text/javascript";  
  3.    script.src = "script1.js";  
  4.    document.getElementsByTagName("head")[0].appendChild(script);  

新的<script>元素加載 script1.js 源文件。此文件當(dāng)元素添加到頁(yè)面之后立刻開(kāi)始下載。此技術(shù)的重點(diǎn)在于:無(wú)論在何處啟動(dòng)下載,文件的下載和運(yùn)行都不會(huì)阻塞其他頁(yè)面處理過(guò)程。您甚至可以將這些代碼放在<head>部分而不會(huì)對(duì)其余部分的頁(yè)面代碼造成影響(除了用于下載文件的 HTTP 連接)。

 

當(dāng)文件使用動(dòng)態(tài)腳本節(jié)點(diǎn)下載時(shí),返回的代碼通常立即執(zhí)行(除了 Firefox 和 Opera,他們將等待此前的所有動(dòng)態(tài)腳本節(jié)點(diǎn)執(zhí)行完畢)。當(dāng)腳本是“自運(yùn)行”類(lèi)型時(shí),這一機(jī)制運(yùn)行正常,但是如果腳本只包含供頁(yè)面其他腳本調(diào)用調(diào)用的接口,則會(huì)帶來(lái)問(wèn)題。這種情況下,您需要跟蹤腳本下載完成并是否準(zhǔn)備妥善??梢允褂脛?dòng)態(tài) <script> 節(jié)點(diǎn)發(fā)出事件得到相關(guān)信息。

 

Firefox、Opera, Chorme 和 Safari 3+會(huì)在<script>節(jié)點(diǎn)接收完成之后發(fā)出一個(gè) onload 事件。您可以監(jiān)聽(tīng)這一事件,以得到腳本準(zhǔn)備好的通知:

 

清單 7 通過(guò)監(jiān)聽(tīng) onload 事件加載 JavaScript 腳本

Js代碼 
  1. var script = document.createElement ("script")  
  2. script.type = "text/javascript";  
  3. //Firefox, Opera, Chrome, Safari 3+  
  4. script.onload = function(){  
  5.     alert("Script loaded!");  
  6. };  
  7. script.src = "script1.js";  
  8. document.getElementsByTagName("head")[0].appendChild(script);  

 Internet Explorer 支持另一種實(shí)現(xiàn)方式,它發(fā)出一個(gè) readystatechange 事件。<script>元素有一個(gè)readyState 屬性,它的值隨著下載外部文件的過(guò)程而改變。readyState 有五種取值:

  • “uninitialized”:默認(rèn)狀態(tài)
  • “l(fā)oading”:下載開(kāi)始
  • “l(fā)oaded”:下載完成
  • “interactive”:下載完成但尚不可用
  • “complete”:所有數(shù)據(jù)已經(jīng)準(zhǔn)備好

微軟文檔上說(shuō),在<script>元素的生命周期中,readyState 的這些取值不一定全部出現(xiàn),但并沒(méi)有指出哪些取值總會(huì)被用到。實(shí)踐中,我們最感興趣的是“l(fā)oaded”和“complete”狀態(tài)。Internet Explorer 對(duì)這兩個(gè) readyState 值所表示的最終狀態(tài)并不一致,有時(shí)<script>元素會(huì)得到“l(fā)oader”卻從不出現(xiàn)“complete”,但另外一些情況下出現(xiàn)“complete”而用不到“l(fā)oaded”。最安全的辦法就是在readystatechange 事件中檢查這兩種狀態(tài),并且當(dāng)其中一種狀態(tài)出現(xiàn)時(shí),刪除readystatechange事件句柄(保證事件不會(huì)被處理兩次):

 

清單 8 通過(guò)檢查readyState狀態(tài)加載JavaScript腳本

Js代碼 
  1. var script = document.createElement("script")  
  2. script.type = "text/javascript";  
  3. //Internet Explorer  
  4. script.onreadystatechange = function(){  
  5.      if (script.readyState == "loaded" || script.readyState == "complete"){  
  6.            script.onreadystatechange = null;  
  7.            alert("Script loaded.");  
  8.      }  
  9. };  
  10. script.src = "script1.js";  
  11. document.getElementsByTagName("head")[0].appendChild(script);  

大多數(shù)情況下,您希望調(diào)用一個(gè)函數(shù)就可以實(shí)現(xiàn)JavaScript文件的動(dòng)態(tài)加載。下面的函數(shù)封裝了標(biāo)準(zhǔn)實(shí)現(xiàn)和 IE 實(shí)現(xiàn)所需的功能:

 

清單 9 通過(guò)函數(shù)進(jìn)行封裝

Js代碼 
  1. function loadScript(url, callback){  
  2.     var script = document.createElement ("script")  
  3.     script.type = "text/javascript";  
  4.     if (script.readyState){ //IE  
  5.         script.onreadystatechange = function(){  
  6.             if (script.readyState == "loaded" || script.readyState == "complete"){  
  7.                 script.onreadystatechange = null;  
  8.                 callback();  
  9.             }  
  10.         };  
  11.     } else { //Others  
  12.         script.onload = function(){  
  13.             callback();  
  14.         };  
  15.     }  
  16.     script.src = url;  
  17.     document.getElementsByTagName("head")[0].appendChild(script);  
  18. }  

此函數(shù)接收兩個(gè)參數(shù):JavaScript 文件的 URL,和一個(gè)當(dāng) JavaScript 接收完成時(shí)觸發(fā)的回調(diào)函數(shù)。屬性檢查用于決定監(jiān)視哪種事件。最后一步,設(shè)置 src 屬性,并將<script>元素添加至頁(yè)面。此loadScript() 函數(shù)使用方法如下:

 

清單 10 loadScript()函數(shù)使用方法

Js代碼 
  1. loadScript("script1.js"function(){  
  2.     alert("File is loaded!");  
  3. });  

您可以在頁(yè)面中動(dòng)態(tài)加載很多 JavaScript 文件,但要注意,瀏覽器不保證文件加載的順序。所有主流瀏覽器之中,只有 Firefox 和 Opera 保證腳本按照您指定的順序執(zhí)行。其他瀏覽器將按照服務(wù)器返回它們的次序下載并運(yùn)行不同的代碼文件。您可以將下載操作串聯(lián)在一起以保證他們的次序,如下:

 

清單 11 通過(guò) loadScript()函數(shù)加載多個(gè)JavaScript腳本

Js代碼 
  1. loadScript("script1.js"function(){  
  2.     loadScript("script2.js"function(){  
  3.         loadScript("script3.js"function(){  
  4.             alert("All files are loaded!");  
  5.         });  
  6.     });  
  7. });  

此代碼等待 script1.js 可用之后才開(kāi)始加載 script2.js,等 script2.js 可用之后才開(kāi)始加載 script3.js。雖然此方法可行,但如果要下載和執(zhí)行的文件很多,還是有些麻煩。如果多個(gè)文件的次序十分重要,更好的辦法是將這些文件按照正確的次序連接成一個(gè)文件。獨(dú)立文件可以一次性下載所有代碼(由于這是異步進(jìn)行的,使用一個(gè)大文件并沒(méi)有什么損失)。

 

動(dòng)態(tài)腳本加載是非阻塞 JavaScript 下載中最常用的模式,因?yàn)樗梢钥鐬g覽器,而且簡(jiǎn)單易用。

 

使用XMLHttpRequest(XHR)對(duì)象

 

此技術(shù)首先創(chuàng)建一個(gè) XHR 對(duì)象,然后下載 JavaScript 文件,接著用一個(gè)動(dòng)態(tài) <script> 元素將 JavaScript 代碼注入頁(yè)面。清單 12 是一個(gè)簡(jiǎn)單的例子:

 

清單 12 通過(guò) XHR 對(duì)象加載 JavaScript 腳本

Js代碼 
  1. var xhr = new XMLHttpRequest();  
  2. xhr.open("get""script1.js"true);  
  3. xhr.onreadystatechange = function(){  
  4.     if (xhr.readyState == 4){  
  5.         if (xhr.status >= 200 && xhr.status < 300 || xhr.status == 304){  
  6.             var script = document.createElement ("script");  
  7.             script.type = "text/javascript";  
  8.             script.text = xhr.responseText;  
  9.             document.body.appendChild(script);  
  10.         }  
  11.     }  
  12. };  
  13. xhr.send(null);  

此代碼向服務(wù)器發(fā)送一個(gè)獲取 script1.js 文件的 GET 請(qǐng)求。onreadystatechange 事件處理函數(shù)檢查readyState 是不是 4,然后檢查 HTTP 狀態(tài)碼是不是有效(2XX 表示有效的回應(yīng),304 表示一個(gè)緩存響應(yīng))。如果收到了一個(gè)有效的響應(yīng),那么就創(chuàng)建一個(gè)新的<script>元素,將它的文本屬性設(shè)置為從服務(wù)器接收到的 responseText 字符串。這樣做實(shí)際上會(huì)創(chuàng)建一個(gè)帶有內(nèi)聯(lián)代碼的<script>元素。一旦新<script>元素被添加到文檔,代碼將被執(zhí)行,并準(zhǔn)備使用。 

這種方法的主要優(yōu)點(diǎn)是,您可以下載不立即執(zhí)行的 JavaScript 代碼。由于代碼返回在<script>標(biāo)簽之外(換句話說(shuō)不受<script>標(biāo)簽約束),它下載后不會(huì)自動(dòng)執(zhí)行,這使得您可以推遲執(zhí)行,直到一切都準(zhǔn)備好了。另一個(gè)優(yōu)點(diǎn)是,同樣的代碼在所有現(xiàn)代瀏覽器中都不會(huì)引發(fā)異常。 

此方法最主要的限制是:JavaScript 文件必須與頁(yè)面放置在同一個(gè)域內(nèi),不能從 CDN 下載(CDN 指”內(nèi)容投遞網(wǎng)絡(luò)(Content Delivery Network)”,所以大型網(wǎng)頁(yè)通常不采用 XHR 腳本注入技術(shù)。 

總結(jié)

減少 JavaScript 對(duì)性能的影響有以下幾種方法:

  • 將所有的<script>標(biāo)簽放到頁(yè)面底部,也就是</body>閉合標(biāo)簽之前,這能確保在腳本執(zhí)行前頁(yè)面已經(jīng)完成了渲染。
  • 盡可能地合并腳本。頁(yè)面中的<script>標(biāo)簽越少,加載也就越快,響應(yīng)也越迅速。無(wú)論是外鏈腳本還是內(nèi)嵌腳本都是如此。
  • 采用無(wú)阻塞下載 JavaScript 腳本的方法:
  • 使用<script>標(biāo)簽的 defer 屬性(僅適用于 IE 和 Firefox 3.5 以上版本);
  • 使用動(dòng)態(tài)創(chuàng)建的<script>元素來(lái)下載并執(zhí)行代碼;
  • 使用 XHR 對(duì)象下載 JavaScript 代碼并注入頁(yè)面中。

通過(guò)以上策略,可以在很大程度上提高那些需要使用大量 JavaScript 的 Web 網(wǎng)站和應(yīng)用的實(shí)際性能。 

Via IBM DeveloperWorks


    本站是提供個(gè)人知識(shí)管理的網(wǎng)絡(luò)存儲(chǔ)空間,所有內(nèi)容均由用戶發(fā)布,不代表本站觀點(diǎn)。請(qǐng)注意甄別內(nèi)容中的聯(lián)系方式、誘導(dǎo)購(gòu)買(mǎi)等信息,謹(jǐn)防詐騙。如發(fā)現(xiàn)有害或侵權(quán)內(nèi)容,請(qǐng)點(diǎn)擊一鍵舉報(bào)。
    轉(zhuǎn)藏 分享 獻(xiàn)花(0

    0條評(píng)論

    發(fā)表

    請(qǐng)遵守用戶 評(píng)論公約

    類(lèi)似文章 更多

    久久99精品国产麻豆婷婷洗澡| 高清一区二区三区四区五区| 日本婷婷色大香蕉视频在线观看| 一二区不卡不卡在线观看| 中文字幕亚洲精品在线播放| 亚洲一级二级三级精品| 亚洲av又爽又色又色| 黄色片一区二区在线观看| 精品人妻久久一品二品三品| 亚洲夫妻性生活免费视频| 中文字幕精品少妇人妻| 久七久精品视频黄色的| 国产欧洲亚洲日产一区二区| 亚洲国产精品国自产拍社区| 日韩欧美91在线视频| 视频在线播放你懂的一区| 亚洲欧洲成人精品香蕉网| 成人精品亚洲欧美日韩| 人妻内射精品一区二区| 国产精品成人一区二区三区夜夜夜| 黄片免费在线观看日韩| 一区二区日本一区二区欧美| 国产免费自拍黄片免费看| 久久国内午夜福利直播| 国产传媒一区二区三区| 日本加勒比在线观看不卡| 国产肥女老熟女激情视频一区 | 国产目拍亚洲精品区一区| 中国一区二区三区不卡| 东京热加勒比一区二区三区| 国产欧美性成人精品午夜| 日本精品中文字幕人妻| 不卡免费成人日韩精品| 精品香蕉国产一区二区三区| 黄片在线免费看日韩欧美| 91精品欧美综合在ⅹ| 亚洲中文字幕视频在线播放| 日韩国产亚洲欧美激情| 欧美日韩国产福利在线观看| 国产午夜精品亚洲精品国产| 成人日韩视频中文字幕|