
如何用 Fizz 夾具測試 React 流式 SSR 的性能基線【免費下載鏈接】reactThe library for web and native user interfaces.項目地址: https://gitcode.com/GitHub_Trending/re/reactReact 倉庫中的fixtures/fizz是一組用于驗證 Fizz 服務端渲染的基本測試應用其定位在 fixtures/fizz/README.md 中寫得很明確主要用來觀察 legacyrenderToString與流式渲染兩種實現(xiàn)的基線性能。如果你的目標是搭建一個可以反復對比「一次性字符串渲染」和「流式 SSR」表現(xiàn)的本地環(huán)境這篇文章給出完整的操作步驟從構建 React 產(chǎn)物到啟動夾具服務、切換 dev/prod 模式、調(diào)整延遲參數(shù)以及判斷服務是否按預期運行。準備條件Node 版本要求fixtures/fizz/package.json 的engines字段聲明node: 14.9.0。夾具引用的是本地構建的 React 產(chǎn)物而不是 npm 上的發(fā)布版。因此第一步必須在 React 倉庫根目錄執(zhí)行npm run buildfixtures/fizz/README.md 明確說明「To reference a local build of React, first runnpm run buildat the root of the React project」。根目錄package.json中的build腳本會生成build/oss-experimental產(chǎn)物夾具的prestart/predev鉤子正是把這份產(chǎn)物復制進自己的node_modules來引用。啟動開發(fā)模式進入夾具目錄并安裝依賴、啟動服務cd fixtures/fizz yarn yarn startyarn start通過concurrently同時拉起兩個進程見package.json的scriptsstart:server以NODE_ENVproduction環(huán)境變量用 nodemon 運行 server/server.jsstart:bundler用 nodemon 運行scripts/build.js的 webpack 構建。按 README 的說明start命令會以開發(fā)模式運行 webpack dev server 和服務端渲染服務器并支持熱加載。啟動后服務端會打印監(jiān)聽日志Listening at 4000...默認端口是 4000server.js中通過const PORT process.env.PORT || 4000讀取如需更換端口可設置PORT環(huán)境變量。訪問三種渲染端點server/server.js 暴露了四個路由正好覆蓋基線對比所需的實現(xiàn)路由渲染方式實現(xiàn)文件/和/stream流式渲染renderToPipeableStreamserver/render-to-stream.js/stringlegacy 同步渲染renderToStringserver/render-to-string.js/buffer用Writable累積完整 HTML 后再一次性發(fā)送server/render-to-buffer.js服務啟動時會先執(zhí)行waitForWebpack()在 webpack 產(chǎn)出build/main.js之前請求會持續(xù)等待并打印「Could not find webpack build output. Will retry in a second...」這是正常的等待現(xiàn)象不是錯誤。流式端點的行為要點來自render-to-stream.js源碼注釋onShellReady時發(fā)送響應頭并開始向響應流pipe數(shù)據(jù)onAllReady表示完整渲染完成可用于 SSG 或爬蟲場景若 shell 階段出錯響應狀態(tài)碼為 500 并輸出!doctypepError/p存在一個ABORT_DELAY定時器到時間仍未完成則調(diào)用abort()放棄服務端渲染、回退到客戶端渲染。源碼注釋寫的是「Try lowering this to see the client recover」即調(diào)低該值可以觀察客戶端接管恢復的過程。調(diào)整延遲參數(shù)來觀察不同延遲場景三種渲染都會經(jīng)過的延遲常量集中在 server/delays.js文件注釋是「Tweak these to play with different kinds of latency」// How long the data fetches on the server. exports.API_DELAY 2000; // How long the server waits for data before giving up. exports.ABORT_DELAY 10000; // How long serving the JS bundles is delayed. exports.JS_BUNDLE_DELAY 4000;API_DELAY模擬服務端數(shù)據(jù)請求的耗時ABORT_DELAY流式渲染放棄轉(zhuǎn)客戶端渲染前等待數(shù)據(jù)的時間JS_BUNDLE_DELAYJS bundle 下發(fā)的延遲。修改后由于 nodemon 監(jiān)控源碼服務會自動重啟重新請求/、/string、/stream三個端點即可在相同延遲條件下橫向比較不同實現(xiàn)的輸出節(jié)奏。生產(chǎn)模式與重建 React 后的重跑可選分支如果不想用熱加載的開發(fā)環(huán)境而是模擬更接近正式部署的環(huán)境README 給出的是yarn start:prod該命令會預先構建所有靜態(tài)資源然后啟動一個托管 React 應用并服務靜態(tài)資源的服務端渲染 HTTP 服務器無熱加載。一個容易踩的坑在 README 中用加粗標出每次改動 React 并重新構建后必須在fixtures/fizz目錄重新運行yarn。原因是prestart鉤子執(zhí)行的是cp -r ../../build/oss-experimental/* ./node_modules/ rm -rf node_modules/.cache只有在再次安裝/啟動時新的 React 本地構建產(chǎn)物才會被復制進node_modules否則你測的還是舊版構建。如何判斷運行結(jié)果與已知邊界啟動成功的直接信號是終端出現(xiàn)Listening at 4000...隨后訪問http://localhost:4000/應能拿到流式渲染的 HTML 頁面。端口被占用時server.js會輸出Port 4000 is already in use并退出對應EADDRINUSE分支需要先釋放端口再啟動。流式渲染在 shell 出錯時返回 500 和!doctypepError/ponError會把錯誤打印到控制臺console.error(x)。需要說明的邊界各渲染文件中硬編碼了assets {main.js: /main.js, main.css: /main.css}源碼注釋是「In a real setup, youd read it from webpack build stats」——它只是一個基線測試夾具不是生產(chǎn)級 SSR 方案package.json中的react/react-dom依賴在運行期實際被本地構建產(chǎn)物覆蓋用于觀察行為而非驗證發(fā)布版本。完成一次完整的基線觀察順序就是根目錄npm run build→fixtures/fizz下yarn→yarn start或yarn start:prod→ 分別訪問/、/string、/buffer對比表現(xiàn) → 修改 server/delays.js 觀察不同延遲下的行為。改動 React 源碼后記得回到fixtures/fizz重跑yarn再驗證?!久赓M下載鏈接】reactThe library for web and native user interfaces.項目地址: https://gitcode.com/GitHub_Trending/re/react創(chuàng)作聲明:本文部分內(nèi)容由AI輔助生成(AIGC),僅供參考