简易实现ssr
vue31. 项目结构src/ ├── entry-server.js # 服务端入口 ├── entry-client.js # 客户端入口水合 ├── App.vue server.js # Node服务 index.html # HTML模板2. 关键代码server.jsNode 服务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. 创建Vue实例服务端 const vueApp createSSRApp(App) // 2. 渲染组件 → HTML字符串 const html await renderToString(vueApp) // 3. 返回完整页面注入渲染出来的html res.send( !DOCTYPE html html body !-- 服务端渲染生成的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水合把服务端静态HTML绑定事件变成可交互页面 app.mount(#app, true)App.vuetemplate div h1Vue SSR页面/h1 p{{ msg }}/p button clickclickHandle点我/button /div /template script setup const msg 服务端渲染内容 const clickHandle () alert(按钮交互) /script3. SSR 核心流程用户请求页面 → Node 服务启动 Vue 应用renderToString在服务端执行组件生成静态 HTML 字符串HTML 直接返回浏览器首屏立刻看到内容利于 SEO、首屏加载浏览器加载客户端 js执行hydrate水合水合对比已有 DOM绑定事件页面拥有交互能力4. 两个核心概念区分SSR服务端渲染renderToString输出 HTML 字符串无交互水合 (hydration)客户端复用已有 DOM附加事件避免重新创建 DOM5. 极简面试一句话总结SSR 在 Node 服务端运行 Vue 组件通过renderToString将组件编译为 HTML 返回浏览器实现快速首屏展示客户端执行水合为静态 DOM 绑定交互事件。补充和 SPA 区别SPA浏览器下载 js 后才渲染页面空白屏 SSR浏览器直接收到完整 HTML首屏有内容SEO 友好。react项目最简结构server.js # Node服务 src/ ├── App.jsx # 组件 ├── entry-server.js # 服务端入口 └── entry-client.js # 客户端水合入口 index.html # HTML模板1. App.jsxexport default function App() { return ( div h1React SSR Demo/h1 p服务端渲染出来的文字/p button onClick{() alert(水合成功可以点击)}点击测试/button /div ) }2. entry-server.js服务端渲染代码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 // 复用服务端输出的DOM绑定事件水合 hydrateRoot(document.getElementById(root), App /)4. server.js核心 Node 服务import express from express import { render } from ./src/entry-server.js const app express() // 托管打包后的客户端js静态资源 app.use(express.static(./dist/client)) app.get(*, async (req, res) { // 1. 服务端渲染组件得到html字符串 const appHtml render() // 2. 返回完整HTML注入渲染内容 引入客户端水合js const html !DOCTYPE html html body div idroot${appHtml}/div !-- 客户端打包产物用来水合 -- script src/entry-client.js/script /body /html res.send(html) }) app.listen(3000, () console.log(React SSR 运行在3000))完整执行流程浏览器访问页面 → Node 服务调用renderToString(App/)生成静态 HTML返回 HTML 给浏览器页面直接展示内容此时按钮不能点击浏览器加载entry-client.js执行hydrateRoot对比现有 DOM绑定事件页面拥有交互React SSR 和 Vue3 SSR 关键相同点都需要两份入口文件服务端渲染入口、客户端水合入口服务端只输出 HTML 字符串不挂载 DOM客户端执行水合 hydrate复用已有 DOM添加交互面试高频区分✅ Vue3renderToStringcreateSSRApp().mount(#app, true)✅ React18renderToStringhydrateRoot

相关新闻

物联网设备低功耗设计:NBM7100A与STM32F765ZI优化方案

物联网设备低功耗设计:NBM7100A与STM32F765ZI优化方案

1. 项目背景与核心挑战在物联网设备和嵌入式系统设计中,纽扣电池(如CR2032)因其体积小、成本低、自放电率低等特性,常被用于为实时时钟(RTC)、存储器备份、传感器等关键子系统供电。但这类不可充电的初级电…

2026/7/29 4:16:02 阅读更多
A5000与PIC18LF25K80实现物联网安全连接方案

A5000与PIC18LF25K80实现物联网安全连接方案

1. 为什么选择A5000与PIC18LF25K80组合在物联网设备开发领域,安全连接云端服务一直是个棘手的难题。我最近用A5000加密模块搭配PIC18LF25K80微控制器完成了一个工业级安全连接方案,这套组合就像是给数据传输配备了专业保镖和智能管家。A5000作为硬件加密…

2026/7/29 4:16:02 阅读更多
ROS2通信接口解析:从DDS原理到机器人开发实践

ROS2通信接口解析:从DDS原理到机器人开发实践

1. ROS2通信接口的本质与演进在机器人开发领域,通信系统如同机器人的神经系统。ROS2对通信接口的重构,解决了ROS1时代诸多痛点。我曾参与过多个从ROS1迁移到ROS2的工业机器人项目,深刻体会到新架构带来的变革。ROS2采用DDS(数据分…

2026/7/29 5:06:04 阅读更多
Frida MemoryAccessMonitor:内存访问监控原理与逆向工程实战

Frida MemoryAccessMonitor:内存访问监控原理与逆向工程实战

1. 项目概述:为什么需要精准的内存读写监听?在逆向工程、安全研究或者应用调试的日常里,我们常常会遇到一个核心需求:我想知道某个程序在运行时,到底在内存的哪个位置、以什么方式、读取或修改了哪些数据。传统的断点调…

2026/7/29 5:06:04 阅读更多
2026年大数据分析工具推荐:性能与扩展对比

2026年大数据分析工具推荐:性能与扩展对比

大数据分析工具这几年的选择面确实宽了很多,从开源引擎到商业平台,从云上服务到本地部署,每家都在强调"快"和"大"。但在实际落地中,"大数据分析"真正难的不是能不能跑起来,而是当数据量…

2026/7/29 5:06:04 阅读更多
高通8155平台AOSP+BSP代码编译实战:从环境搭建到镜像烧录

高通8155平台AOSP+BSP代码编译实战:从环境搭建到镜像烧录

1. 项目概述:为什么高通8155平台的开源代码如此重要? 最近有不少做车机系统开发的朋友在后台问我,有没有高通8155平台最新的开源代码和编译方法。这确实是个好问题,也是当前智能座舱开发领域的一个核心痛点。高通骁龙8155芯片&am…

2026/7/29 5:06:04 阅读更多
基于STM32的智能小车设计:从硬件选型到PID循迹算法实战

基于STM32的智能小车设计:从硬件选型到PID循迹算法实战

1. 项目概述:从零打造一台“全能”智能小车搞嵌入式开发,尤其是玩单片机的朋友,十个里有八个都绕不开“智能小车”这个经典项目。它就像电子工程师的“Hello World”,但远比打印一行字复杂和有趣得多。今天我想分享的,…

2026/7/29 5:06:04 阅读更多
IP地址与子网掩码计算:网络排错与规划的必备基本功

IP地址与子网掩码计算:网络排错与规划的必备基本功

1. 从一次真实的网络故障说起:为什么IP计算是基本功那天下午,整个办公室的网络突然变得奇慢无比,部分同事甚至完全无法访问内部的文件服务器。作为团队里对网络稍有了解的人,我被叫去帮忙。初步排查,路由器和交换机指示…

2026/7/29 4:56:04 阅读更多