react服務端渲染框架

2022-03-04 13:38:13 字數 3568 閱讀 3990

客戶端渲染

載入乙個空的html頁面,然後請求乙個打包的js檔案,然後再客戶端執行這個js檔案

動態生成html內容然後插入到dom元素上,在源**查詢中也只能看到空的html文件

沒有任何其他內容

服務端渲染

載入出來的就帶有完整的html文件內容(同時帶有資料)

流程: 瀏覽器傳送請求 --> 伺服器端執行react**生成頁面 --> 伺服器端返回渲染的頁

客戶端渲染:react**在瀏覽器上執行,消耗的是使用者瀏覽器的效能

服務端渲染:react**在伺服器上執行,消耗的是伺服器端的效能

伺服器端渲染好處:seo(只識別 html 而不識別js裡面的內容 )可以得到優化,首屏速度加快

虛擬dom是真實dom的乙個js物件對映

虛擬dom可以通過reactdom的render方法,轉化為真實dom掛載到頁面的dom節點上

也可以通過rendertostring ,轉化為乙個字串

js預設遵守commonjs規範

此時是沒有辦法執行的,因為不識別 jsx 的語法

yarn add webpack babel-core babel-loader  webpack-cli

webpack可以幫助我們打包客戶端**和服務端**,但是需要加上 target: 「node」引數

表示打包的是服務端**

2者的區別  let path = require('path')

在服務端不需要將其一起打包進 編譯的檔案中

但是在客戶端需要一起打包,因為伺服器端(node端) 已經有執行依賴的庫

yarn add babel-preset-react  babel能夠解析 jsx 語法

yarn add babel-preset-stage-0  babel-preset-env

注意在:babel8中 有些包是已經廢棄了的,比如:babel-preset-react需要換成 @babel/preset-react

由於使用了webpack和stage-0 伺服器端**完全可以使用es6的模組引入方式,最終編譯後還是 require這種

**引入方式

打包命令: webpack --config webpack.server.js (不寫檔名稱,預設為webpack.config.js)

webpack-node-externals 雖然自帶的模組不會打包進最後生成的檔案中,但是 node_modules第三方模組會被打包

所以需要這個外掛程式,來過濾掉這個包裡面的檔案

rendertostring 將組建渲染成字串

webpack 服務端基本配置

-w (或者 --watch) 表示一直處於監聽狀態    監聽的是配置檔案中的入口檔案(及其依賴檔案) 只要檔案發生改變就會重新編譯該檔案

發現乙個問題

1. 編譯可以監聽了,但是需要每次 重新啟動伺服器

--watch後面的引數表示只要 build 目錄中的檔案改變了就會重新啟動伺服器

2.但是還是需要啟動2個視窗

可以使用 npm-run-all 來提公升開發效率,乙個視窗可以執行多條命令

--parallel 表示並行執行

同構:一套react**,在伺服器端執行一次,在瀏覽器端也執行一次

問題:rendertostring 只會渲染元件的基本內容,像點選事件等是不會起作用的

在客戶端執行一段**

靜態檔案必須放在 public中才能被訪問到,訪問靜態檔案的配置

伺服器端**

使用render方法也可以,但是會有警告

同構的時候使用這個 hydrate 涉及到資料的注水和脫水

這樣按鈕的點選就可以使用了,因為元件在客戶端重新渲染了一遍

執行流程

1. 伺服器端執行react**渲染出html

2.傳送html給瀏覽器

3.瀏覽器收到內容展示

4.瀏覽器載入js靜態檔案

5.js中的react**在瀏覽器端重新執行一遍,此後js中的react**接管頁面的操作

伺服器端使用路由 

使用staticrouter 代替 browerrouter

客戶端路由也會重新執行一遍,伺服器和客戶端路由要統一

否則會出現警告

多個頁面的跳轉

加上header

只有第一次訪問才是服務端渲染

伺服器端路由必須先獲取路徑,才能找到對應的元件     context裡面是資料的傳遞

nodejs作為乙個中間層,只負責後端介面的呼叫和頁面的展示

服務端中使用redux :服務端和客戶端都需要建立store

當服務端沒有用provider包裹的時候會提示 store 找不到

直接匯出store會使得整個應用只有乙個store ,這樣所有使用者共享乙個store,顯然是不對的

需要返回乙個函式

傳送非同步請求定義在生命週期函式中,最好是componentdidmount中

componentwillmount 可能在使用react native中有些小問題

componentdidmount在服務端渲染的時候並不會執行

服務端資料渲染

非同步資料伺服器渲染:loaddata方法及路由重構

給元件增加loaddata靜態方法,負責在服務端渲染頁面之前將這個路由的資料準備好

這種路由是不能定義 loaddata 方法的

store裡面應該填充什麼資料,需要結合當前使用者輸入的位址

import from 'react-router-dom'

但是不能匹配多級路由

但是 matchpath 只能找到一層路由

如果要用在多層路由  就需要安裝 react-router-config 

得到匹配到的所有元件  並且讓 匹配到的所有元件都執行 loaddata 方法

react服務端渲染next

mkdir nextdemo cd nextdemo npm init y 配置package.json scripts 啟動命令 npm run dev 或者yarn dev 啟動命令 yarn dev 或者npm run dev next缺省會自動給我們生成好路由,路由生成規則是在專案的根目錄下...

react服務端渲染(同構)

學習react也有一段時間了,使用react後首頁渲染的速度與seo一直不理想。打算研究一下react神奇服務端渲染。react服務端渲染只能使用nodejs做服務端語言實現前後端同構,在後台對react元件進行解析並生成html字串後返回檢視頁面。後台為什麼可以解析react元件?因為node j...

React 服務端渲染的流程簡述

做 react ssr 有一段時間了,在正好在這裡分享一下.使用者第一次請求 重新整理頁面時,由服務端響應.伺服器響應的是乙個已經插入了元件文字的模板 template with pre populated component 由於響應的頁面已經有元件的 html 文字,可以省去瀏覽器端首次渲染的工...