亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb

首頁 > 編程 > JavaScript > 正文

React服務端渲染(總結)

2019-11-19 16:12:42
字體:
來源:轉載
供稿:網友

一、前言

為什么需要服務端渲染?什么情況下進行服務端渲染?筆者認為,當我們要求渲染時間盡量快、頁面響應速度快時(優點),才會采用服務器渲染,并且應該“按需”對頁面進行渲染 ――“首次加載/首屏”。即服務端渲染的優勢在于:由中間層( node端 )為客戶端請求初始數據、并由node渲染頁面。那客戶端渲染和服務端渲染有什么差別?服務端渲染究竟快在哪里呢?

二、原因與思路

客戶端渲染路線:1. 請求一個html -> 2. 服務端返回一個html -> 3. 瀏覽器下載html里面的js/css文件 -> 4. 等待js文件下載完成 -> 5. 等待js加載并初始化完成 -> 6. js代碼終于可以運行,由js代碼向后端請求數據( ajax/fetch ) -> 7. 等待后端數據返回 -> 8. react-dom( 客戶端 )從無到完整地,把數據渲染為響應頁面

服務端渲染路線:2. 請求一個html -> 2. 服務端請求數據( 內網請求快 ) -> 3. 服務器初始渲染(服務端性能好,較快) -> 4. 服務端返回已經有正確內容的頁面 -> 5. 客戶端請求js/css文件 -> 6. 等待js文件下載完成 -> 7. 等待js加載并初始化完成 -> 8. react-dom( 客戶端 )把剩下一部分渲染完成( 內容小,渲染快 )

說明:對同一個組件,服務端渲染“可視的”一部分( render/componentWillMount部分代碼  ),為確保組件有完善的生命周期及事件處理,客戶端需要再次渲染。即:服務端渲染,實際上也是需要客戶端進行 再次地、但開銷很小的二次渲染。

時間耗時比較:

1. 數據請求:由服務端請求數據而不是客戶端請求數據,這是“快”的一個主要原因。服務端在內網進行請求,數據響應速度快??蛻舳嗽诓煌W絡環境進行數據請求,且外網http請求開銷大,導致時間差(主要原因)。

2. 步驟:服務端是先請求數據然后渲染“可視”部分,而客戶端是等待js代碼下載、加載完成再請求數據、渲染。即:服務端渲染不用等待js代碼下載完成再請求數據,并會返回一個已經有內容的頁面。

3. 渲染性能:服務端性能比客戶端高,渲染速度快( 猜測,該項數據不詳 )。

4. 渲染內容:服務端渲染會把”可視“部分先渲染,然后交給客戶端再作部分渲染。而客戶端渲染,則是從無到有,需要經歷完整的渲染步驟。    

  

三、注意事項與問題

0. 項目依賴什么?答:node端:express、react-dom/server、webpack。前端:React、mobx(一個更好的redux)、React-router、webpack

1. 前端/node端共用那部分代碼?答:node端/前端有各自的入口文件,server.js/client.js,通過react-router的路由配置文件routes.js作中間層

// routes.jsmodule.exports = (  <Route path="/" component={ IComponent } >    <Route path="/todo" component={ AComponent }>    </Route>  </Route>)

2. 代碼是由前后端共享,那如何分平臺地操作不同代碼?答:通過webpack。對共享代碼,進行不同平臺的,webpack(babel)編譯,通過在webpack.config.js中加入

 // webpack.client.config.jsplugins: [   new webpack.DefinePlugin({     '__isServer__': false,     '__isClient__': true   }) ]// webpack.server.config.jsplugins: [   new webpack.DefinePlugin({     '__isServer__': true,     '__isClient__': false   }) ]// xxx.jsif( __isServer__ ) {  ...}else { ... }

4. 組件的生命周期是如何的呢?答:componentWillMount( node端 ) -> render( node端 ) -> 客戶端生命周期和以前一樣

5. 拉取數據后如何處理呢?答:先在node端根據數據渲染好,再把數據隨頁面返回至前端,再由React根據數據進行渲染校對( 若前后端渲染結果不一致將報錯 )。應該在componentWillMount讓組件進行本地的數據同步

// 組件.jscomponentWillMount() {  if( __isClient__ ) {     this.todoStore.todos = window.initTodos;   }}  // node端返回`<!doctype html><html lang="utf-8">    <head>    <script> window.initTodo = ${...}</script>    </head>    <body> ... </body>    <script src="/static/vendor.js"></script>    <script src="/static/client.bundle.js"></script>

6. 前端/node端“入口文件”通過webpack構建有什么不同?答:前端是為了解析JSX與es6代碼(包括mobx的es6 decorator),node端除了以上,還需要加入babel-plugin-transform-runtime,是為了在node良好地運行es7 async / awatit

7. 如何保證node端能夠先請求數據然后再渲染?答:es7的async / await語法  

8. 前端的react-router路由與node端路由如何配合?node如何知道該路由是渲染哪個數據呢?答:前端是以前的react-router配置,node端是react-router的match/RouterContext// 共享文件routes.js

const routes = (  <Route path="/" component={ IComponent } >    <Route path="/todo" component={ AComponent }>    </Route>  </Route>)// 前端入口文件client.jsrender(  <Router routes={ routes } history={ browserHistory } />,  ele)// node端入口文件server.jslet app = express();app.get('/todo', (req, res) => {  match({ routes: routes, location: req.url }, async (err, redirect, props) => {     // match會幫我們找到要渲染的組件鏈,注:上面一行使用了async語法,因此可以在render之前使用await運行拉取數據的代碼     let html = renderToString(<RouterContext {...props} />)     res.send( indexPage(html) )  }}) // node端返回   let indexPage = (html)=>{  return `  <!doctype html>    <html lang="utf-8">      <head>        <script>        </script>      </head>      <body>        <section id="hzpapp" >${html}</section>      </body>      <script src="/static/vendor.js"></script>      <script src="/static/client.bundle.js"></script>    </html>}

9. client.js中是否還能繼續使用webpack的require.ensure ? 答:可以。但閃白明顯,且node端返回html后會有報錯,在加載腳本后該錯誤能忽略?!?/p>

10. 若我使用的是mobx,該如何實例化store ? 答:每一個node請求,都應該返回一個新的獨立的store實例,而不是每個node請求共用一個store實例(筆者易犯)。

        

本demo地址( 前端庫React+mobx+ReactRouter ):https://github.com/Penggggg/react-ssr

以上就是本文的全部內容,希望對大家的學習有所幫助,也希望大家多多支持武林網?! ?/p>

發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
国产精品视频久久久久| 欧美性猛交xxxx乱大交3| 欧美壮男野外gaytube| 欧美视频裸体精品| www.99久久热国产日韩欧美.com| 国产精品成人av在线| 日韩国产精品一区| 91久久久久久国产精品| 91中文精品字幕在线视频| 亚洲欧美激情在线视频| 国产精品视频区1| www.久久久久| 亚洲精品久久久久中文字幕二区| 精品毛片三在线观看| 国产91色在线|| 91九色视频在线| 欧美在线视频一区二区| 日韩一区二区三区xxxx| 欧美电影电视剧在线观看| 久久久国产91| 日韩av电影中文字幕| 国产一区视频在线播放| 国产精品99久久久久久www| 色综合色综合久久综合频道88| 91精品视频网站| 日韩中文在线观看| 日韩av在线导航| 欧洲日本亚洲国产区| 欧美激情乱人伦| 久久久国产影院| 欧美日本高清视频| 奇门遁甲1982国语版免费观看高清| 日韩欧美中文免费| 91精品国产亚洲| 孩xxxx性bbbb欧美| 三级精品视频久久久久| 国产精品一区二区三区毛片淫片| 日韩精品一区二区视频| 精品一区二区电影| 国产在线一区二区三区| 亚洲色图av在线| 亚洲在线视频观看| 欧美在线视频a| 国产精品久久久久国产a级| 韩国精品美女www爽爽爽视频| 91精品国产成人| 国内外成人免费激情在线视频| 欧美高清视频在线观看| 久久久久国色av免费观看性色| 最新69国产成人精品视频免费| 欧美日韩国产成人在线观看| 亚洲综合自拍一区| 555www成人网| 91久久久久久久久久久久久| 亚洲一区二区久久久久久久| 欧美成人性色生活仑片| 日韩美女在线播放| 国产97人人超碰caoprom| 亚洲最大的免费| 久久精品福利视频| 国产精品久久久91| 日韩精品视频免费专区在线播放| 国产精品入口日韩视频大尺度| 亚洲欧洲xxxx| 激情av一区二区| 欧美高清视频在线| 久久综合久久美利坚合众国| 最新69国产成人精品视频免费| 欧美性生交xxxxx久久久| 日韩电影中文 亚洲精品乱码| 中文字幕在线看视频国产欧美在线看完整| 色综合伊人色综合网| 日韩欧美成人网| 久久九九免费视频| 欧洲成人免费视频| 日韩一区二区久久久| 欧美成人精品一区| 91精品国产网站| 亚洲成人黄色在线观看| 亚洲免费影视第一页| 日韩av片免费在线观看| 97视频在线观看亚洲| 成人在线一区二区| 91精品国产高清久久久久久久久| 最新69国产成人精品视频免费| 中文字幕最新精品| 欧美疯狂性受xxxxx另类| 欧美午夜视频在线观看| 亚洲国产精品悠悠久久琪琪| 性欧美亚洲xxxx乳在线观看| 国产亚洲精品日韩| 亚洲人成在线一二| 亚洲视频欧美视频| 中文字幕精品www乱入免费视频| 欧美激情亚洲激情| 日韩精品高清在线| 亚洲自拍高清视频网站| 精品在线观看国产| 亚洲国产精品大全| 亚洲欧洲午夜一线一品| 热99精品里视频精品| 色综合亚洲精品激情狠狠| 久久久国产精品一区| 国产精品电影观看| 日本高清不卡在线| 亚洲一级免费视频| 亚洲视频自拍偷拍| 亚洲三级黄色在线观看| 国产激情999| 国产日韩精品入口| 欧美一级电影久久| 欧美中文字幕在线播放| 欧美成人免费全部观看天天性色| 久久综合伊人77777蜜臀| 亚洲欧美综合v| 精品国产依人香蕉在线精品| 欧美影院久久久| 久久久久久久久亚洲| 亚洲欧美精品伊人久久| 日韩成人在线播放| 92福利视频午夜1000合集在线观看| 亚洲人成伊人成综合网久久久| 日韩av色综合| 亚洲视屏在线播放| 欧美激情中文网| 日韩免费观看高清| 欧美激情乱人伦一区| 日韩成人中文电影| 亚洲午夜未删减在线观看| 欧美乱大交做爰xxxⅹ性3| x99av成人免费| 亚洲精品456在线播放狼人| 欧美成人免费全部| 97视频免费在线看| 久久久久久国产精品美女| 国产在线拍揄自揄视频不卡99| 国产福利视频一区二区| 久久九九精品99国产精品| 精品视频在线播放| 成人精品一区二区三区电影免费| 精品国产91久久久久久老师| 亚洲欧美在线磁力| 日韩美女视频免费在线观看| 亚洲天堂开心观看| 中文字幕精品一区二区精品| 在线观看国产成人av片| 国产91久久婷婷一区二区| 亚洲精品短视频| 成人黄色生活片| 国产精品aaaa| 久久久久国色av免费观看性色| 日韩美女激情视频| 欧美性猛交xxxx免费看漫画| 国产视频在线一区二区| 成人性教育视频在线观看| wwwwwwww亚洲| 中文综合在线观看| 成人在线播放av| 亚洲成人黄色在线观看| 成人中文字幕+乱码+中文字幕| 国产精品mp4| 日韩a**中文字幕| 欧美三级欧美成人高清www| 亚洲成av人影院在线观看|