精品欧美一区二区三区在线观看 _久久久久国色av免费观看性色_国产精品久久在线观看_亚洲第一综合网站_91精品又粗又猛又爽_小泽玛利亚一区二区免费_91亚洲精品国偷拍自产在线观看 _久久精品视频在线播放_美女精品久久久_欧美日韩国产成人在线

關(guān)于網(wǎng)頁內(nèi)容加速黑科技的趣談

開發(fā)
數(shù)周前,在倫敦 Heathrow 機(jī)場等飛機(jī)的空閑中,我順便處理了一些工作上的事情。不經(jīng)意間發(fā)現(xiàn) Github 在性能方面的一些問題,頗為詫異。通過新 tab 打開的頁面,其加載速度竟然比直接點(diǎn)擊鏈接打開的頁面要快。

[[206259]]

數(shù)周前,在倫敦 Heathrow 機(jī)場等飛機(jī)的空閑中,我順便處理了一些工作上的事情。不經(jīng)意間發(fā)現(xiàn) Github 在性能方面的一些問題,頗為詫異。通過新 tab 打開的頁面,其加載速度竟然比直接點(diǎn)擊鏈接打開的頁面要快。

點(diǎn)擊鏈接的同時(shí)復(fù)制鏈接并在新的 tab 頁中打開。可以看到,盡管先點(diǎn)擊的是鏈接,但渲染更快的卻是新 tab 中打開的頁面。

有一說一

頁面加載的時(shí)候,瀏覽器會接收網(wǎng)絡(luò)數(shù)據(jù)流,并將其輸出(pipe)給 HTML 解析器,HTML 解析器再將數(shù)據(jù)輸出到文檔。這意味著,頁面是邊加載邊渲染的。對于一個(gè) 100k 的頁面來說,瀏覽器很可能在接收到 20k 數(shù)據(jù)的時(shí)候就開始渲染出一些可用內(nèi)容了。

這個(gè)偉大又古老的特性,常常被開發(fā)者們有意無意地忽略了。多數(shù)提高加載性能的建議都?xì)w結(jié)于一點(diǎn),即“展示你所拿到的東西” —— 別怕,千萬不要傻傻等待一切加載完成之后再去展示內(nèi)容。

GitHub 當(dāng)然是關(guān)注性能的,所以他們使用服務(wù)端渲染。但在同一個(gè) tab 下瀏覽頁面時(shí),他們用 JavaScript 重新實(shí)現(xiàn)了導(dǎo)航(navigation)功能,類似下面這樣:

  1. // …一堆重新實(shí)現(xiàn)瀏覽器導(dǎo)航功能代碼… 
  2. const response = await fetch('page-data.inc'); 
  3. const html = await response.text(); 
  4. document.querySelector('.content').innerHTML = html; 
  5. // …加載更多重新實(shí)現(xiàn)導(dǎo)航功能的代碼…  

這違反了規(guī)則,因?yàn)樵?page-data.inc 下載完成之前什么事情都沒干。而服務(wù)端渲染版完全不會這樣囤積內(nèi)容,其內(nèi)容是流式的,這樣就要快得多了。就 Github 的客戶端渲染來說,很多 JavaScript 代碼完全減慢了渲染過程。

這里我僅僅只是拿 Github 舉例子 —— 這種反模式在單頁應(yīng)用中比比皆是。

在頁面之內(nèi)切換內(nèi)容可能確實(shí)有些好處,特別是存在大量腳本的情況下,無需重新執(zhí)行全部腳本即可更新內(nèi)容。但我們能否在不放棄流的情況下完成這樣的工作呢?我曾經(jīng)常說 JavaScript 沒有辦法對流進(jìn)行解析,但其實(shí)還是有的……

<iframe> 和 document.write 大法

iframe 早已躋身圈內(nèi)最臭黑科技之列。但下面這個(gè)辦法就使用了 iframe 和 document.write(),這樣我們就能將內(nèi)容以流的形式添加到頁面中了。示例如下:

  1. // 創(chuàng)建 iframe: 
  2. const iframe = document.createElement('iframe'); 
  3.  
  4. // 添加到 document 中 (記得隱藏起來): 
  5. iframe.style.display = 'none'
  6. document.body.appendChild(iframe); 
  7.  
  8. // 等待 iframe 加載: 
  9. iframe.onload = () => { 
  10.   // 忽略其他 onload 操作: 
  11.   iframe.onload = null
  12.   // 添加一個(gè)虛擬標(biāo)簽: 
  13.   iframe.contentDocument.write('<streaming-element>'); 
  14.   // 引用該元素: 
  15.   const streamingElement = iframe.contentDocument.querySelector('streaming-element'); 
  16.   // 將該元素從 iframe 中取出,并添加到文檔中: 
  17.   document.body.appendChild(streamingElement); 
  18.   // 寫入一些內(nèi)容 —— 這里應(yīng)該是異步的: 
  19.   iframe.contentDocument.write('<p>Hello!</p>'); 
  20.   // 繼續(xù)寫入內(nèi)容,直到完成: 
  21.   iframe.contentDocument.write('</streaming-element>'); 
  22.   iframe.contentDocument.close(); 
  23. }; 
  24.  
  25. //  iframe 初始化 
  26. iframe.src = '' 

雖然 Hello! 是寫到 iframe 中的,但它卻出現(xiàn)在了父級的 document 中!這是因?yàn)榻馕銎骶S護(hù)了一個(gè) 敞開元素棧(stack of open elements),新創(chuàng)建的元素會被壓入棧中。就算我們把 <streaming-element/> 元素移出到 iframe 外面也不影響,就是這么任性。

此外,這種技術(shù)處理起 HTML 來,要比 innerHTML 更接近標(biāo)準(zhǔn)的頁面加載解析器。尤其是腳本依然會被下載,并在父級文檔的上下文中執(zhí)行 —— 只是在 Firefox 中完全不會執(zhí)行,但我認(rèn)為這是個(gè) bug更新: 其實(shí)腳本根本不應(yīng)該執(zhí)行(感謝 Simon Pieters 指出這一點(diǎn)),但 Edge、Safari、Chrome 都這么干。

接下來我們只需要從服務(wù)端獲取 HTML 數(shù)據(jù)流,每當(dāng)一個(gè)部分的數(shù)據(jù)到達(dá)的時(shí)候,就調(diào)用 iframe.contentDocument.write()。流式傳輸和 fetch() 搭配起來會更好,但為了支持 Safari,我們還是使用 XHR 來 hack 一下吧。

我已經(jīng)寫好了一個(gè) demo,可以拿來和 Github 進(jìn)行對比。下面是在 3G 網(wǎng)絡(luò)下的測試結(jié)果:

 

點(diǎn)擊這里查看原始測試數(shù)據(jù)。

使用 iframe 進(jìn)行流式渲染,頁面加載速度提高了 1.5 s。頭像也提前半秒鐘加載完成 —— 流式渲染意味著瀏覽器可以更早發(fā)現(xiàn)它們,并與內(nèi)容一起并行下載。

上面的方法對 Github 來說還是有效的,因?yàn)樗姆?wù)器返回的是 HTML。如果你使用的是框架,由框架自己管理 DOM 的展示,那可能就麻煩一些了。這種情況下可以看看下面這個(gè)次優(yōu)選項(xiàng):

換行符分隔的 JSON

許多網(wǎng)站使用 JSON 驅(qū)動動態(tài)內(nèi)容。何其不幸,JSON 并不是一種對流友好的格式。盡管也有流式 JSON 解析器,可用起來卻并不那么簡單。

所以與其傳輸下面這樣一大塊 JSON 數(shù)據(jù):

  1.   "Comments": [ 
  2.     {"author""Alex""body""…"}, 
  3.     {"author""Jake""body""…"
  4.   ] 
  5.  

還不如像下面這樣一行輸出一個(gè) JSON 對象:

  1. {"author""Alex""body""…"
  2.  
  3. {"author""Jake""body""…" 

這種被稱為 “換行符分隔的 JSON” 是有標(biāo)準(zhǔn)的:ndjson。給上面的內(nèi)容寫一個(gè)解析器就要簡單多了。到了 2017 年,我們也許可以使用一系列組合變換流(composable transform streams)來描述(譯者注:本文寫作于 2016 年 12 月):

  1. // 在 2017 年的某個(gè)時(shí)候可能會是這樣: 
  2. const response = await fetch('comments.ndjson'); 
  3. const comments = response.body 
  4.   // 從字節(jié)到文本: 
  5.   .pipeThrough(new TextDecoder()) 
  6.   // 一直緩沖,直到遇到換行符: 
  7.   .pipeThrough(splitStream('\n')) 
  8.   // 將內(nèi)容塊解析為JSON: 
  9.   .pipeThrough(parseJSON()); 
  10.  
  11. for await (const comment of comments) { 
  12.   // 處理每條評論,并將其添加到頁面: 
  13.   // (不管你使用的是什么模板或虛擬 DOM) 
  14.   addCommentToPage(comment); 
  15.  

在上面的代碼中,splitStream 和 parseJSON 是 可復(fù)用變換流(reusable transform streams)。與此同時(shí),為了實(shí)現(xiàn)***程度的兼容,我們可以使用 XHR 進(jìn)行 hack。

我再次新建了一個(gè)對比的 demo,下面是 3G 網(wǎng)絡(luò)下的結(jié)果:

 

點(diǎn)擊這里查看原始測試數(shù)據(jù)。

與常規(guī) JSON 相比,ND-JSON 提前 1.5s 將內(nèi)容渲染到頁面上,盡管速度不如 iframe 方法那么快。在創(chuàng)建元素之前,必須等待完整的 JSON 對象出現(xiàn)。如果你的 JSON 文件體量巨大,可能會陷入對流的企盼之中。

單頁應(yīng)用?別著急

如前所述,Github 使用了大量的代碼,然而卻帶來這樣的性能問題。在客戶端重新實(shí)現(xiàn)導(dǎo)航功能是困難的,如果你需要改變頁面中的大塊內(nèi)容,這么做有可能并不值得。

可以拿我們的嘗試與簡單瀏覽器導(dǎo)航進(jìn)行對比:

 

點(diǎn)擊這里查看原始測試數(shù)據(jù)。

打開一個(gè)簡單的沒有使用 JavaScript 瀏覽器導(dǎo)航的服務(wù)端渲染頁面的速度差不多是一樣的。但除去評論列表,測試頁面實(shí)在太過簡單。如果在不同頁面之間存在有大量重復(fù)的復(fù)雜內(nèi)容(主要是指可怕的廣告腳本),結(jié)果可能因?qū)嶋H情況而有差異,但一定要記得進(jìn)行測試!很可能你編寫了一大堆代碼,然而只能帶來少的可憐的提升,甚至還可能減慢速度。 

責(zé)任編輯:龐桂玉 來源: Linux中國
相關(guān)推薦

2017-10-20 08:06:46

微軟

2018-05-16 15:09:37

AMD機(jī)械硬盤

2017-07-07 10:24:56

云計(jì)算

2018-07-23 06:38:40

AI芯片數(shù)據(jù)中心

2020-04-29 13:30:38

腳本Chrome黑科技

2016-07-14 16:40:56

黑科技

2023-09-22 08:27:39

2015-01-22 10:17:05

微軟win10

2016-11-14 11:08:06

戴爾服務(wù)器

2018-11-07 09:56:26

2023-12-10 14:19:31

JupyterPython編碼

2016-10-11 16:43:04

小米5s超聲波指紋識別

2014-08-12 13:38:15

2016-11-10 19:31:00

蘇寧雙11

2020-07-10 10:34:22

人工智能無人機(jī)物聯(lián)網(wǎng)

2021-07-07 13:47:38

OCR游戲運(yùn)行圖像

2021-02-17 10:55:32

XRVRAR

2016-03-18 09:52:40

物聯(lián)網(wǎng)wifi技術(shù)

2017-03-24 16:45:34

銳捷
點(diǎn)贊
收藏

51CTO技術(shù)棧公眾號

国产精品少妇自拍| xxxxxx国产| 午夜精品一二三区| 免费精品国产| 一区二区三区四区在线免费观看| 国产视频精品久久久| 喜爱夜蒲2在线| 一区二区视频网站| 久久91成人| 在线成人高清不卡| 亚洲一区二区三区午夜| 五月天激情四射| 激情小说一区| 亚洲美女区一区| 91中文在线视频| 国产传媒免费在线观看| 久久免费资源| 国产精品无人区| 国产精品久久久久77777| 一区二区三区免费在线观看视频| 国产精品一二三产区| 亚洲国产一成人久久精品| 欧美在线免费观看亚洲| 日本一区不卡| 国产熟妇一区二区三区四区| 在线看成人短视频| 色综合久久99| 蜜桃麻豆www久久国产精品| 久久久久免费看| 亚洲va欧美va人人爽成人影院| 亚洲欧美福利一区二区| 麻豆av一区| 黄色一级a毛片| 一本一本久久| 亚洲偷熟乱区亚洲香蕉av| 人人干人人视频| av中文在线| 久热成人在线视频| 欧美成人亚洲成人日韩成人| 熟妇女人妻丰满少妇中文字幕 | 亚洲午夜女主播在线直播| 欧美xxxx日本和非洲| 爱情岛论坛亚洲品质自拍视频网站| 国产成人在线观看| 91精品国产乱码久久久久久久久| 51调教丨国产调教视频| 57pao国产一区二区| 欧美日韩日本国产| 午夜精品亚洲一区二区三区嫩草| 在线观看中文字幕码| 久久久久久久久99精品大| 国产亚洲a∨片在线观看| 免费a级黄色片| 日韩一级特黄| 精品成人在线视频| 亚洲三区视频| 91在线观看| 成人毛片视频在线观看| 国产精品海角社区在线观看| 久久久精品福利| 91精品国产调教在线观看| 色婷婷综合成人| 欧美夫妇交换xxx| 福利一区二区免费视频| 亚洲国产视频网站| 日韩av一区二区三区美女毛片| 国产精品久久婷婷| 亚洲综合二区| 蜜月aⅴ免费一区二区三区| 日韩欧美123区| 中文字幕一区二区三区久久网站| 日韩精品www| 色18美女社区| 快播电影网址老女人久久| 一区二区三区日韩精品视频| 日本一道在线观看| 国产乱妇乱子在线播视频播放网站| 亚洲国产综合91精品麻豆| 亚洲黄色成人久久久| 天堂中文字幕av| 国产一区二区三区久久悠悠色av| 51久久精品夜色国产麻豆| 亚洲精品久久久久久国| 国产精品免费大片| 亚洲国产精品久久久久秋霞不卡| 午夜一区二区视频| 一区二区三区亚洲变态调教大结局| 亚洲精品一区二区三区影院| 91国内在线播放| 深夜视频一区二区| 欧美午夜美女看片| 中文字幕日韩精品无码内射| 欧美激情二区| 亚洲国产高清在线观看视频| 女同性恋一区二区| 午夜激情视频在线| 久久精品一二三| 美女被啪啪一区二区| yourporn在线观看中文站| 樱花影视一区二区| 成人一区二区三| 日韩成人在线看| 国产亚洲精品久久久久久牛牛| 天天鲁一鲁摸一摸爽一爽| 99国产精品自拍| 国产中文字幕日韩| 一级特黄特色的免费大片视频| 久久精品女人| 日产精品久久久一区二区福利| 国产午夜福利片| 亚洲国产国产亚洲一二三| 欧美疯狂性受xxxxx另类| 放荡的美妇在线播放| 午夜影院欧美| 日本免费一区二区三区视频观看 | 麻豆一区二区三区| 精品乱色一区二区中文字幕| 人妻精品无码一区二区| 成人小视频免费观看| 亚洲激情图片| 涩涩视频在线播放| 日韩欧美中文在线| 久久久久无码国产精品一区李宗瑞 | 国产精品激情偷乱一区二区∴| 日韩福利在线| 成人黄色动漫| 精品精品欲导航| avtt香蕉久久| 亚洲宅男网av| 国内精品视频久久| 你懂的国产在线| 国产+成+人+亚洲欧洲自线| 国产一区二区三区av在线| 神马久久高清| 中文字幕国产一区| 久久久久久久久久久久久国产精品| 成人性生活av| 欧美日韩精品是欧美日韩精品| 国产三级生活片| 欧洲三级视频| 欧美国产日韩免费| 999久久久久久| 99热精品国产| 亚洲国产精品日韩| 精品成人免费一区二区在线播放| 国产视频久久网| 成人精品在线看| 麻豆视频一区二区| 亚洲第一导航| 久久精品超碰| 波霸ol色综合久久| 日韩欧美不卡视频| 奇米888四色在线精品| 91视频免费进入| 久久久久国产精品嫩草影院| 久久综合精品国产一区二区三区| 水蜜桃一区二区三区| 吞精囗交69激情欧美| 日韩视频一区二区| 日韩一级av毛片| 欧美日韩国产色综合一二三四| 18性欧美xxxⅹ性满足| 婷婷五月综合激情| 精品高清一区二区三区| 天堂久久久久久| 久久精品一区二区三区中文字幕| 日本不卡二区高清三区| 久久亚洲精品中文字幕| yw.139尤物在线精品视频| 性网爆门事件集合av| 日本一区二区三区免费乱视频| 国产精品自拍合集| 福利视频亚洲| 九九精品在线视频| 亚洲性猛交富婆| 99视频一区二区| 91激情视频在线| 林ゆな中文字幕一区二区| 欧美孕妇性xx| 欧美尤物美女在线| 精品日韩欧美一区二区| 亚洲天堂视频网站| 国产精品美女www爽爽爽| 亚洲一区二区三区三州| 久久福利影院| 国产精品www网站| 女女色综合影院| 亚洲精品二三区| 中文字幕欧美人妻精品一区蜜臀| 亚洲欧美日韩国产手机在线| 日本黄色动态图| 久久国产夜色精品鲁鲁99| 国产肉体ⅹxxx137大胆| 国产一区网站| 丁香五月网久久综合| h片在线免费| 555夜色666亚洲国产免| 精品一区二区6| 欧美aaaaaa午夜精品| 欧美一区二区三区在线播放| 99视频这里有精品| 这里只有视频精品| 人人草在线观看| 亚洲精品免费在线观看| 一级性生活大片| 国产精品中文字幕日韩精品 | 欧美日韩国产色视频| 91禁男男在线观看| www.久久精品| 国产探花在线观看视频| 欧美丰满日韩| 成人中文字幕在线观看| 韩国av网站在线| 欧美一区二区三区四区在线观看 | 91精品综合久久久久久五月天| 超碰在线99| 欧美日韩成人免费| 免费黄色在线看| 亚洲美女精品久久| 三级网站在线播放| 亚洲国产一区二区a毛片| 久久精品亚洲a| 国产欧美一区二区精品秋霞影院 | 国产同性人妖ts口直男| 欧美性xxxxx极品少妇| 谁有免费的黄色网址| eeuss影院一区二区三区 | 亚洲五码在线| 91香蕉电影院| 日日夜夜精品| 国产精品一区二区三区毛片淫片 | 国产三级欧美三级| 一区二区三区视频网| 91精品综合| 午夜精品一区二区在线观看| 老司机精品视频在线播放| 肥熟一91porny丨九色丨| 狂野欧美xxxx韩国少妇| 91精品国产高清久久久久久久久 | 91短视频版在线观看www免费| 亚洲男人av在线| 欧美扣逼视频| 亚洲区一区二区| 91资源在线视频| 欧美日韩一区国产| 国产一级aa大片毛片| 一区二区视频免费在线观看| 全网免费在线播放视频入口| 一区二区三区中文免费| 国产一区二区播放| 一区二区三区不卡在线观看| 六月婷婷七月丁香| 狠狠色丁香婷综合久久| 欧美一级在线看| 亚洲精品99| 国产制服91一区二区三区制服| 午夜国产一区二区| 免费av一区二区三区| 天堂综合网久久| 51成人做爰www免费看网站| 国产精品一区二区三区av| 欧美在线精品免播放器视频| 久久日韩视频| 九九九久久久久久| 99热99re6国产在线播放| 色偷偷亚洲男人天堂| 日韩在线免费电影| 欧美夫妻性生活xx| 成人欧美大片| 成人动漫网站在线观看| 欧美大片免费| 国产精品视频免费在线| a级片在线免费观看| 欧美亚洲视频一区二区| 日韩成人亚洲| 91久久精品美女| 国产精品久av福利在线观看| 国产精品入口免费视| 国产精品麻豆| 国产一区二区三区av在线| 国产在线观看91一区二区三区| 亚洲一区精彩视频| 亚洲黄色av| 在线观看高清免费视频| 欧美专区一区二区三区| 久久国产激情视频| 成人精品国产福利| 深夜视频在线观看| 成人黄色在线视频| 欧美精品日韩在线| 国产三级精品三级| 亚洲国产精品久| 亚洲欧美日韩一区| 欧美日韩色视频| 午夜影院久久久| 免费一级特黄特色大片| 在线精品亚洲一区二区不卡| a天堂在线观看视频| 3751色影院一区二区三区| 天天躁日日躁狠狠躁伊人| 久久精品欧美视频| 国产在线二区| 日韩免费av一区二区| 亚洲国产欧美国产第一区| 日本一区视频在线| 狠狠综合久久av一区二区老牛| 日韩一级片一区二区| 久久精品日产第一区二区| 白丝校花扒腿让我c| 一区在线中文字幕| 无码人妻精品中文字幕| 懂色av一区二区三区| av中文字幕免费| 中文字幕日韩电影| 不卡福利视频| 国产精品一区视频网站| 美女视频免费精品| 青青视频免费在线| 久久精品国产成人一区二区三区| 亚洲中文字幕无码av| 夜夜嗨av一区二区三区中文字幕| 中文字幕日日夜夜| 亚洲天堂男人的天堂| 麻豆mv在线看| 国产一区精品在线| 国自产拍偷拍福利精品免费一| 国产免费中文字幕| 中文字幕乱码一区二区免费| 在线精品免费视| 亚洲精品久久久久中文字幕欢迎你| 丝袜美女在线观看| 18一19gay欧美视频网站| 亚洲精品18| 欧美人与动牲交xxxxbbbb| 国产一区二区在线观看视频| a一级免费视频| 欧美日韩精品一区二区三区| 91大神在线网站| 国产欧美在线视频| 日韩一区二区在线免费| 香蕉视频网站入口| 中文字幕乱码一区二区免费| 国产精品51麻豆cm传媒| 亚洲午夜av电影| 成人自拍视频网| 亚欧洲精品在线视频免费观看| 日韩av一二三| 女人黄色一级片| 欧美日韩综合在线免费观看| 在线免费av网站| 成人国产精品免费视频| 亚洲综合婷婷| 欧洲成人午夜精品无码区久久| 亚洲最大成人网4388xx| 欧美一区二区三区黄片| 8x拔播拔播x8国产精品| 久久最新网址| 污污动漫在线观看| 亚洲人成小说网站色在线| www.国产麻豆| 97香蕉久久夜色精品国产| 色成人综合网| 樱空桃在线播放| 成人性生交大片免费看中文| 亚欧洲精品在线视频| 亚洲精品日韩在线| 97成人超碰| 日韩人妻精品一区二区三区| 国产91丝袜在线播放0| 超碰超碰超碰超碰| 中文字幕综合在线| 蜜桃在线一区| 青青视频在线播放| 成人网页在线观看| 色婷婷av国产精品| 最新日韩中文字幕| 北条麻妃在线一区二区免费播放| 在线看无码的免费网站| 西西人体一区二区| 国产精品久久久久久成人| 欧美一区二区三区四区高清| www.51av欧美视频| 日韩精品久久一区| 国产经典欧美精品| 99精品人妻国产毛片| 久久九九免费视频| 欧美调教在线| 131美女爱做视频| 成人一级片网址| 91麻豆精品在线| 欧美高清第一页| 国产成人调教视频在线观看| 亚洲欧美日本一区二区| 精品人伦一区二区三区蜜桃网站| 自拍视频在线网| 国产精品伊人日日| 国产原创一区二区| 中文字幕在线播| 欧美激情亚洲精品| 丁香5月婷婷久久|