React 服務(wù)端渲染的流程簡述

做 react SSR 有一段時(shí)間了, 正好在這里分享一下.

什么是服務(wù)端渲染

用戶第一次請求/刷新頁面時(shí), 由服務(wù)端響應(yīng). 服務(wù)器響應(yīng)的是一個(gè)已經(jīng)插入了組件文本的模板 ( template with pre-populated components ). 由于響應(yīng)的頁面已經(jīng)有組件的 HTML 文本, 可以省去瀏覽器端首次渲染的工作, 加快首屏顯示速度, SEO 友好.

服務(wù)端渲染時(shí)瀏覽器的工作流程

瀏覽器接收到服務(wù)器預(yù)渲染的模板后, 渲染 DOM, 然后開始下載 js 文件(bundle), 下載完成后 react 開始工作, 生成VDOM. 由于使用了 SSR hydrate() API, VDOM 上組件的 mount 行為 (也就是組件從 VDOM 到 真實(shí) DOM 的第一次的 render) 將會(huì)被跳過. Mobx/Redux 和 React Router 開始工作.

余后的頁面內(nèi)的鏈接 ( <Link> ) 跳轉(zhuǎn)皆由 react router 接管.

服務(wù)端渲染時(shí)的工程架構(gòu)

服務(wù)端渲染時(shí), 服務(wù)器和瀏覽器共用一套模板, 一套組件.
兩個(gè)入口文件 (兩個(gè) bundle).
服務(wù)器需要一個(gè) 服務(wù)端 bundle, 對應(yīng)的 webpack 編譯配置需要適配服務(wù)端環(huán)境 (nodejs commonjs 模塊系統(tǒng)).
開發(fā)環(huán)境下的服務(wù)端渲染工作可以和 webpack devServer 協(xié)作, 實(shí)現(xiàn)開發(fā)時(shí)服務(wù)端渲染的熱加載.

流程

服務(wù)器響應(yīng)

在客戶端入口組件應(yīng)用 ReactDOM.hydrate() 替換 ReactDOM.render()
在服務(wù)端使用 ReactDOMServer.renderToString() 將組件轉(zhuǎn)化為字符串, 插入模板中, 響應(yīng)給客戶端.

實(shí)現(xiàn)首次加載時(shí)數(shù)據(jù)同步

  • Mobx 的服務(wù)端渲染配置: 參考官方文檔.
  • 前后端數(shù)據(jù)傳遞: 通過腳本注入的方法向模板插入一個(gè) js 對象, 以此傳遞數(shù)據(jù)給瀏覽器, 實(shí)現(xiàn) VDOM 和 DOM 上組件/元素的數(shù)據(jù)同步.
  window.__INITIAL_STATE__ = <%%-initialState %>

服務(wù)端 React Router 設(shè)置

服務(wù)端需要使用 React Router <StaticRouter> 組件.

  • 通過 <StaticRouter> 上 location 自動(dòng)實(shí)現(xiàn)對 <Route> 的匹配 (響應(yīng)).
  • 通過 <StaticRouter> 上的 context 屬性手動(dòng)實(shí)現(xiàn)對 <Redirect> 的響應(yīng). 參考 React Router 官方文檔.

前端路由的數(shù)據(jù)獲取

定義接口: 可以在 routes 文件內(nèi)定義用于獲取數(shù)據(jù)的 API, 也可以在組件內(nèi)部提供靜態(tài)方法來獲取數(shù)據(jù)的 API.
調(diào)用接口: 在組件的生命周期函數(shù)中調(diào)用這些 API.

針對 SEO 搜索引擎爬蟲的配置.

動(dòng)態(tài)渲染 <head>

以上, 代碼細(xì)節(jié)還是比較多的. 使用了 Material-UI 的話也需要做相關(guān)的配置.

示例代碼參考:

這個(gè) repo 是一個(gè) React + React Router 4 SSR 的 React & React Router 4 Server Side Rendering Boilerplate

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末蠢护,一起剝皮案震驚了整個(gè)濱河市昔园,隨后出現(xiàn)的幾起案子盛卡,更是在濱河造成了極大的恐慌渠概,老刑警劉巖蹂季,帶你破解...
    沈念sama閱讀 207,248評論 6 481
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件麻汰,死亡現(xiàn)場離奇詭異绣的,居然都是意外死亡叠赐,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,681評論 2 381
  • 文/潘曉璐 我一進(jìn)店門屡江,熙熙樓的掌柜王于貴愁眉苦臉地迎上來芭概,“玉大人,你說我怎么就攤上這事惩嘉“罩蓿” “怎么了?”我有些...
    開封第一講書人閱讀 153,443評論 0 344
  • 文/不壞的土叔 我叫張陵文黎,是天一觀的道長惹苗。 經(jīng)常有香客問我,道長耸峭,這世上最難降的妖魔是什么桩蓉? 我笑而不...
    開封第一講書人閱讀 55,475評論 1 279
  • 正文 為了忘掉前任,我火速辦了婚禮劳闹,結(jié)果婚禮上院究,老公的妹妹穿的比我還像新娘。我一直安慰自己本涕,他們只是感情好业汰,可當(dāng)我...
    茶點(diǎn)故事閱讀 64,458評論 5 374
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著菩颖,像睡著了一般样漆。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上晦闰,一...
    開封第一講書人閱讀 49,185評論 1 284
  • 那天放祟,我揣著相機(jī)與錄音,去河邊找鬼呻右。 笑死舞竿,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的窿冯。 我是一名探鬼主播,決...
    沈念sama閱讀 38,451評論 3 401
  • 文/蒼蘭香墨 我猛地睜開眼确徙,長吁一口氣:“原來是場噩夢啊……” “哼醒串!你這毒婦竟也來了执桌?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 37,112評論 0 261
  • 序言:老撾萬榮一對情侶失蹤芜赌,失蹤者是張志新(化名)和其女友劉穎仰挣,沒想到半個(gè)月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體缠沈,經(jīng)...
    沈念sama閱讀 43,609評論 1 300
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡膘壶,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,083評論 2 325
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了洲愤。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片颓芭。...
    茶點(diǎn)故事閱讀 38,163評論 1 334
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖柬赐,靈堂內(nèi)的尸體忽然破棺而出亡问,到底是詐尸還是另有隱情,我是刑警寧澤肛宋,帶...
    沈念sama閱讀 33,803評論 4 323
  • 正文 年R本政府宣布州藕,位于F島的核電站,受9級特大地震影響酝陈,放射性物質(zhì)發(fā)生泄漏床玻。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,357評論 3 307
  • 文/蒙蒙 一沉帮、第九天 我趴在偏房一處隱蔽的房頂上張望锈死。 院中可真熱鬧,春花似錦遇西、人聲如沸馅精。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,357評論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽洲敢。三九已至,卻和暖如春茄蚯,著一層夾襖步出監(jiān)牢的瞬間压彭,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 31,590評論 1 261
  • 我被黑心中介騙來泰國打工渗常, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留壮不,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 45,636評論 2 355
  • 正文 我出身青樓皱碘,卻偏偏與公主長得像询一,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 42,925評論 2 344

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

  • 1健蕊、通過CocoaPods安裝項(xiàng)目名稱項(xiàng)目信息 AFNetworking網(wǎng)絡(luò)請求組件 FMDB本地?cái)?shù)據(jù)庫組件 SD...
    陽明先生_x閱讀 15,968評論 3 119
  • 桃眼無開語燕驚菱阵,人間時(shí)歲已清明。 不知東帝憐人老缩功,早送白英鬢畔生晴及。
    林文信閱讀 292評論 3 7
  • 美好的夜晚 大概就是穿著休閑服 踩著拖鞋 戴著耳機(jī) 吧啦吧啦地走幾分鐘 來到熟悉的小店 點(diǎn)上一碗微辣豬腸刀削面 再...
    貓的假想國閱讀 152評論 0 0
  • 今天成都出了溫暖的太陽,到中午就變成了熱辣辣的嫡锌。我和同事兩個(gè)人一沖動(dòng)竟然想起來在大中午的時(shí)候去不遠(yuǎn)的宿舍抬白板過來...
    貓女杜瑜閱讀 127評論 0 2
  • 寫下繁花十里 便不怕你歸去
    韓海一閱讀 160評論 0 0