手把手教你React.js和Vue.js的同構(gòu)渲染

導(dǎo)語: 本文面向沒用過服務(wù)端渲染以及沒了解過的同學(xué)闷营。主要介紹了服務(wù)端渲染的歷史成翩,以及React.js興起以后的同構(gòu)渲染,并分別給出了React.js和Vue.js 的SSR(Server Side Render)的同構(gòu)例子盗飒。所有代碼在github中給出烈拒,可以直接運行圆裕。

服務(wù)端渲染其實在10多年前Asp, Java就流行了,那個時候都是通過一個后端的模版實現(xiàn)荆几。后來出現(xiàn)了jQuery等庫和框架之后吓妆,各種動態(tài)頁面又由后端渲染變成了客戶端渲染。2013年React.js的出現(xiàn)后吨铸,同構(gòu)渲染頁面的思想慢慢的流行起來行拢。 所謂同構(gòu)渲染就是相同的組件既可以在服務(wù)端中渲染也可以在前端渲染。能滿足這個條件的服務(wù)端只有node.js诞吱。本文主要是講同構(gòu)渲染,也叫做node直出狐胎。

雖然同構(gòu)的思想出現(xiàn)了三年多,但前段時間在面試過程中問了不了社招和校招的同學(xué)握巢,對這個概念很多同學(xué)都不太清楚松却,或者是實踐非常少。原因可能是大家所在公司使用node服務(wù)的比較少晓锻。沒有很好的實踐平臺。 下面就把這個問題講清楚吧砚哆。

先說幾個同構(gòu)渲染的好處:
?1. 首屏性能相比提升非常多。
?2. node服務(wù)和前端公用一套代碼
?3. SEO, 對搜索引擎友好
?4. 互聯(lián)網(wǎng)公司面試題常出

沒有同構(gòu)渲染,頁面的首屏?xí)r間卵史,

用了同構(gòu)渲染搜立,

對比上面兩個圖, 可以發(fā)現(xiàn)SSR最少省了兩次從客戶端請求到服務(wù)端的時間啄踊,一次請求的來回我們叫做RTT時間(Round-Trip Time),特別是在移動端在3G請求一次RTT時間需要500ms颠通,4G和wifi是100ms。 所以從這里可以看出服務(wù)端渲染在首屏?xí)r間上有很大的優(yōu)化顿锰。如果在返回的html中內(nèi)聯(lián)首屏的Css樣式,那么用戶發(fā)起html的一次請求就可以看到首屏的頁面撵儿。 是的,只要一個請求淀歇。本文并不是專門講性能優(yōu)化,所以這里簡單總結(jié)浪默,通常SSR可以讓首屏?xí)r間節(jié)省大概1.5s到2s。像React.js這種150kb左右(React 16大約106kb), 也不會影響首屏?xí)r間纳决。

這里的dom string就是React.js或者Vue.js提供的方法, 根據(jù)數(shù)據(jù)生成的類似于<div></div>的字符串。 實踐起來非常簡單阔加,只需要在node服務(wù)調(diào)用一個方法就可以生成。當(dāng)然這里需要使用node服務(wù)作為中間層胜榔,node服務(wù)的好處就不在這里說了。

下面就挑React.js和Vue.js作為例子夭织,大家可以直接跳到自己常用的框架看對應(yīng)的例子即可,

以React為例尊惰,node服務(wù)中路由收到請求時泥兰,利用React提供的renderToString方法對組件IndexPage輸出字符串body,

 router.use('/index.html', function (req, res, next) {
    let body = ReactDOMServer.renderToString(<IndexPage />); 
    console.log(body);
    res.render("page", {
         body: body
    });
 });

indexPage組件如下题禀,

import React from 'react';
class App extends React.Component {
   render() {
     return (
       <div>
           hello React SSR!
       </div>
     );
   }
}

export default App; 

domString的輸出結(jié)果是

 <div data-reactroot="" data-reactid="1" data-react-
    checksum="-1619127114">hello React SSR!</div>

再把domString插入到模版中返回給瀏覽器就完成node直出了。
完整的代碼在這里: https://github.com/blogExample2010/blog/tree/master/ReactSSR
參考Readme.md就可以一步步跑起來投剥。

同樣以Vue.js為例, 官方文檔 https://ssr.vuejs.org/zh/basic.html江锨,利用vue-server-renderer的renderToString方法生成字符串插入到模版中。

const renderer = require('vue-server-renderer').createRenderer()

router.use('/index.html', function (req, res, next) {
     renderer.renderToString(IndexPage, (err, body) => {
         if (err) throw err
         console.log(body)
         res.render("page", {
             body: body
         });
     }) 
});

body在控制臺輸出:

<div data-server-rendered="true">Hello Vue SSR!</div>

完整的代碼在這里: https://github.com/blogExample2010/blog/tree/master/VueSSR

總結(jié)酌心,其實同構(gòu)渲染一點也不復(fù)雜,參考上面的代碼相信完全可以把這部分掌握起來安券。 node直出對提升首屏性能還是非常明顯的變化。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末侯勉,一起剝皮案震驚了整個濱河市铝阐,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌徘键,老刑警劉巖,帶你破解...
    沈念sama閱讀 216,591評論 6 501
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件吹害,死亡現(xiàn)場離奇詭異,居然都是意外死亡它呀,警方通過查閱死者的電腦和手機,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,448評論 3 392
  • 文/潘曉璐 我一進店門纵穿,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人政恍,你說我怎么就攤上這事达传∑戎” “怎么了宗弯?”我有些...
    開封第一講書人閱讀 162,823評論 0 353
  • 文/不壞的土叔 我叫張陵,是天一觀的道長蒙保。 經(jīng)常有香客問我,道長邓厕,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 58,204評論 1 292
  • 正文 為了忘掉前任详恼,我火速辦了婚禮,結(jié)果婚禮上昧互,老公的妹妹穿的比我還像新娘。我一直安慰自己敞掘,他們只是感情好,可當(dāng)我...
    茶點故事閱讀 67,228評論 6 388
  • 文/花漫 我一把揭開白布玖雁。 她就那樣靜靜地躺著,像睡著了一般茄菊。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上面殖,一...
    開封第一講書人閱讀 51,190評論 1 299
  • 那天,我揣著相機與錄音脊僚,去河邊找鬼。 笑死辽幌,一個胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的乌企。 我是一名探鬼主播,決...
    沈念sama閱讀 40,078評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼加酵,長吁一口氣:“原來是場噩夢啊……” “哼哭当!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起钦勘,我...
    開封第一講書人閱讀 38,923評論 0 274
  • 序言:老撾萬榮一對情侶失蹤亚亲,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后捌归,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體肛响,經(jīng)...
    沈念sama閱讀 45,334評論 1 310
  • 正文 獨居荒郊野嶺守林人離奇死亡终惑,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,550評論 2 333
  • 正文 我和宋清朗相戀三年门扇,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片臼寄。...
    茶點故事閱讀 39,727評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖吉拳,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情留攒,我是刑警寧澤煤惩,帶...
    沈念sama閱讀 35,428評論 5 343
  • 正文 年R本政府宣布魄揉,位于F島的核電站,受9級特大地震影響洛退,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜杰标,卻給世界環(huán)境...
    茶點故事閱讀 41,022評論 3 326
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望腔剂。 院中可真熱鬧,春花似錦、人聲如沸谅畅。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,672評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽胜茧。三九已至粘优,卻和暖如春呻顽,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背廊遍。 一陣腳步聲響...
    開封第一講書人閱讀 32,826評論 1 269
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留喉前,地道東北人。 一個月前我還...
    沈念sama閱讀 47,734評論 2 368
  • 正文 我出身青樓卵迂,卻偏偏與公主長得像,于是被迫代替她去往敵國和親见咒。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 44,619評論 2 354

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