使用 React.js 的漸進(jìn)式 Web 應(yīng)用程序:第 1 部分 - 介紹

來(lái)自譯者 markzhai:大家也知道最近 Web 越來(lái)越火了,如果你還以為 Web 就是 jQuery漓帚、Ajax母债、CSS 什么的,那你就 out 了尝抖。給大家?guī)讉€(gè)鏈接看一看吧:

部分可能需要自備梯子毡们,另外建議在 Chrome 下查看,畢竟該死的 X5昧辽,大家都懂得衙熔。

使用 React.js 的漸進(jìn)式 Web 應(yīng)用程序:第 1 部分 - 介紹

漸進(jìn)式 Web 應(yīng)用程序利用新技術(shù)的優(yōu)勢(shì)帶給了用戶最佳的移動(dòng)網(wǎng)站和原生應(yīng)用。它們是可靠的奴迅,迅捷的青责,迷人的挺据。它們來(lái)自可靠的源,而且無(wú)論網(wǎng)絡(luò)狀態(tài)如何都能加載脖隶。

漸進(jìn)式 Web 應(yīng)用程序 (PWAs) 的世界中有很多新東西扁耐,你可能會(huì)想知道它們和現(xiàn)有架構(gòu)是如何兼容的 —— 比如 React 和 JS 模塊化打包工具如 Webpack 之間的兼容性如何。PWA 是否需要大量的重寫(xiě)产阱?你需要關(guān)注哪個(gè) Web 性能度量工具婉称?在這系列的文章中,我將會(huì)分享將基于 React 的 web apps 轉(zhuǎn)化為 PWAs 的經(jīng)驗(yàn)构蹬。我們還將包括為什么加載用戶路由所需要的王暗,并拋開(kāi)其他所有腳本是提高性能的好方式。

Lighthouse

讓我們從一個(gè) PWA manifest 開(kāi)始庄敛。為此我們會(huì)使用 Lighthouse?—?一個(gè)評(píng)審 app 面向 PWA 特性 的工具俗壹,并且檢查你的 app 在模擬移動(dòng)場(chǎng)景下是否做的足夠好。Lighthouse 可以通過(guò) Chrome 插件 (我大部分時(shí)候都用這個(gè)) 以及 CLI 來(lái)使用藻烤,兩者都會(huì)展示一個(gè)類(lèi)似這樣的報(bào)告:

來(lái)自 Lighthouse Chrome 插件的結(jié)果

頂級(jí)評(píng)審工具 Lighthouse 會(huì)高效地運(yùn)行一系列為移動(dòng)世界精煉的現(xiàn)代 web 最佳實(shí)踐:

  • 網(wǎng)絡(luò)連接是安全的
  • 用戶會(huì)被提醒將 app 添加到 Homescreen
  • 安裝了的 web app 啟動(dòng)時(shí)會(huì)帶自定義的閃屏畫(huà)面
  • App 可以在離線/斷斷續(xù)續(xù)的連接下加載
  • 頁(yè)面加載性能快速
  • 設(shè)計(jì)是移動(dòng)友好的
  • 網(wǎng)頁(yè)是漸進(jìn)式增強(qiáng)的
  • 地址欄符合品牌顏色

順便一提绷雏,有一個(gè) Lighthouse 的 快速入門(mén)指南,而且它還能通過(guò) 遠(yuǎn)程調(diào)試 工作怖亭。超級(jí)酷炫涎显。

無(wú)論在你的技術(shù)棧中使用了什么庫(kù),我想要強(qiáng)調(diào)的是在上面列出的一切兴猩,在今天都只需要一點(diǎn)小小的工作量就能完成期吓。然而也有一些警告。

我們知道移動(dòng) web 是 慢的倾芝。

web 從一個(gè)以文檔為中心的平臺(tái)演變?yōu)榱祟^等的應(yīng)用平臺(tái)讨勤。同時(shí)我們主要的計(jì)算能力也從強(qiáng)大的,擁有快速可靠的網(wǎng)絡(luò)連接的強(qiáng)大桌面機(jī)器移動(dòng)到了相對(duì)不給力的蛀醉,連接通常慢悬襟,斷斷續(xù)續(xù)或者兩者都存在的移動(dòng)設(shè)備上。這在下一個(gè) 10 億用戶即將上網(wǎng)的世界尤其真實(shí)拯刁。為了解鎖更快的移動(dòng) web:

  • 我們需要全體轉(zhuǎn)移到在真實(shí)移動(dòng)設(shè)備脊岳,現(xiàn)實(shí)的網(wǎng)絡(luò)連接下進(jìn)行測(cè)試 (e.g 在 DevTools 的常規(guī) 3G)狂窑。 chrome://inspectWebPageTest (視頻) 是你的好幫手灌具。Lighthouse 模擬一臺(tái)有觸摸事件的 Nexus 5X 設(shè)備,以及 viewport 仿真 和 被限制的網(wǎng)絡(luò)連接 (150毫秒延遲璧榄,1.6Mbps 吞吐量)帚桩。
  • 如果你使用的是設(shè)計(jì)開(kāi)發(fā)時(shí)沒(méi)有考慮移動(dòng)設(shè)備的 JS 庫(kù)亿驾,你可能會(huì)為了可交互性能打一場(chǎng)硬仗。我們的理想化目標(biāo)是在一臺(tái)響應(yīng)式設(shè)備上 5 秒內(nèi)變得可交互账嚎,所以我們應(yīng)用代碼的預(yù)算會(huì)更多是 ?

通過(guò)一些工作莫瞬,可以寫(xiě)出 如 Housing.com 所展示的 在有限網(wǎng)絡(luò)環(huán)境下儡蔓,真機(jī)上依然表現(xiàn)良好的使用 React 開(kāi)發(fā)的 PWAs。我們?cè)诮酉聛?lái)的系列中討論如何實(shí)現(xiàn)的詳盡 細(xì)節(jié)疼邀。

話雖如此喂江,這是一個(gè)很多庫(kù)都在盡力提高的領(lǐng)域,你可能需要知道他們是否會(huì)繼續(xù)提高在物理設(shè)備上的性能旁振。只需要看看 Preact 所做的超級(jí)棒的 真實(shí)世界設(shè)備的性能获询。

開(kāi)源 React 漸進(jìn)式 Web App 示例

如果你想要看更復(fù)雜的使用 React 開(kāi)發(fā),并使用 Lighthouse 優(yōu)化的 PWAs 例子拐袜,你可能會(huì)感興趣于: ReactHN—?一個(gè)使用服務(wù)端渲染并支持離線的 HackerNews 客戶端 或者 iFixit?—?一個(gè)使用 React 開(kāi)發(fā)吉嚣,但使用了 Redux 進(jìn)行狀態(tài)管理的硬件修復(fù)指南 app。

現(xiàn)在讓我們梳理一遍在 Lighthouse 報(bào)告中需要清點(diǎn)的每一項(xiàng)蹬铺,并在系列中繼續(xù) React.js 專(zhuān)用的小貼士尝哆。

網(wǎng)絡(luò)連接是安全的

HTTPS 的工具和建議

HTTPS 防止壞人篡改你的 app 和你的用戶使用的瀏覽器之間的通信,你可能讀過(guò) Google 正在推動(dòng) 羞辱 那些沒(méi)有加密的網(wǎng)站丛塌。強(qiáng)大的新型 web 平臺(tái) APIs较解,像 Service Worker畜疾,require 通過(guò) HTTPS 保護(hù)來(lái)源赴邻,但是好消息是像是 LetsEncrypt 這樣的服務(wù)商提供了免費(fèi)的 SSL 證書(shū),便宜的選擇像是 Cloudflare 可以使端到端流量 完全 加密啡捶,從來(lái)沒(méi)有如此簡(jiǎn)單直接地能做到現(xiàn)在這樣姥敛。

作為我的個(gè)人項(xiàng)目,我通常會(huì)部署到 Google App Engine瞎暑,它支持通過(guò) appspot.com 域名的 SSL 通信服務(wù)彤敛,只需要你加上 ‘secure’ 參數(shù)到你的 app.yaml 文件。對(duì)于需要 Node.js 支持 Universal 渲染的 React apps了赌,我使用 Node on App Engine墨榄。Github PagesZeit.co 現(xiàn)在也支持 HTTPS。

這個(gè) Chrome DevTools Security 面板 允許你印證安全證書(shū)和混合內(nèi)容錯(cuò)誤的問(wèn)題勿她。

一些更多的小貼士可以使你的網(wǎng)站更加安全:

  • 根據(jù)需要重定向用戶袄秩,升級(jí)非安全請(qǐng)求(“HTTP” 連接)到 “HTTPS”》瓴ⅲ可以一看 內(nèi)容安全策略升級(jí)非安全請(qǐng)求之剧。
  • 更新所有引用 “http://” 的鏈接到 “https://”。如果你依賴(lài)第三方的腳本或者內(nèi)容砍聊,跟他們商量一下讓他們也支持一下 HTTPS 資源背稼。
  • 提供頁(yè)面的時(shí)候,使用 HTTP 嚴(yán)格傳輸安全 (HSTS) 頭玻蝌。這是一個(gè)強(qiáng)制瀏覽器只通過(guò) HTTPS 和你的網(wǎng)站交流的指令蟹肘。

我建議去看看 Deploying HTTPS: The Green Lock and BeyondMythbusting HTTPS: Squashing security’s urban legends 來(lái)了解更多词疼。

用戶會(huì)被提醒將 app 添加到 Homescreen

下一個(gè)要講的是自定義你的 app 的 “添加到主屏幕” 體驗(yàn)(favicons,顯示的應(yīng)用名字帘腹,方向和更多)寒跳。這是通過(guò)添加一個(gè) Web 應(yīng)用 manifest 來(lái)做的。我經(jīng)常會(huì)找定制的跨瀏覽器(以及系統(tǒng))的圖標(biāo)來(lái)完成這部分工作竹椒,但是像是 realfavicongenerator.net 這樣的工具能解決不少麻煩的事情童太。

有很多關(guān)于一個(gè)網(wǎng)站只需要在大部分場(chǎng)合能工作的 “最少” favicons 的討論。Lighthouse 提議 提供一個(gè) 192px 的圖標(biāo)給主屏幕胸完,一個(gè) 512px 的圖標(biāo)給你的閃屏书释。我個(gè)人堅(jiān)持從 realfavicongenerator 得到的輸出,除了它包含更多的 metatags, 我也更傾向于它能涵蓋我的所有基數(shù)赊窥。

一些網(wǎng)站可能更傾向于為每個(gè)平臺(tái)提供高度定制化的 favicon爆惧。我推薦去看看 設(shè)計(jì)一個(gè)漸進(jìn)式 Web App 圖標(biāo) 以獲得更多關(guān)于這個(gè)主題的指導(dǎo)。

通過(guò) Web App manifest 安裝锨能,你還能獲得 app 安裝器橫幅扯再,讓你有方法可以原生地提示用戶來(lái)安裝你的 PWA,如果他們覺(jué)得會(huì)經(jīng)常使用它的話址遇。還可以 延遲 提示熄阻,直到用戶和你的 app 進(jìn)行了有意義的交互。Flipkart 找到 最佳時(shí)間來(lái)顯示這個(gè)提示是在他們的訂單確認(rèn)頁(yè)倔约。

Chrome DevTools Application 面板 支持通過(guò) Application > Manifest 來(lái)查看你的 Web App manifest:

它會(huì)解析出列在你的 manifest 清單文件的 favicons(網(wǎng)站頭像)秃殉,還能預(yù)覽像是 start URL 和 theme colors 這樣的屬性。順帶一提浸剩,如果感興趣的話钾军,這里有一個(gè)完整的關(guān)于 Web App Manfests 的工具小貼士 片段 ??

安裝了的 web app 啟動(dòng)時(shí)會(huì)帶自定義的閃屏畫(huà)面

在舊版本的 Android Chrome 上,點(diǎn)擊主屏幕上的 app 圖標(biāo)通常會(huì)花費(fèi) 200 毫秒(一些慢的網(wǎng)站甚至要數(shù)秒)以到達(dá)文檔的第一幀被渲染到屏幕上绢要。

在這段時(shí)間內(nèi)吏恭,用戶會(huì)看到一個(gè)白屏,減少對(duì)你網(wǎng)站的感知到的性能重罪。Chrome 47 和以上版本 支持自定義閃屏(基于來(lái)自 Web App manifest 的背景顏色樱哼,名字和圖標(biāo))會(huì)在瀏覽器準(zhǔn)備繪制一些東西前給屏幕一些顏色。這使得你的 webapp 感受上更接近 “原生”蛆封。

Realfavicongenerator.net 現(xiàn)在還支持根據(jù)你的清單(manifest)預(yù)覽并自定義閃屏唇礁,很方便地節(jié)約時(shí)間。

注意:Firefox for Android 和 Opera for Android 也支持 Web 應(yīng)用程序清單惨篱,閃屏和添加到主屏幕的體驗(yàn)盏筐。在 iOS 上,Safari 也支持自定義添加到 主屏幕的圖標(biāo) 并曾經(jīng)支持一個(gè) 專(zhuān)有的閃屏 實(shí)現(xiàn)砸讳,然而這個(gè)在 iOS9 上顯得不能用了琢融。我已經(jīng)填了一個(gè)特性請(qǐng)求給 Webkit界牡,以支持 Web App manifest,所以...希望一切順利吧漾抬。

設(shè)計(jì)是移動(dòng)友好的

為多種設(shè)備所優(yōu)化的 Apps 必須在他們的 document 里面包括一個(gè) meta-viewport宿亡。這看上去非常明顯,但是我看到過(guò)很多的 React 項(xiàng)目中纳令,人們忘了加上這個(gè)挽荠。好在 create-react-app 有默認(rèn)加上有效的 meta-viewport,而且如果缺失的話 Lighthouse 會(huì)標(biāo)記上:

盡管我們非常重視漸進(jìn)式 Web 應(yīng)用程序在移動(dòng) web 的體驗(yàn)平绩,這 并不意味著桌面應(yīng)該被忘記圈匆。一個(gè)精心設(shè)計(jì)的 PWA 應(yīng)該可以在各種 viewport 尺寸、瀏覽器以及設(shè)備上良好運(yùn)作捏雌,正如 Housing.com 所展示的:

在系列第 2 部分跃赚,我們將會(huì)看看那 使用 React 和 Webpack 的頁(yè)面加載性能。我們會(huì)深入 code-splitting(代碼分割)性湿,基于路由的 chunking(分塊)以及 達(dá)到更快交互性 PRPL 模式纬傲。

如果你不熟悉 React,我發(fā)現(xiàn) Wes Bos 寫(xiě)的 給新手的 React 很棒肤频。

感謝 Gray Norton, Sean Larkin, Sunil Pai, Max Stoiber, Simon Boudrias, Kyle Mathews 和 Owen Campbell-Moore 的校對(duì)

原文見(jiàn):http://blog.zhaiyifan.cn/2016/11/14/pwa-react-p1/

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末叹括,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子着裹,更是在濱河造成了極大的恐慌领猾,老刑警劉巖,帶你破解...
    沈念sama閱讀 216,372評(píng)論 6 498
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件骇扇,死亡現(xiàn)場(chǎng)離奇詭異,居然都是意外死亡面粮,警方通過(guò)查閱死者的電腦和手機(jī)少孝,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,368評(píng)論 3 392
  • 文/潘曉璐 我一進(jìn)店門(mén),熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)熬苍,“玉大人稍走,你說(shuō)我怎么就攤上這事〔竦祝” “怎么了婿脸?”我有些...
    開(kāi)封第一講書(shū)人閱讀 162,415評(píng)論 0 353
  • 文/不壞的土叔 我叫張陵,是天一觀的道長(zhǎng)柄驻。 經(jīng)常有香客問(wèn)我狐树,道長(zhǎng),這世上最難降的妖魔是什么鸿脓? 我笑而不...
    開(kāi)封第一講書(shū)人閱讀 58,157評(píng)論 1 292
  • 正文 為了忘掉前任抑钟,我火速辦了婚禮涯曲,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘在塔。我一直安慰自己幻件,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,171評(píng)論 6 388
  • 文/花漫 我一把揭開(kāi)白布蛔溃。 她就那樣靜靜地躺著绰沥,像睡著了一般。 火紅的嫁衣襯著肌膚如雪贺待。 梳的紋絲不亂的頭發(fā)上揪利,一...
    開(kāi)封第一講書(shū)人閱讀 51,125評(píng)論 1 297
  • 那天,我揣著相機(jī)與錄音狠持,去河邊找鬼疟位。 笑死,一個(gè)胖子當(dāng)著我的面吹牛喘垂,可吹牛的內(nèi)容都是我干的甜刻。 我是一名探鬼主播,決...
    沈念sama閱讀 40,028評(píng)論 3 417
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼正勒,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼得院!你這毒婦竟也來(lái)了?” 一聲冷哼從身側(cè)響起章贞,我...
    開(kāi)封第一講書(shū)人閱讀 38,887評(píng)論 0 274
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤祥绞,失蹤者是張志新(化名)和其女友劉穎,沒(méi)想到半個(gè)月后鸭限,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體蜕径,經(jīng)...
    沈念sama閱讀 45,310評(píng)論 1 310
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,533評(píng)論 2 332
  • 正文 我和宋清朗相戀三年败京,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了兜喻。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 39,690評(píng)論 1 348
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡赡麦,死狀恐怖朴皆,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情泛粹,我是刑警寧澤遂铡,帶...
    沈念sama閱讀 35,411評(píng)論 5 343
  • 正文 年R本政府宣布,位于F島的核電站晶姊,受9級(jí)特大地震影響扒接,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,004評(píng)論 3 325
  • 文/蒙蒙 一珠增、第九天 我趴在偏房一處隱蔽的房頂上張望超歌。 院中可真熱鬧,春花似錦蒂教、人聲如沸巍举。這莊子的主人今日做“春日...
    開(kāi)封第一講書(shū)人閱讀 31,659評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)懊悯。三九已至,卻和暖如春梦皮,著一層夾襖步出監(jiān)牢的瞬間炭分,已是汗流浹背。 一陣腳步聲響...
    開(kāi)封第一講書(shū)人閱讀 32,812評(píng)論 1 268
  • 我被黑心中介騙來(lái)泰國(guó)打工剑肯, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留捧毛,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 47,693評(píng)論 2 368
  • 正文 我出身青樓让网,卻偏偏與公主長(zhǎng)得像呀忧,于是被迫代替她去往敵國(guó)和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子溃睹,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,577評(píng)論 2 353

推薦閱讀更多精彩內(nèi)容