React 服務(wù)端渲染

React服務(wù)端渲染原理

由于React是通過動(dòng)態(tài)Dom樹進(jìn)行HTML的繪制偎快,并且是數(shù)據(jù)驅(qū)動(dòng)視圖的蛇捌,所以在SEO的搜索中百姓,動(dòng)態(tài)Dom樹的填充內(nèi)容不會(huì)被搜索到笛洛。當(dāng)網(wǎng)頁(yè)需要提高搜索量,或者進(jìn)行某些兼容性處理時(shí)咐蚯,就需要將動(dòng)態(tài)的Dom樹轉(zhuǎn)換為字符串的形式以靜態(tài)資源進(jìn)行加載童漩,兼容性的處理也是通過對(duì)靜態(tài)資源根據(jù)瀏覽器不通特性,通過Hack等規(guī)則替換進(jìn)行實(shí)現(xiàn)春锋。(剛查看了資料矫膨,可以將字符串的Dom轉(zhuǎn)換為XML進(jìn)行替換:使用工具:var xmlDoc = new ActiveXObject(/"Microsoft.XMLDOM/");)。

服務(wù)端渲染的實(shí)現(xiàn)期奔,是通過開啟nodejs服務(wù)監(jiān)聽侧馅,將已經(jīng)渲染好的Dom頁(yè)面加載到瀏覽器端進(jìn)行展現(xiàn);

當(dāng)使用服務(wù)器端渲染時(shí)呐萌,如果需要使用Redux馁痴,則將store賦值給Provider在Router中進(jìn)行store的傳遞;

import { StaticRouter, RouterContext } from 'react-router';
import { Provider } from 'react-redux';
      <Provider store={finalState}>
        <StaticRouter location={req.url} context={context}>
            {getRoutes()}
        </StaticRouter>
    </Provider>

當(dāng)需要使用Router中 history時(shí)肺孤,需要將組件包裹在 withRouter 中

import { withRouter } from 'react-router';
export default connect(mapStateToProps,mapDispatchToProps)(withRouter(AgencyEvent));

當(dāng)nodejs服務(wù)監(jiān)聽到訪問請(qǐng)求時(shí)罗晕,通過${}EL 表達(dá)式,將繪制好的Dom頁(yè)面以字符串的形式寫入到html模版中赠堵,使用response渲染到瀏覽器端進(jìn)行展示小渊。此時(shí)渲染出的html頁(yè)面是沒有攜帶事件機(jī)制的。所以此時(shí)需要再次在客戶端進(jìn)行渲染茫叭,使得DOM樹的節(jié)點(diǎn)可以觸發(fā)酬屉。

React服務(wù)端渲染實(shí)現(xiàn)

import { renderToString } from 'react-dom/server';

const markup = renderToString(
                <Provider store={finalState}>
                    <StaticRouter location={req.url} context={context}>
                        {getRoutes()}
                    </StaticRouter>
                </Provider>
            );
const html = renderPage (markup, {});
res.status(200).send(html);

function renderPage (html, initialState) {
    return `
    <!doctype html>
    <html>
      <head>
        <meta charset="utf-8">
        <meta name="viewport" content="width=device-width, initial-scale=1, shrink-to-fit=no">
        <title>服務(wù)端渲染頁(yè)面</title>
      </head>
      <body>
        <noscript>
          You need to enable JavaScript to run this app.
        </noscript>
        <div id="root">${html}</div>
        <script>
          window.__INITIAL_STATE__ = ${JSON.stringify(initialState)}
        </script>
        <script type="text/javascript" src="/static/bundle.js" defer></script>
      </body>
    </html>`;

如果模版不需要進(jìn)行特別處理,也可以使用webpack自動(dòng)生產(chǎn)的html文件進(jìn)行渲染

參考地址:
https://reacttraining.com/react-router/web/guides/server-rendering
https://redux.js.org/recipes/server-rendering

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末揍愁,一起剝皮案震驚了整個(gè)濱河市呐萨,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌吗垮,老刑警劉巖垛吗,帶你破解...
    沈念sama閱讀 221,198評(píng)論 6 514
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場(chǎng)離奇詭異烁登,居然都是意外死亡怯屉,警方通過查閱死者的電腦和手機(jī)蔚舀,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 94,334評(píng)論 3 398
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來锨络,“玉大人赌躺,你說我怎么就攤上這事∠鄱” “怎么了礼患?”我有些...
    開封第一講書人閱讀 167,643評(píng)論 0 360
  • 文/不壞的土叔 我叫張陵,是天一觀的道長(zhǎng)掠归。 經(jīng)常有香客問我缅叠,道長(zhǎng),這世上最難降的妖魔是什么虏冻? 我笑而不...
    開封第一講書人閱讀 59,495評(píng)論 1 296
  • 正文 為了忘掉前任肤粱,我火速辦了婚禮,結(jié)果婚禮上厨相,老公的妹妹穿的比我還像新娘领曼。我一直安慰自己,他們只是感情好蛮穿,可當(dāng)我...
    茶點(diǎn)故事閱讀 68,502評(píng)論 6 397
  • 文/花漫 我一把揭開白布庶骄。 她就那樣靜靜地躺著,像睡著了一般践磅。 火紅的嫁衣襯著肌膚如雪单刁。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 52,156評(píng)論 1 308
  • 那天音诈,我揣著相機(jī)與錄音幻碱,去河邊找鬼。 笑死细溅,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的儡嘶。 我是一名探鬼主播喇聊,決...
    沈念sama閱讀 40,743評(píng)論 3 421
  • 文/蒼蘭香墨 我猛地睜開眼,長(zhǎng)吁一口氣:“原來是場(chǎng)噩夢(mèng)啊……” “哼蹦狂!你這毒婦竟也來了誓篱?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 39,659評(píng)論 0 276
  • 序言:老撾萬榮一對(duì)情侶失蹤凯楔,失蹤者是張志新(化名)和其女友劉穎窜骄,沒想到半個(gè)月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體摆屯,經(jīng)...
    沈念sama閱讀 46,200評(píng)論 1 319
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡邻遏,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 38,282評(píng)論 3 340
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片准验。...
    茶點(diǎn)故事閱讀 40,424評(píng)論 1 352
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡赎线,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出糊饱,到底是詐尸還是另有隱情垂寥,我是刑警寧澤,帶...
    沈念sama閱讀 36,107評(píng)論 5 349
  • 正文 年R本政府宣布另锋,位于F島的核電站滞项,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏夭坪。R本人自食惡果不足惜文判,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,789評(píng)論 3 333
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望台舱。 院中可真熱鬧律杠,春花似錦、人聲如沸竞惋。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,264評(píng)論 0 23
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)拆宛。三九已至嗓奢,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間浑厚,已是汗流浹背股耽。 一陣腳步聲響...
    開封第一講書人閱讀 33,390評(píng)論 1 271
  • 我被黑心中介騙來泰國(guó)打工, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留钳幅,地道東北人物蝙。 一個(gè)月前我還...
    沈念sama閱讀 48,798評(píng)論 3 376
  • 正文 我出身青樓,卻偏偏與公主長(zhǎng)得像敢艰,于是被迫代替她去往敵國(guó)和親诬乞。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,435評(píng)論 2 359

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