簡易實(shí)現(xiàn)ssr
vue31. 項(xiàng)目結(jié)構(gòu)src/ ├── entry-server.js # 服務(wù)端入口 ├── entry-client.js # 客戶端入口水合 ├── App.vue server.js # Node服務(wù) index.html # HTML模板2. 關(guān)鍵代碼server.jsNode 服務(wù)import express from express import { createSSRApp } from vue import { renderToString } from vue/server-renderer import App from ./App.vue const app express() app.get(*, async (req, res) { // 1. 創(chuàng)建Vue實(shí)例服務(wù)端 const vueApp createSSRApp(App) // 2. 渲染組件 → HTML字符串 const html await renderToString(vueApp) // 3. 返回完整頁面注入渲染出來的html res.send( !DOCTYPE html html body !-- 服務(wù)端渲染生成的HTML -- div idapp${html}/div !-- 客戶端代碼用來水合激活交互 -- script src/client.js/script /body /html ) }) app.listen(3000, () console.log(ssr server 3000))entry-client.js客戶端水合import { createSSRApp } from vue import App from ./App.vue const app createSSRApp(App) // hydrate水合把服務(wù)端靜態(tài)HTML綁定事件變成可交互頁面 app.mount(#app, true)App.vuetemplate div h1Vue SSR頁面/h1 p{{ msg }}/p button clickclickHandle點(diǎn)我/button /div /template script setup const msg 服務(wù)端渲染內(nèi)容 const clickHandle () alert(按鈕交互) /script3. SSR 核心流程用戶請求頁面 → Node 服務(wù)啟動 Vue 應(yīng)用renderToString在服務(wù)端執(zhí)行組件生成靜態(tài) HTML 字符串HTML 直接返回瀏覽器首屏立刻看到內(nèi)容利于 SEO、首屏加載瀏覽器加載客戶端 js執(zhí)行hydrate水合水合對比已有 DOM綁定事件頁面擁有交互能力4. 兩個核心概念區(qū)分SSR服務(wù)端渲染renderToString輸出 HTML 字符串無交互水合 (hydration)客戶端復(fù)用已有 DOM附加事件避免重新創(chuàng)建 DOM5. 極簡面試一句話總結(jié)SSR 在 Node 服務(wù)端運(yùn)行 Vue 組件通過renderToString將組件編譯為 HTML 返回瀏覽器實(shí)現(xiàn)快速首屏展示客戶端執(zhí)行水合為靜態(tài) DOM 綁定交互事件。補(bǔ)充和 SPA 區(qū)別SPA瀏覽器下載 js 后才渲染頁面空白屏 SSR瀏覽器直接收到完整 HTML首屏有內(nèi)容SEO 友好。react項(xiàng)目最簡結(jié)構(gòu)server.js # Node服務(wù) src/ ├── App.jsx # 組件 ├── entry-server.js # 服務(wù)端入口 └── entry-client.js # 客戶端水合入口 index.html # HTML模板1. App.jsxexport default function App() { return ( div h1React SSR Demo/h1 p服務(wù)端渲染出來的文字/p button onClick{() alert(水合成功可以點(diǎn)擊)}點(diǎn)擊測試/button /div ) }2. entry-server.js服務(wù)端渲染代碼import { renderToString } from react-dom/server import App from ./App export function render() { // 將組件渲染成HTML字符串 return renderToString(App /) }3. entry-client.js客戶端水合import { hydrateRoot } from react-dom/client import App from ./App // 復(fù)用服務(wù)端輸出的DOM綁定事件水合 hydrateRoot(document.getElementById(root), App /)4. server.js核心 Node 服務(wù)import express from express import { render } from ./src/entry-server.js const app express() // 托管打包后的客戶端js靜態(tài)資源 app.use(express.static(./dist/client)) app.get(*, async (req, res) { // 1. 服務(wù)端渲染組件得到html字符串 const appHtml render() // 2. 返回完整HTML注入渲染內(nèi)容 引入客戶端水合js const html !DOCTYPE html html body div idroot${appHtml}/div !-- 客戶端打包產(chǎn)物用來水合 -- script src/entry-client.js/script /body /html res.send(html) }) app.listen(3000, () console.log(React SSR 運(yùn)行在3000))完整執(zhí)行流程瀏覽器訪問頁面 → Node 服務(wù)調(diào)用renderToString(App/)生成靜態(tài) HTML返回 HTML 給瀏覽器頁面直接展示內(nèi)容此時按鈕不能點(diǎn)擊瀏覽器加載entry-client.js執(zhí)行hydrateRoot對比現(xiàn)有 DOM綁定事件頁面擁有交互React SSR 和 Vue3 SSR 關(guān)鍵相同點(diǎn)都需要兩份入口文件服務(wù)端渲染入口、客戶端水合入口服務(wù)端只輸出 HTML 字符串不掛載 DOM客戶端執(zhí)行水合 hydrate復(fù)用已有 DOM添加交互面試高頻區(qū)分? Vue3renderToStringcreateSSRApp().mount(#app, true)? React18renderToStringhydrateRoot

相關(guān)新聞

物聯(lián)網(wǎng)設(shè)備低功耗設(shè)計(jì):NBM7100A與STM32F765ZI優(yōu)化方案

物聯(lián)網(wǎng)設(shè)備低功耗設(shè)計(jì):NBM7100A與STM32F765ZI優(yōu)化方案

1. 項(xiàng)目背景與核心挑戰(zhàn)在物聯(lián)網(wǎng)設(shè)備和嵌入式系統(tǒng)設(shè)計(jì)中,紐扣電池(如CR2032)因其體積小、成本低、自放電率低等特性,常被用于為實(shí)時時鐘(RTC)、存儲器備份、傳感器等關(guān)鍵子系統(tǒng)供電。但這類不可充電的初級電…

2026/7/29 4:16:02 閱讀更多
A5000與PIC18LF25K80實(shí)現(xiàn)物聯(lián)網(wǎng)安全連接方案

A5000與PIC18LF25K80實(shí)現(xiàn)物聯(lián)網(wǎng)安全連接方案

1. 為什么選擇A5000與PIC18LF25K80組合在物聯(lián)網(wǎng)設(shè)備開發(fā)領(lǐng)域,安全連接云端服務(wù)一直是個棘手的難題。我最近用A5000加密模塊搭配PIC18LF25K80微控制器完成了一個工業(yè)級安全連接方案,這套組合就像是給數(shù)據(jù)傳輸配備了專業(yè)保鏢和智能管家。A5000作為硬件加密…

2026/7/29 4:16:02 閱讀更多
從傾斜開關(guān)到LED控制:嵌入式入門中的傳感器信號處理與消抖實(shí)踐

從傾斜開關(guān)到LED控制:嵌入式入門中的傳感器信號處理與消抖實(shí)踐

1. 項(xiàng)目緣起:從“傾斜”到“點(diǎn)亮”的物理直覺最近在整理工作室的電子元件,翻出來一堆傾斜開關(guān)和LED燈珠??粗@些不起眼的小玩意兒,我突然想到,很多朋友在入門電子制作時,第一個接觸的互動項(xiàng)目可能就是“按鈕控制LED”…

2026/7/29 4:16:02 閱讀更多
文字識別后排版混亂,掃描版PDF應(yīng)該怎么翻譯?

文字識別后排版混亂,掃描版PDF應(yīng)該怎么翻譯?

文字識別后排版混亂,掃描版PDF應(yīng)該怎么翻譯? 掃描版 PDF 的翻譯卡點(diǎn)不在"能不能識別文字",而在"識別完之后排版還能不能看"。不少 OCR 工具能把圖片里的文字轉(zhuǎn)成文本,但轉(zhuǎn)完之后段落順序錯亂、雙欄被拆成單行…

2026/7/29 5:16:04 閱讀更多
從C語言查找算法到逆向工程:手把手實(shí)現(xiàn)與學(xué)習(xí)路徑規(guī)劃

從C語言查找算法到逆向工程:手把手實(shí)現(xiàn)與學(xué)習(xí)路徑規(guī)劃

1. 項(xiàng)目概述:從“查找”到“逆向”的C/C學(xué)習(xí)路徑 最近在整理硬盤里的老項(xiàng)目,翻出來一堆當(dāng)年學(xué)習(xí)C和C時寫的代碼片段,其中有一個文件夾特別顯眼,名字就叫“查找算法實(shí)現(xiàn)”。點(diǎn)開一看,里面是兩種最基礎(chǔ)的查找算法——順序…

2026/7/29 5:16:04 閱讀更多
HTTP與HTTPS核心原理:從明文傳輸?shù)郊用芪帐峙c性能優(yōu)化

HTTP與HTTPS核心原理:從明文傳輸?shù)郊用芪帐峙c性能優(yōu)化

1. 從“明文快遞”到“武裝押運(yùn)”:HTTP與HTTPS的本質(zhì)透視 干了這么多年開發(fā),每次面試新人或者和同行聊起網(wǎng)絡(luò)基礎(chǔ),HTTP和HTTPS這對“兄弟”總是繞不開的話題。表面上看,就是一個“S”的差別,但背后牽扯到的安全、性能…

2026/7/29 5:16:04 閱讀更多
ROS2通信接口解析:從DDS原理到機(jī)器人開發(fā)實(shí)踐

ROS2通信接口解析:從DDS原理到機(jī)器人開發(fā)實(shí)踐

1. ROS2通信接口的本質(zhì)與演進(jìn)在機(jī)器人開發(fā)領(lǐng)域,通信系統(tǒng)如同機(jī)器人的神經(jīng)系統(tǒng)。ROS2對通信接口的重構(gòu),解決了ROS1時代諸多痛點(diǎn)。我曾參與過多個從ROS1遷移到ROS2的工業(yè)機(jī)器人項(xiàng)目,深刻體會到新架構(gòu)帶來的變革。ROS2采用DDS(數(shù)據(jù)分…

2026/7/29 5:06:04 閱讀更多
面試官大笑:“一個任務(wù)拆給 5 個 Subagent 并行跑,不比 1 個快 5 倍?“我搖頭:“快不了,還可能更慢“

面試官大笑:“一個任務(wù)拆給 5 個 Subagent 并行跑,不比 1 個快 5 倍?“我搖頭:“快不了,還可能更慢“

前兩個月,我在重構(gòu) AlgoMooc 網(wǎng)站過程中,發(fā)現(xiàn)一個問題:在 Claude Code 里把一個任務(wù)拆給 5 個 Subagent 并行跑,結(jié)果可能比 1 個 agent 從頭干到尾還慢? 大多數(shù)人的第一反應(yīng)是反過來的:活是并行干的&#…

2026/7/29 0:15:24 閱讀更多
# 鴻蒙 HarmonyOS 應(yīng)用開發(fā)實(shí)戰(zhàn)(第25期)|骰子(Dice Roller)— Unicode 符號與動畫渲染精講

# 鴻蒙 HarmonyOS 應(yīng)用開發(fā)實(shí)戰(zhàn)(第25期)|骰子(Dice Roller)— Unicode 符號與動畫渲染精講

一、應(yīng)用概述 骰子(Dice Roller) 是一款經(jīng)典的休閑娛樂應(yīng)用,模擬了真實(shí)擲骰子的過程。應(yīng)用投擲兩個骰子(六面標(biāo)準(zhǔn)骰),使用 Unicode 骰面符號直觀展示每個骰子的點(diǎn)數(shù),并伴有快速滾動的動畫效果?!?/p>

2026/7/29 0:15:24 閱讀更多