JavaScript 本身不能直接实现服务端渲染(SSR),必须运行在 Node.js 环境中并配合框架或手动调用 renderToString/renderToNodeStream 等 API;纯浏览器端 JavaScript 无法 SSR。
JavaScript 本身不能直接实现服务端渲染(SSR),它需要运行在 Node.js 环境中,并配合框架或手动调用 renderToString / renderToNodeStream 等 API 才能完成。纯浏览器端的 JavaScript 无法 SSR。
document 在 Node.js 里不可用服务端没有 DOM,document、window、localStorage 等浏览器全局对象在 Node.js 中未定义。直接运行依赖它们的前端代码会抛出 ReferenceError: document is not defined。
useEffect 或 mounted)window,需用 typeof window !== 'undefined' 包裹,或通过 Webpack 的 targ
et: 'node' + externals 隔离public/ 下的图片)在服务端需转为 path.join(__dirname, '../public'),不能靠相对 URLrenderToString 做最简 SSR这是 React 官方支持的同步 SSR 方式,适用于首屏内容确定、无异步数据获取的场景。
ReactDOMServer.renderToString,不是 ReactDOM.render
import { renderToString } from 'react-dom/server';
import App from './App.js';
const html = renderToString();
res.send(`
${html}
`);
renderToString 需要 createSSRApp
Vue 3 的 SSR 不再兼容普通 createApp,必须用专用的 SSR 入口。
.vue 单文件组件,需用 defineAsyncComponent 或预编译 SFCcreateSSRApp 创建应用实例,否则 renderToString 会报错props 或 provide/inject 注入,而非 ref 或 reactive 后动态改TypeError: Cannot read property 'push' of undefined —— 通常是因为路由未用 createMemoryHistory 初始化只渲染 HTML 不够,客户端 JS 加载后必须“水合”(hydrate)服务端生成的 DOM。一旦服务端与客户端渲染结果不一致,Vue 会警告 Hydration failed,React 则会丢弃整个节点并重新渲染。
useEffect 或 onMounted 里——服务端不执行这些钩子,导致首屏没数据asyncData 或 load 方法,服务端提前调用并把结果序列化进 HTML 的
window.__INITIAL_STATE__,避免重复请求Date.now() 这类非幂等操作——服务端和客户端值不同,必然导致 mismatchSSR 的核心难点不在渲染函数本身,而在于环境隔离、数据流对齐和生命周期错位。很多问题只在构建部署后暴露,本地开发容易误判为“已跑通”。