Skip to content

Node.js CSR / SSR / SEO

jsdom:在 Node 中模拟浏览器环境

Node 没有 DOM/BOM,但可用 jsdom 模拟:

bash
npm i jsdom
js
const { JSDOM } = require('jsdom')

const dom = new JSDOM(`<!DOCTYPE html><div id='app'></div>`)
const document = dom.window.document

// 获取数据并操作 DOM
const data = await fetch('https://api.example.com/data').then(res => res.json())
const app = document.getElementById('app')
data.forEach(item => {
  const img = document.createElement('img')
  img.src = item.url
  app.appendChild(img)
})

// 序列化并输出为 HTML 文件
fs.writeFileSync('./index.html', dom.serialize())

fetch 在 Node 18+ 才可用,低版本可用 axios 替代。jsdom 版本过高可能报错,建议锁 jsdom@20

CSR vs SSR

CSR(客户端渲染)SSR(服务端渲染)
渲染位置浏览器端,由 JS 动态生成服务端预先渲染好完整 HTML
初始加载HTML 内容少,有延迟直接返回渲染好的页面,加载快
交互体验页面切换快,交互灵活首次加载性能好
SEO不友好(爬虫抓不到内容)友好(爬虫能获取完整页面)

SEO 与场景选择

CSR 适合:后台管理系统、大屏可视化等 ToB 应用,不需要 SEO。

SSR 适合:新闻网站、博客、电商、门户网站等内容密集型 ToC 应用,需要 SEO。

现代框架(Nuxt.js / Next.js)都支持 SSR,实际开发中很少直接用 jsdom 手写 SSR。