簡(jiǎn)易實(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. 返回完整頁(yè)面注入渲染出來(lái)的html res.send( !DOCTYPE html html body !-- 服務(wù)端渲染生成的HTML -- div idapp${html}/div !-- 客戶端代碼用來(lái)水合激活交互 -- 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綁定事件變成可交互頁(yè)面 app.mount(#app, true)App.vuetemplate div h1Vue SSR頁(yè)面/h1 p{{ msg }}/p button clickclickHandle點(diǎn)我/button /div /template script setup const msg 服務(wù)端渲染內(nèi)容 const clickHandle () alert(按鈕交互) /script3. SSR 核心流程用戶請(qǐng)求頁(yè)面 → Node 服務(wù)啟動(dòng) Vue 應(yīng)用renderToString在服務(wù)端執(zhí)行組件生成靜態(tài) HTML 字符串HTML 直接返回瀏覽器首屏立刻看到內(nèi)容利于 SEO、首屏加載瀏覽器加載客戶端 js執(zhí)行hydrate水合水合對(duì)比已有 DOM綁定事件頁(yè)面擁有交互能力4. 兩個(gè)核心概念區(qū)分SSR服務(wù)端渲染renderToString輸出 HTML 字符串無(wú)交互水合 (hydration)客戶端復(fù)用已有 DOM附加事件避免重新創(chuàng)建 DOM5. 極簡(jiǎn)面試一句話總結(jié)SSR 在 Node 服務(wù)端運(yùn)行 Vue 組件通過(guò)renderToString將組件編譯為 HTML 返回瀏覽器實(shí)現(xiàn)快速首屏展示客戶端執(zhí)行水合為靜態(tài) DOM 綁定交互事件。補(bǔ)充和 SPA 區(qū)別SPA瀏覽器下載 js 后才渲染頁(yè)面空白屏 SSR瀏覽器直接收到完整 HTML首屏有內(nèi)容SEO 友好。react項(xiàng)目最簡(jiǎn)結(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ù)端渲染出來(lái)的文字/p button onClick{() alert(水合成功可以點(diǎn)擊)}點(diǎn)擊測(cè)試/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)物用來(lái)水合 -- script src/entry-client.js/script /body /html res.send(html) }) app.listen(3000, () console.log(React SSR 運(yùn)行在3000))完整執(zhí)行流程瀏覽器訪問(wèn)頁(yè)面 → Node 服務(wù)調(diào)用renderToString(App/)生成靜態(tài) HTML返回 HTML 給瀏覽器頁(yè)面直接展示內(nèi)容此時(shí)按鈕不能點(diǎn)擊瀏覽器加載entry-client.js執(zhí)行hydrateRoot對(duì)比現(xiàn)有 DOM綁定事件頁(yè)面擁有交互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í)時(shí)時(shí)鐘(RTC)、存儲(chǔ)器備份、傳感器等關(guān)鍵子系統(tǒng)供電。但這類不可充電的初級(jí)電…

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ù)一直是個(gè)棘手的難題。我最近用A5000加密模塊搭配PIC18LF25K80微控制器完成了一個(gè)工業(yè)級(jí)安全連接方案,這套組合就像是給數(shù)據(jù)傳輸配備了專業(yè)保鏢和智能管家。A5000作為硬件加密…

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

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

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

2026/7/29 4:16:02 閱讀更多
企業(yè)績(jī)效管理軟件的技術(shù)演進(jìn)與實(shí)施優(yōu)化

企業(yè)績(jī)效管理軟件的技術(shù)演進(jìn)與實(shí)施優(yōu)化

1. 企業(yè)績(jī)效管理軟件的演進(jìn)之路 2000年初的財(cái)務(wù)部門還在與Excel表格鏖戰(zhàn)時(shí),一家名為Hyperion Solutions的軟件公司已經(jīng)開始重新定義企業(yè)績(jī)效管理(EPM)的方式。作為最早將OLAP技術(shù)商業(yè)化的先驅(qū),他們推出的Essbase多維數(shù)據(jù)庫(kù)引擎徹底改變了財(cái)務(wù)分析的游戲規(guī)…

2026/7/29 12:56:43 閱讀更多
基于Arduino的自動(dòng)喂魚器DIY指南:從硬件選型到智能程序設(shè)計(jì)

基于Arduino的自動(dòng)喂魚器DIY指南:從硬件選型到智能程序設(shè)計(jì)

1. 從“養(yǎng)魚焦慮”到“動(dòng)手解決”:為什么你需要一個(gè)自動(dòng)喂魚器 養(yǎng)魚的朋友大概都經(jīng)歷過(guò)這種時(shí)刻:出差幾天,或者只是周末想出門玩一趟,心里就開始惦記家里的魚缸——魚食誰(shuí)來(lái)喂?喂多了怕壞水,喂少了怕餓著?!?/p>

2026/7/29 12:56:43 閱讀更多
100行Python代碼實(shí)現(xiàn)Mini OpenClaw爬蟲框架

100行Python代碼實(shí)現(xiàn)Mini OpenClaw爬蟲框架

1. 項(xiàng)目概述:100行代碼實(shí)現(xiàn)Mini OpenClaw的可行性分析去年在開發(fā)一個(gè)自動(dòng)化測(cè)試工具時(shí),我意外發(fā)現(xiàn)用Python的requests庫(kù)配合簡(jiǎn)單邏輯就能模擬出類似OpenClaw的基礎(chǔ)功能。這個(gè)發(fā)現(xiàn)讓我意識(shí)到:復(fù)雜系統(tǒng)的核心原理往往出人意料地簡(jiǎn)單。今天要分享…

2026/7/29 12:56:43 閱讀更多
3D打印自適應(yīng)智能鞋:軟機(jī)器人技術(shù)如何實(shí)現(xiàn)動(dòng)態(tài)適配

3D打印自適應(yīng)智能鞋:軟機(jī)器人技術(shù)如何實(shí)現(xiàn)動(dòng)態(tài)適配

1. 項(xiàng)目概述:當(dāng)鞋子開始“思考” 最近,SOLS公司推出的那款具備自適應(yīng)調(diào)節(jié)能力的3D打印鞋,在圈內(nèi)引起了不小的討論。這雙鞋聽起來(lái)像是從科幻片里走出來(lái)的:它能感知你的腳部狀態(tài),自動(dòng)調(diào)整鞋子的松緊、支撐甚至緩震性能?!?/p>

2026/7/29 12:56:43 閱讀更多
BBWEYY · 教培增長(zhǎng)解決方案,財(cái)會(huì)考證培訓(xùn)機(jī)構(gòu)GEO獲客與小程序轉(zhuǎn)化一體化策劃案,含零代碼SAAS、AI編程、源碼定制交付

BBWEYY · 教培增長(zhǎng)解決方案,財(cái)會(huì)考證培訓(xùn)機(jī)構(gòu)GEO獲客與小程序轉(zhuǎn)化一體化策劃案,含零代碼SAAS、AI編程、源碼定制交付

BBWEYY 教培增長(zhǎng)解決方案 財(cái)會(huì)考證培訓(xùn)機(jī)構(gòu)GEO獲客與小程序 轉(zhuǎn)化一體化策劃案 從“被AI推薦”到“查詢報(bào)考條件或領(lǐng)取備考方案”的完整招生轉(zhuǎn)化閉環(huán) 項(xiàng)目定位 適用對(duì)象 方案版本 GEO獲客與招生轉(zhuǎn)化 財(cái)會(huì)考證培訓(xùn)機(jī)構(gòu) 策劃方案 V1.0|2026年7月 核心判斷 財(cái)會(huì)…

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

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

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

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

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

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

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