1.20日(rì)音(yīn)訊,網站(zh∏¶àn)建設之H5新技(jì)術(shù)面面觀。從(cón×₹ g)性能(néng)角度來(lái)說(shuō),HTML5首先是(α¥♣shì)縮減了(le)HTML文(wén)檔,使這(zhè) ©$ 件(jiàn)事(shì)情變得(de)更簡單。從(cóngδ→α♠)用(yòng)戶可(kě)讀(dú)性上(÷ shàng)說(shuō),原先一(yī)大(dà)堆東(dōng)₽≥西(xī),像初學者第一(yī)次看(kàn)到(dào)這(zhè)些(≥εxiē)東(dōng)西(xī)是(shì)看(kàn)不(b™≠ù)懂(dǒng)的(de),而HTML5的(de)聲明(míng)方式對(dφ¥♣uì)用(yòng)戶來(lái)說(shuō)顯然更友(yǒu)好(hǎo™$±)一(yī)些(xiē)。文(wén)檔編碼♥÷的(de)聲明(míng),用(yòng)HTML5方式的(♠☆>de)話(huà),就(jiù)很(hěn)簡單。很(hěn '∞♦)多(duō)人(rén)問(wèn)HTML5是(shì)什(shén)麽?∞≥↑$我們說(shuō)可(kě)以先用(yòng)HTML5的(d↑¥e)方式就(jiù)是(shì)把DOCTY∞≥β®PE先改了(le),因為(wèi)目前很(hěn)多(§σduō)頁面都(dōu)還(hái)是(shì)用ε♦±↑(yòng)傳統的(de)方式。HTML5的(de)♣方式,本身(shēn)是(shì)兼容IE浏π♥♣≠覽器(qì)的(de),從(cóng)IE6到(dào)IE1πσ♦♦0都(dōu)可(kě)以,包括高(gāo)級浏覽器±←(qì)都(dōu)支持。所以說(shuō)擁抱HTML$₽5最簡單的(de)方式就(jiù)是(shì)ββ" 把DOCTYPE給改了(le)。
1.更簡潔的(de)标簽
接下(xià)來(lái)可(kě≤$¥ )能(néng)并不(bù)是(shì)一(yī)件∏∑ ≥(jiàn)很(hěn)常見(jiàn)的(de)事(shì)情$φ,但(dàn)是(shì)卻是(shì)我比較推崇↓∞σ的(de),使用(yòng)更簡潔的(de)标簽δ≥&★方式。HTML5從(cóng)這(zhè)個(gè)名字大(dà)家(j ★iā)可(kě)以聽(tīng)出,它是(shì)↔π從(cóng)HTML4繼承過來(lái)的(de)。HTML4裡(lǐ↕♦✔)面有(yǒu)嚴格模式跟過渡模式,HTMσσ'L5是(shì)支持這(zhè)種過渡模式的(de),就(jiù)是(sh♠→✔×ì)你(nǐ)可(kě)以不(bù)把一(yī)些(xiē<ε)标簽閉合。但(dàn)是(shì),我并ε€€≤不(bù)推薦所有(yǒu)的(de)标簽,比方說(shuō)BODY标↔♥簽的(de)不(bù)閉合,這(zhè)種我們不(bù)推薦×≠¥←。但(dàn)是(shì)像P标簽最常用(yòng)的(de)ו₩®,還(hái)有(yǒu)列表标簽LI。為(wèi)什(shén)€♥ 麽這(zhè)樣說(shuō)?首先從(cóng₽α♦₩)視(shì)覺的(de)角度來(láiγ★↓≥)說(shuō),這(zhè)樣的(de)方式更簡潔一(yī)≈§®¥點。然後關鍵的(de)是(shì)在文(wén)檔傳輸過程中,內(nè™≥φi)容會(huì)更少(shǎo)。
HTML5标簽屬性的(de)聲明(míng)支持三種方式:單括号©£♣、雙括号和(hé)不(bù)加括号。為(w&£èi)了(le)減少(shǎo)文(wén)檔大(d≥ à)小(xiǎo),我是(shì)選擇不(bù)加雙引号的(₽β←de)方式或單引号的(de)方式。但(dàn)是(shì)要(yà✘₹★o)注意,假設是(shì)類屬性的(de)聲明(míng),因屬性可(kě)能∑÷(néng)包括多(duō)個(gè)類,♣≥♠±多(duō)個(gè)類的(de)時(shí)候則π↔λ必須用(yòng)括号括起來(lái)。在這(zhè)方面,給大¶(dà)家(jiā)看(kàn)一(yī)下(xià)谷歌(gē)的(de)一φπ ©(yī)個(gè)實踐。谷歌(gē)自(zì)己有(yǒ¶♣≈↔u)一(yī)個(gè)頁面完全實踐了(le)上(shàng)面的(♦≈σde)東(dōng)西(xī),文(wén)檔的(de) ♣∑α大(dà)小(xiǎo)減少(shǎo)了(le)2 δ0%,使HTML文(wén)檔的(de)傳輸減少(shǎo)了(le)20%★©→。如(rú)果把整個(gè)都(dōu)實踐起來"γ≈¥(lái),可(kě)以達到(dào)5%&mdashδπ∏±;20%之間(jiān)的(de)減少(shǎo)。這(zhè)是(s π¶hì)第一(yī)步,縮減HTML文(wén)檔的(de)大(dà)小(xiǎ>o)。
2.圖片優化(huà)
接下(xià)來(lái)是(shì)關↕♦€于圖片的(de)優化(huà),圖片永遠(yuǎn)是(s ↔₩"hì)又(yòu)愛(ài)又(yòu)恨的(de)元素。因♠ε€為(wèi)當圖片多(duō)的(de)時∞ ε(shí)候,會(huì)嚴重拖垮整個(gè£↔∞®)頁面的(de)加載速度。關于圖片的(de)優化(huà)方式,《高('φ∏♦gāo)性能(néng)網站(zhàn)》書(shū)中已有( π£>yǒu)很(hěn)多(duō)介紹,總結起來∞☆<α(lái)主要(yào)有(yǒu)三點:✔₩↑®使用(yòng)精靈圖、優化(huà)圖片的(de)大(dà)小(x&↑"iǎo),使用(yòng)DATAURI,具體(tǐ)這(zhè$ε)裡(lǐ)就(jiù)不(bù)細說(shuō)了($∏le)。
圖片優化(huà)的(de)另一(yī)個(gè)思♣'≥路(lù)是(shì):no-image。抛棄圖片,擁抱CS≠¥× S3。原先需要(yào)設置一(yī)張圓角效果↔←Ω 的(de)圖片,現(xiàn)在使用(yòng)CSS♣©3中的(de)border-radius;☆π↑≠原先需要(yào)設置陰影(yǐng)效σ∞果的(de)圖片,現(xiàn)在使用(yòng÷ )CSS3中的(de)box-shadow;原先需要(yào)λΩ®₹設置漸變的(de)背景圖片,現(xiàn)在使用(∑₽yòng)CSS3中的(de)gradient。
3.預取
接下(xià)來(lái)講Prefetching,預取,是☆™σ&(shì)優化(huà)的(de)另一(yī)個(gè)思路(l₹≥>ù)。我們現(xiàn)在優化(huà)的(de)"↕ ≥思路(lù)無非就(jiù)是(shì)少(shǎo)。很(hěn)多(d✘₩±>uō)都(dōu)是(shì)從(cóng)≤ ∑少(shǎo)的(de)角度,比方說(shuō)前面把文(wén)檔大(₽≈♣✘dà)小(xiǎo)減少(shǎo),把圖片的(de)大(dà)小(xi¥↕ǎo)減少(shǎo)。很(hěn)多(duō)張的(de)圖片變成α♦一(yī)張精靈圖,都(dōu)是(shì)為(wèi)了(le)把發送請α≥(qǐng)求的(de)數(shù)量減少(shǎo)。預取的(de)話(huα"à),是(shì)另一(yī)種思路(lù),提早加載好(hǎo×♣€ )資源,用(yòng)戶去(qù)點的(de)時(shí)候,實際↕π>上(shàng)已經加載好(hǎo),那(nà)肯定是(shì)™≥$更快(kuài)了(le)。
預取,一(yī)共有(yǒu)兩部分(fēΩφ•n):一(yī)部分(fēn)是(shì)資源的(de)預取,還(h₩∏ái)有(yǒu)一(yī)部分(fēn☆∑§)是(shì)DNS的(de)預解析。
資源預加載有(yǒu)幾個(gè)點需要(yào)注意:
預加載隻是(shì)在浏覽器(qì)空(kōn"♦∑∏g)閑的(de)時(shí)候才會(huì)去(qù)拉,但(d&₽₽àn)不(bù)保證一(yī)定會(huì)去(qù)拉,這(zh₽✘¶è)是(shì)很(hěn)重要(yào)的(dσ€ λe)一(yī)點。因為(wèi)本身(shēn)浏覽器(qλ☆↓↓ì)有(yǒu)一(yī)個(gè)全局的(de)監聽(γ↔•Ωtīng)器(qì),這(zhè)是(shì≠$×)內(nèi)部的(de)一(yī)個(gè)接口,當浏覽氣空(€φδ€kōng)閑的(de)時(shí)候,它會(huì)去(qù¶™)執行(xíng)浏覽器(qì)空(kōng)閑←€∞∏的(de)時(shí)候應該做(zuò)事(shì)情,但(£ dàn)是(shì)這(zhè)個(gè)空(kōng)閑的(d♦™ ↔e)回調不(bù)一(yī)定被觸發,所以說(shuō)并不(bù)保≈≤證一(yī)定會(huì)執行(xíng)預加載。
Chrome不(bù)支持HTTPS資源的(de)預加載,像Alip•∏✔ay是(shì)HTTPS的(de)頁面,Chrome不(bù)會(huì)£✘≠去(qù)預拉取。
一(yī)個(gè)預拉取的(de)頁面§€雖存在後不(bù)可(kě)見(jiàn),實際上(shàng)∏™它是(shì)在正常解析。假如(rú)說(sπαhuō)我預拉取登陸頁面,登陸頁面有(yǒu)很(hěn)多(duō←')資源,比方說(shuō)有(yǒu)圖片,有(yǒu)CSS∞Ω文(wén)件(jiàn),JS文(wén)件(jiàn)。它是π©¶(shì)從(cóng)上(shàng)往下(xià)正常的(de)會(huì←≈♦♣)被解析,解析的(de)過程中,這(zhè)個(gè)頁面沒有(yǒ≠♥¶u)顯現(xiàn),但(dàn)是(shì)它實際上(shΩ βàng)是(shì)存在的(de)。在HTML5裡(lεα≠ǐ)面,可(kě)通(tōng)過document.visibilityS€↓π tate得(de)到(dào)當前頁面狀态,通(tō★∏ng)常頁面有(yǒu)兩種狀态,可(k↓∞ě)見(jiàn)與不(bù)可(kě)見(jiàn),但(dàn)是(shì§¶")現(xiàn)在有(yǒu)一(yī)個(gè ×)新的(de)狀态,叫做(zuò)預渲染的(de)狀态。可(•$kě)以直接通(tōng)過document&<.visibilityState是(shì)否等于pr®"Ωerender來(lái)判斷頁面是(shì)₽φ∏₹否在預渲染狀态。
4.DNS解析
接下(xià)來(lái)是(shì)關于↔γDNS的(de)解析。有(yǒu)時(shí)候我們登入頁面,對(du→↑ ì)用(yòng)戶可(kě)能(néng)點的(de)地(dì✘®↔)方相(xiàng)對(duì)而言是(≠↔shì)比較難探測到(dào),當然有(yǒu)時(shí)候↔≤我們會(huì)做(zuò)一(yī)些(xiē)埋點來(lαε♣ái)探知(zhī)用(yòng)戶下(xià)一(yī₹↔φ)步行(xíng)為(wèi)大(dà)部分(fēn)是(s★♥hì)往裡(lǐ)走。但(dàn)有(yǒu)些(xiē)情況下≠∏₽(xià),我們不(bù)知(zhī)道(dào)用(yòng)戶下≈←₹(xià)一(yī)步具體(tǐ)會(huì)走到(dào)哪一(yβ₹£ī)個(gè)頁面的(de)時(shí)候,但(dàn)是(shì)我們知(↔σγ↔zhī)道(dào)他(tā)要(yào)走到♦÷(dào)哪一(yī)個(gè)域。這(zhèΩ♠→¥)個(gè)時(shí)候,我就(jiù)>₹' 可(kě)以預解析DNS。因為(wèi)☆©>★實際上(shàng),整個(gè)頁面的(de)請(×↕qǐng)求過程中間(jiān)有(yǒu)一(yδ>ī)個(gè)很(hěn)長(cháng)的(de)DNS的(de)解析過¶$程,如(rú)果說(shuō)這(zhè)個(gè)我們提≠™ 前做(zuò)了(le),就(jiù)可(kě)以更進一(yī)步讓用∑♦<(yòng)戶看(kàn)到(dào)這(zhè)一(yī)頁面。↕&β
以下(xià)是(shì)Q+壁紙(zhǐ)的(de)案例。Q+★↓→壁紙(zhǐ)是(shì)Q+某一(yī)個(gè)系統系統,首先<≈γΩQ+整個(gè)的(de)架構是(shì)基于≠σ←WEB+客戶端。我們現(xiàn)在看(kàn)到(dào)的(deαα✘←)就(jiù)是(shì)一(yī)個(gè)÷★$WEB的(de)頁面,雖然它外(wài)面是(shì&β<)一(yī)個(gè)客戶端的(de)殼,但(dà$≤n)是(shì)它的(de)心是(shì)WEB的(de)。整個(↔≥gè)過程在我們第一(yī)次在完成的(de<β₩₽)時(shí)候,因為(wèi)圖片比較多(duō),所有(§♠©∏yǒu)的(de)靜(jìng)态資源是δ™¶(shì)分(fēn)配到(dào)十幾個(gè)靜(→€≠jìng)态服務器(qì)上(shàng)。也(yě)就(§$jiù)是(shì)說(shuō),如(rú)果我要(yà©"βo)去(qù)拉的(de)時(shí)候λ✘,我就(jiù)要(yào)解析10個(gè'≈ε÷)DNS,這(zhè)個(gè)時(shí)間(jiān)是¶™(shì)相(xiàng)當耗時(shíδ∑₹)的(de),最慢(màn)的(de)時(shí)候可(kě★ε )能(néng)會(huì)延遲幾秒(miǎo)鐘(zhōng ©"),這(zhè)是(shì)我們肉眼能(néng)感✘₹覺到(dào)的(de)。如(rú)果進行(xíng)DNS預®£←$解析,因為(wèi)本身(shēn)資源我→§λ₽不(bù)知(zhī)道(dào)具體(tǐ)是(s™♠β♣hì)哪一(yī)個(gè),所有(yǒu)圖片都(dōu)是(s✔γhì)随機(jī)的(de),所以我們隻∏ σ能(néng)說(shuō)在DNS預解析上(shàn™≠•λg)下(xià)功夫,來(lái)提升它的(de)速度。這(z₹hè)樣的(de)話(huà),從(cóng)原來(lái)可(kě)能(né×♥ng)需要(yào)2秒(miǎo)鐘(zhōng),我就(jiù♦π ∏)變成1秒(miǎo)鐘(zhōng)。
接下(xià)來(lái)講Q+中的(d₩££e)應用(yòng)。我們會(huì)像QQ裡(lǐ)面一(←©α&yī)樣,QQ裡(lǐ)面跟Q+都(dōu÷★)有(yǒu)很(hěn)多(duō)文 ≤(wén)字鏈,就(jiù)是(shì)窗(chuāng↕€♦→)口的(de)左下(xià)角有(yǒu)'≈<Ω一(yī)個(gè)文(wén)字APP信息的(deβ £)推送。這(zhè)邊是(shì)通(tōng)過WEB時(shí)π時(shí)去(qù)拉取後端,後端拉取過來(lái)然後在前台顯示。•↕♠但(dàn)是(shì)在某一(yī)個(gè)時(shí)期,其實所有(yǒ≈δu)的(de)APP它一(yī)共推送的(de)運營信息是(shì)∞β¶§固定的(de)。如(rú)果說(shuō)按某個(gè)具₽γ體(tǐ)APP去(qù)分(fēn)析每個(gèγ©')文(wén)字鏈對(duì)應數(shù)組的(de)話(huà),這±≥ ∞(zhè)個(gè)時(shí)候是(shì)非常± 大(dà)數(shù)據。因為(wèi)這(zhè)裡(lǐ)一(≤↓>yī)個(gè)就(jiù)大(dà)概有(yǒu)達到(dào₩$ε€)三四百個(gè)字節,從(cóng)優化(huà)≠∏ε的(de)角度說(shuō),我們把這(zhè)些(x₹≥iē)每次拉區(qū)過來(lái)的(de)存在本地(dì)。再÷®存上(shàng)本地(dì)的(de)localStorage,我們是∑↓(shì)同一(yī)域,所有(yǒu)的(de)±≤APP之間(jiān)的(de)信息都(dō÷β♣u)是(shì)可(kě)以相(xiàng)互訪問(w®₹ èn)的(de)。然後就(jiù)是(shì)把所有(yδ≥ǒu)拉過的(de)ID,就(jiù)不♣÷ ♥(bù)會(huì)再重新拉一(yī)遍。
在這(zhè)裡(lǐ)也(yě)有(yǒu)一(yī)個(gè)需要↔♠₩(yào)注意的(de)點,localStorage目前很(hěn)多(" ™®duō)廠(chǎng)商的(de)實現(xiàn) ™<Ω是(shì)同步的(de)。如(rú)果你(nǐ)大(dà)量地(dì)♣§÷調用(yòng)localStorage這(zhè)個(gè)¥接口,實際上(shàng)他(tā)會(huì)απ<阻塞你(nǐ)的(de)渲染進程。這(zhè)個(gè)時 ☆πλ(shí)候,當用(yòng)戶往下(xià)拖動頁面的(de←"§)時(shí)候,然後你(nǐ)這(zhè&♠)個(gè)時(shí)候又(yòu)正好(hǎo)在☆®↓ 做(zuò)存儲數(shù)據,這(zhδ®'è)個(gè)數(shù)據又(yòu)比較大(dà),這(zhè)個(≥≥gè)時(shí)候用(yòng)戶就(jiù)會(hu$'✔ì)感覺你(nǐ)這(zhè)個(gè)頁 '面非常卡。之前他(tā)們都(dōu)有(yǒu)討(t &£ǎo)論這(zhè)個(gè)問(wèn)題,本身₽♠(shēn)這(zhè)個(gè)接口的(de)設計∏¶σ×(jì)IE是(shì)設計(jì)成異步的(σβ♥de),他(tā)們設計(jì)是(shì)成同步。這(zh'→è)個(gè)會(huì)導緻在調這(zhè)個(gè)借口的 §✔₹(de)時(shí)候,假設你(nǐ)程序比較多(duō),因為(w<₩δ↔èi)有(yǒu)一(yī)個(gè)序列化(huàγσ↔↑)的(de)過程,序列到(dào)磁盤。這(zhè)樣的(deδ♣)話(huà),整個(gè)過程就(jiù)±✘會(huì)顯得(de)比較慢(màn)。再加上(shàn≈©δg)本身(shēn)localStorage可(kě)以←±做(zuò)不(bù)同的(de)窗(chuāng)口之間(j♦∞iān)共享這(zhè)個(gè)數(shù)據,它會(huì♥∞ε)在這(zhè)個(gè)數(shù)據上Ωγ©★(shàng)加鎖。如(rú)果大(dà)量地(dì±✔Ω↑)數(shù)據在調用(yòng)這(zhè)個(gè)本地(dβ♥✘€ì)接口,它就(jiù)會(huì)顯得(de)↑€₩γ比較卡。所以目前沒有(yǒu)什(shén)麽特别好λ↔(hǎo)的(de)解決方案,但(dàn)是←λ(shì)這(zhè)是(shì)需要(yào)記住的 ↓<(de)。即使說(shuō)目前最大(dà)的(de)五點多(duō)←ε兆,如(rú)果你(nǐ)用(yòng)了(le)五點多(duō)兆,會(₽γhuì)讓用(yòng)戶很(hěn)悲催。因為(wèi)你(nǐ)如"∑↓(rú)果一(yī)去(qù)調用(yòng)這(→™γ£zhè)個(gè)借口,用(yòng)戶在拖♠®↑用(yòng)鼠标,就(jiù)覺得(de)非常卡。
5.離(lí)線存儲
接下(xià)來(lái)講離(lí)線存儲 在性能(néng)方面給用(yòng)戶帶來(lái)的(de)好(h♠™ǎo)處。首先是(shì)進離(lí)線¶δ$存儲的(de)定義文(wén)件(jiàn),在Q+中所有(yǒu)的(de)≤ β₩系統模塊,都(dōu)是(shì)有(yǒu)定義離(lí)€<λ線支持。就(jiù)是(shì)說(shuō)所有✘€(yǒu)的(de)應用(yòng),如(rú)果網斷§™→了(le),還(hái)是(shì)可(kě)∞α 以用(yòng)。在文(wén)檔中加入MANIFEST的(de ¶×)文(wén)件(jiàn),MANIFEST是(sh₹§★ì)一(yī)個(gè)定義文(wén)件(jiàn),聲明(mín &g)當前頁面哪些(xiē)是(shì)需要(yào)存儲在本地(dì)的(d×&e)?哪些(xiē)是(shì)不(bù)需要(y"λ↔®ào)存儲的(de)?哪些(xiē)如(αφ$rú)果說(shuō)請(qǐng)求失敗,應該用(yòng)哪些(xiē)新₽¶★的(de)圖片或者什(shén)麽來(lái)代替?這(zhè)樣分(fΩ€ēn)三塊:
第一(yī),CACHE,哪些(xiδ±→®ē)需要(yào)存儲到(dào)本地(dì)。
第二,NETWORK,是(shì)不(bù)會(huì)存儲在本地(d →®ì)的(de),它每次都(dōu)回去(qù)請(qǐng)求一(×∑yī)遍但(dàn)是(shì)這(zhè)裡(lǐ)需要(yào)>₽ε指出的(de)是(shì),本地(dì)存儲跟浏覽器(qì)存儲實際φ♠ 上(shàng)是(shì)兩回事(shì)情,他(tā)們存的(de)是(s$¶hì)兩塊不(bù)同的(de)地(dì)方。即使NETWORK這(zh®™è)邊需要(yào)告訴APP說(shuō),我£"&需要(yào)每次都(dōu)拉一(yī)次®→↕Ω,因為(wèi)像Chrome,他(tā)這(zhè)個(gè)存儲緩存‮是(shì)非常可(kě)惡的(de),比較難清除的(de)☆©¥¥,必須通(tōng)過手動去(qù)清除,才能(néng)完全生(shēng₹§π)效。所以說(shuō)你(nǐ)即使設置了(le)不(bù)₩±♦要(yào)讓它存儲在本地(dì),但(dàn)是(shì)浏∑£≈覽器(qì)可(kě)能(néng)本身"←(shēn)把它存儲起來(lái)了(le),因為(wèi)他(tā)存的(©×de)是(shì)兩塊不(bù)同地(dì)方。
第三,FALLBACK。如(rú)果說(shuō"$₹•)一(yī)個(gè)圖片假如(rú)說≥₹✘↕(shuō)請(qǐng)求失敗,它是(shì)404。那(nà)要(yà™↔ o)用(yòng)什(shén)麽圖片代替?我覺得 →§"(de)這(zhè)個(gè)比較好(hǎo)玩(wán)。
MAEIFEST怎麽設置?MANI↓>δ₽FEST這(zhè)裡(lǐ)需要(yào)注意的(de)是(shì)♠∏±三點:
MANIFEST同源限制(zhì);
MIME類型必須為(wèi)textπ≥/cache-manifest,這(zhè)是(shì)标準的(de),如(✘≠rú)果是(shì)其他(tā)格式,都(dōu)不(bù)會(huì)☆♠生(shēng)效;
CHROME,如(rú)果要(yào)看(kàn)這(zhè) ♠ 個(gè)東(dōng)西(xī)有(yǒu)沒有(yǒu)生(shēng)∏效,可(kě)能(néng)通(tōng)過CHROME這(™™←≈zhè)個(gè)僞協議(yì)的(de)方式在浏覽器(qì)輸入,c★≤hrome://appcache-internals >。
關于如(rú)何去(qù)更新應用(yòng)的(de)緩存。¶為(wèi)什(shén)麽要(yào)離(líγ©σ)線存儲?離(lí)線存儲在本地(dì),當浏覽器(qì)知(zh§β↑ ī)道(dào)你(nǐ)有(yǒu)離(lí)線存儲你(nǐ),π÷它會(huì)首先去(qù)離(lí)線存儲的(dε☆e)目錄下(xià),去(qù)找這(zhè)個(gè)資源是(shì)否已經Ω<被Cache。當它已被Cache的(de)時(shí)候∏α•,他(tā)就(jiù)直接從(cóng)這(zhè)邊拿®δ(ná)到(dào)這(zhè)個(gè)♣λ資源,不(bù)會(huì)再去(qù)發送一(yī)個(gè)請(qǐn±βg)求。因為(wèi)浏覽器(qì)的(de)請(qǐ↓↔ng)求是(shì)這(zhè)樣的(de),當有(yǒu)離(lí)線€β存儲的(de)話(huà),就(jiù)連請(qǐng)求都(dōu)♠ 不(bù)會(huì)發,所以說(shuō)會(huì)更快(kuài)。™λ如(rú)果說(shuō)有(yǒu)的(de)時(shí)候我們需 ®•♣要(yào)更新,更新的(de)時(shí)候怎®♠♦麽辦?
用(yòng)戶可(kě)以手動去(qù)清除浏覽器(↑÷≠qì)的(de)Cache,這(zhè)個(gè)時(shí)> ¥候自(zì)動把本地(dì)存儲給清除了(le)。
修改MANIFEST的(de)任何內(nèi)容♥₽,這(zhè)是(shì)比較推薦的(de)方式,也★✔(yě)是(shì)我們線上(shàng)用(yòng)的(de)方式¶© ©。就(jiù)是(shì)說(shuō)我們可(kě₹λ )以修改裡(lǐ)面的(de)的(de)具體(tǐ)項目,但( ← dàn)是(shì)這(zhè)裡(lǐ)應該最好(hǎo)α$↓是(shì)修改注釋,因為(wèi)我每次¥'σ發布的(de)時(shí)候,我們自(zì)動發布機(jī)制(zhì)∞★,發布的(de)時(shí)候在上(shàn" g)面注釋修改一(yī)下(xià)就(jiù)可(kě)以了(le)₩₽₹。這(zhè)樣的(de)話(huà),每次發 布的(de)內(nèi)容,都(dōu)會(huì)實時(shí)同步到(dàα™↓εo)客戶端的(de)本地(dì);
通(tōng)過程序去(qù)執行(xíng),程序的(de)就 ∑§Ω(jiù)是(shì)window.applicationCa§≠¥che.update()。就(jiù)是(shì)我要(yào)去(qù©¥σ>)操作(zuò)離(lí)線存儲,其實我有(yǒu)時(shí)候叫應用✘®©∞(yòng)存儲,因為(wèi)它的(de)語意就σ↑∞(jiù)是(shì)應用(yòng)存儲。我們去(q ₽₩©ù)手動的(de)更新應用(yòng)存儲。
6.WebWorker
接下(xià)來(lái)WebWorker。WebW☆λorker是(shì)一(yī)個(gè)多(duō)線程的(de©↔)JS進程。應用(yòng)場(chǎng)景其實我們在線上(sh£Ω×àng)的(de)話(huà),是(shì)沒有(yǒu)的(de),我就φ♠(jiù)不(bù)講了(le)。但(dàn)是(α↓γshì)可(kě)以講下(xià)具體( ε∏tǐ)我看(kàn)到(dào)過的(de)應用(yòng)場(chǎng)λδ¥景。
首先介紹一(yī)下(xià)WEBWORK是(shì)什(shén)麽" φ♦東(dōng)西(xī)?它是(shì)一(yī)個(gè)OS級别的(d&÷εe)線程。之前我們模仿多(duō)線程,實際←£≠上(shàng)都(dōu)是(shì)多(d↑¥ uō)開(kāi)一(yī)個(gè)窗(chuānφ÷≈≤g)口。但(dàn)是(shì)現(xiàn)在的(d♣∏©©e)話(huà),浏覽器(qì)本身(shēn)就(jiù)提♠✔供了(le),這(zhè)個(gè)會(αε↕βhuì)讓操作(zuò)帶來(lái)更多(duō)便利,是('shì)讓我們整個(gè)文(wén)檔比較重,并不(bù)是(shì)很(h±₹™ěn)建議(yì)的(de)方式。
然後WebWorker訪問(wèn)能& ε(néng)力是(shì)有(yǒu)限的(de),≈φ>它并不(bù)能(néng)訪問(wèn)到(dào)很(hěn)多(du&♠≠₽ō)全局對(duì)象。比如(rú)說(shuō)documne∑☆t對(duì)象它是(shì)訪問(wèn)不(bù)了(le←€↕)的(de)。WebWorker最适合的(de)場(c≥×hǎng)景就(jiù)是(shì)CPU密集型的( ♥®×de)計(jì)算(suàn)操作(zuò)。之前我們做(↔≈ zuò)遊戲的(de)時(shí)候,我們用(yò↕↕≠'ng)BOX2D。應該很(hěn)多(duō)人(r≈σ¶én)聽(tīng)到(dào)過,它涉及到(dào)大(dà)量的(d₽∑e)計(jì)算(suàn),就(jiù≥₹©♠)是(shì)整個(gè)頁面裡(lǐ)£↕α面,下(xià)面所有(yǒu)的(de)物(wù)體(tǐ)要(yào)去♦≠♠(qù)計(jì)算(suàn)它們的(de)碰撞關系,這(zhè)個(g↕$è)計(jì)算(suàn)量是(shì)非常大(dà)的(de)↓ $☆。但(dàn)是(shì)如(rú)果放≤≤₩δ(fàng)在當前的(de)JS的(de)進程裡(lǐ)面去(qù÷§✔)執行(xíng),這(zhè)個(gè)計(jì)算( ¥suàn)量一(yī)大(dà),一(yī)計(jìλ•σ≤)算(suàn),整個(gè)頁面就(jγ≤®iù)非常卡。但(dàn)是(shì)如(rú)果用(yòng)WebWo<€rker去(qù)做(zuò),它是(sh★©ì)異步的(de)過程,實時(shí)的(de)發送過去(qù),在計(jì)♠ ←算(suàn)的(de)過程中還(hái)能(néng)幹其π♦他(tā)事(shì),這(zhè)就(jiù)是(shì)多(d'€∏uō)線程。
7.設備API
講一(yī)下(xià)設備API。設≤☆備API我覺得(de)最重要(yào)在性能(néng)方面,也↔ (yě)是(shì)目前實現(xiàn)最早的(de)API。₹ 一(yī)個(gè)是(shì)CONNECTION,就(jiù)是(s ₹§£hì)網絡帶寬。這(zhè)個(gè)有(yǒu)什(shφ♣ &én)麽作(zuò)用(yòng)?在中國(guó)這(zhè)個(g$'è)場(chǎng)景下(xià),必須得(∞≈de)記住,很(hěn)多(duō)用(yòng)戶的♠'₹¶(de)網速依舊(jiù)是(shì)很(hěn)低(→α→dī)的(de)。我們希望讓用(yòng)戶網速低(dī)的(♦♦de)時(shí)候,能(néng)夠自(zì<♠♣)動降級到(dào)一(yī)個(gè)比∑•✘≤較低(dī)的(de)方案。如(rú)果用(☆∏™yòng)現(xiàn)有(yǒu)的(de)技(jì)術(s✔Ω✘hù),我們是(shì)做(zuò)不(bù)到(dào)的(de)。但(&♥dàn)是(shì)使用(yòng)設備©§€→API我們是(shì)可(kě)以的(de)。因為(wèi)我們知(zhī'™↓')道(dào),從(cóng)設備上(sh₽±£àng)可(kě)以取到(dào)這(zhè)些(xiē)信息。它的(Ω<de)寬帶是(shì)多(duō)少(shǎo),多(duō)少(shǎ<∑"§o)寬帶的(de)時(shí)候我們能(néng)®$幹的(de)事(shì)情。比方說(shuō)寬帶♣♣好(hǎo)的(de)時(shí)候,我就(ji±φ↓ù)用(yòng)高(gāo)清圖片。寬帶比較低(dλ♠>ī)的(de)時(shí)候,就(jiù)用(yòng)清÷±≤®晰度比較低(dī)的(de)圖片。