
如何用 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與流式渲染兩種實現的基線性能。如果你的目標是搭建一個可以反復對比「一次性字符串渲染」和「流式 SSR」表現的本地環境這篇文章給出完整的操作步驟從構建 React 產物到啟動夾具服務、切換 dev/prod 模式、調整延遲參數以及判斷服務是否按預期運行。準備條件Node 版本要求fixtures/fizz/package.json 的engines字段聲明node: 14.9.0。夾具引用的是本地構建的 React 產物而不是 npm 上的發布版。因此第一步必須在 React 倉庫根目錄執行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產物夾具的prestart/predev鉤子正是把這份產物復制進自己的node_modules來引用。啟動開發模式進入夾具目錄并安裝依賴、啟動服務cd fixtures/fizz yarn yarn startyarn start通過concurrently同時拉起兩個進程見package.json的scriptsstart:server以NODE_ENVproduction環境變量用 nodemon 運行 server/server.jsstart:bundler用 nodemon 運行scripts/build.js的 webpack 構建。按 README 的說明start命令會以開發模式運行 webpack dev server 和服務端渲染服務器并支持熱加載。啟動后服務端會打印監聽日志Listening at 4000...默認端口是 4000server.js中通過const PORT process.env.PORT || 4000讀取如需更換端口可設置PORT環境變量。訪問三種渲染端點server/server.js 暴露了四個路由正好覆蓋基線對比所需的實現路由渲染方式實現文件/和/stream流式渲染renderToPipeableStreamserver/render-to-stream.js/stringlegacy 同步渲染renderToStringserver/render-to-string.js/buffer用Writable累積完整 HTML 后再一次性發送server/render-to-buffer.js服務啟動時會先執行waitForWebpack()在 webpack 產出build/main.js之前請求會持續等待并打印「Could not find webpack build output. Will retry in a second...」這是正常的等待現象不是錯誤。流式端點的行為要點來自render-to-stream.js源碼注釋onShellReady時發送響應頭并開始向響應流pipe數據onAllReady表示完整渲染完成可用于 SSG 或爬蟲場景若 shell 階段出錯響應狀態碼為 500 并輸出!doctypepError/p存在一個ABORT_DELAY定時器到時間仍未完成則調用abort()放棄服務端渲染、回退到客戶端渲染。源碼注釋寫的是「Try lowering this to see the client recover」即調低該值可以觀察客戶端接管恢復的過程。調整延遲參數來觀察不同延遲場景三種渲染都會經過的延遲常量集中在 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模擬服務端數據請求的耗時ABORT_DELAY流式渲染放棄轉客戶端渲染前等待數據的時間JS_BUNDLE_DELAYJS bundle 下發的延遲。修改后由于 nodemon 監控源碼服務會自動重啟重新請求/、/string、/stream三個端點即可在相同延遲條件下橫向比較不同實現的輸出節奏。生產模式與重建 React 后的重跑可選分支如果不想用熱加載的開發環境而是模擬更接近正式部署的環境README 給出的是yarn start:prod該命令會預先構建所有靜態資源然后啟動一個托管 React 應用并服務靜態資源的服務端渲染 HTTP 服務器無熱加載。一個容易踩的坑在 README 中用加粗標出每次改動 React 并重新構建后必須在fixtures/fizz目錄重新運行yarn。原因是prestart鉤子執行的是cp -r ../../build/oss-experimental/* ./node_modules/ rm -rf node_modules/.cache只有在再次安裝/啟動時新的 React 本地構建產物才會被復制進node_modules否則你測的還是舊版構建。如何判斷運行結果與已知邊界啟動成功的直接信號是終端出現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」——它只是一個基線測試夾具不是生產級 SSR 方案package.json中的react/react-dom依賴在運行期實際被本地構建產物覆蓋用于觀察行為而非驗證發布版本。完成一次完整的基線觀察順序就是根目錄npm run build→fixtures/fizz下yarn→yarn start或yarn start:prod→ 分別訪問/、/string、/buffer對比表現 → 修改 server/delays.js 觀察不同延遲下的行為。改動 React 源碼后記得回到fixtures/fizz重跑yarn再驗證。【免費下載鏈接】reactThe library for web and native user interfaces.項目地址: https://gitcode.com/GitHub_Trending/re/react創作聲明:本文部分內容由AI輔助生成(AIGC),僅供參考