最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

React服務端渲染(總結)

 更新時間:2017年07月01日 17:02:38   作者:BestMe丶  
當我們要求渲染時間盡量快、頁面響應速度快時就會用到服務端渲染,本篇文章主要介紹了React服務端渲染,有興趣的可以了解一下

一、前言

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

二、原因與思路

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

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

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

時間耗時比較:

1. 數(shù)據(jù)請求:由服務端請求數(shù)據(jù)而不是客戶端請求數(shù)據(jù),這是“快”的一個主要原因。服務端在內(nèi)網(wǎng)進行請求,數(shù)據(jù)響應速度快。客戶端在不同網(wǎng)絡環(huán)境進行數(shù)據(jù)請求,且外網(wǎng)http請求開銷大,導致時間差(主要原因)。

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

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

4. 渲染內(nèi)容:服務端渲染會把”可視“部分先渲染,然后交給客戶端再作部分渲染。而客戶端渲染,則是從無到有,需要經(jīng)歷完整的渲染步驟?!   ?/p>

  

三、注意事項與問題

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.js
module.exports = (
  <Route path="/" component={ IComponent } >
    <Route path="/todo" component={ AComponent }>
    </Route>
  </Route>
)

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

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

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

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

// 組件.js
componentWillMount() {
  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端能夠先請求數(shù)據(jù)然后再渲染?答:es7的async / await語法  

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

const routes = (
  <Route path="/" component={ IComponent } >
    <Route path="/todo" component={ AComponent }>
    </Route>
  </Route>
)
// 前端入口文件client.js
render(
  <Router routes={ routes } history={ browserHistory } />,
  ele
)
// node端入口文件server.js
let app = express();
app.get('/todo', (req, res) => {

  match({ routes: routes, location: req.url }, async (err, redirect, props) => {
     // match會幫我們找到要渲染的組件鏈,注:上面一行使用了async語法,因此可以在render之前使用await運行拉取數(shù)據(jù)的代碼
     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中是否還能繼續(xù)使用webpack的require.ensure ? 答:可以。但閃白明顯,且node端返回html后會有報錯,在加載腳本后該錯誤能忽略?!?/p>

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

        

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

以上就是本文的全部內(nèi)容,希望對大家的學習有所幫助,也希望大家多多支持腳本之家?! ?/p>

相關文章

  • react無限滾動組件的實現(xiàn)示例

    react無限滾動組件的實現(xiàn)示例

    本文主要介紹了react無限滾動組件的實現(xiàn)示例,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧
    2023-05-05
  • React技巧之中斷map循環(huán)的方法詳解

    React技巧之中斷map循環(huán)的方法詳解

    這篇文章主要和大家來分享一下React的技巧之如何中斷map循環(huán),文中的示例代碼講解詳細,具有一定的學習價值,感興趣的小伙伴可以了解一下
    2023-06-06
  • 實例講解React 組件生命周期

    實例講解React 組件生命周期

    這篇文章主要介紹了React 組件生命周期的相關資料,文中示例代碼非常詳細,幫助大家更好的理解和學習,感興趣的朋友可以了解下
    2020-07-07
  • react+antd實現(xiàn)動態(tài)編輯表格數(shù)據(jù)

    react+antd實現(xiàn)動態(tài)編輯表格數(shù)據(jù)

    這篇文章主要為大家詳細介紹了react+antd實現(xiàn)動態(tài)編輯表格數(shù)據(jù),文中示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2022-08-08
  • 如何在 React 中調(diào)用多個 onClick 函數(shù)

    如何在 React 中調(diào)用多個 onClick 函數(shù)

    這篇文章主要介紹了如何在React中調(diào)用多個onClick函數(shù),本文通過實例代碼給大家介紹的非常詳細,對大家的學習或工作具有一定的參考借鑒價值,需要的朋友參考下吧
    2023-11-11
  • React hook 'useState' is called conditionally報錯解決

    React hook 'useState' is calle

    這篇文章主要為大家介紹了React hook 'useState' is called conditionally報錯解決,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪
    2022-12-12
  • 使用react-virtualized實現(xiàn)圖片動態(tài)高度長列表的問題

    使用react-virtualized實現(xiàn)圖片動態(tài)高度長列表的問題

    一般我們在寫react項目中,同時渲染很多dom節(jié)點,會造成頁面卡頓, 空白的情況。為了解決這個問題,今天小編給大家分享一篇教程關于react-virtualized實現(xiàn)圖片動態(tài)高度長列表的問題,感興趣的朋友跟隨小編一起看看吧
    2021-05-05
  • 基于CSS實現(xiàn)MaterialUI按鈕點擊動畫并封裝成 React 組件

    基于CSS實現(xiàn)MaterialUI按鈕點擊動畫并封裝成 React 組件

    筆者先后開發(fā)過基于vue,react,angular等框架的項目,碧如vue生態(tài)的elementUI, ant-design-vue, iView等成熟的UI框架, react生態(tài)的ant-design, materialUI等,這些第三方UI框架極大的降低了我們開發(fā)一個項目的成本和復雜度,使開發(fā)者更專注于實現(xiàn)業(yè)務邏輯和服務化
    2021-11-11
  • React中memo useCallback useMemo方法作用及使用場景

    React中memo useCallback useMemo方法作用及使用場景

    這篇文章主要為大家介紹了React中三個hooks方法memo useCallback useMemo的作用及使用場景示例,有需要的朋友可以借鑒參考下,希望能夠有所幫助
    2023-03-03
  • React官方團隊完善原生Hook閉包陷阱

    React官方團隊完善原生Hook閉包陷阱

    這篇文章主要為大家介紹了React官方團隊出手,補齊原生Hook短板閉包陷阱的示例詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪
    2022-07-07

最新評論

隆子县| 株洲县| 化州市| 垦利县| 比如县| 视频| 乌拉特后旗| 镇平县| 噶尔县| 房山区| 翁源县| 宁德市| 商都县| 达州市| 柘荣县| 布尔津县| 浦东新区| 安新县| 湟源县| 弥渡县| 胶南市| 常州市| 乡城县| 吴江市| 宜章县| 满洲里市| 茂名市| 吉木乃县| 肥西县| 清镇市| 绩溪县| 那坡县| 米泉市| 武宁县| 尼勒克县| 永宁县| 固镇县| 个旧市| 葫芦岛市| 沁阳市| 崇信县|