外观
SSR 应用
Nuxt SSR 独立应用存放在 apps-home/。它们与 SSG 应用共享目录自动发现规则,但会被列入 STANDALONE_SSR_APPS,以 Nitro 实时服务而不是生成静态 HTML。
当前导航站 apps-home/nav 是 SSR 应用:服务端在每次请求时读取导航 API,初始 HTML 包含分类、网址名称和链接,搜索引擎无需执行 JavaScript 即可索引网址内容。
配置
Nuxt 配置通过 generateNuxtConfig 传入以下选项:
ts
const config = generateNuxtConfig({
importMetaUrl: import.meta.url,
isSsr: true,
useCdn: false,
// 站点配置
});1
2
3
4
5
6
2
3
4
5
6
isSsr 将 Nitro 的 public 与 server 产物统一输出到 node_modules/.nuxt-{app}/.output;useCdn: false 让 Nitro 随应用提供水合资源,避免 SSR HTML 引用未部署的静态 CDN 文件。
开发与构建
bash
# 仅启动 SSR 应用
npm run dev:ssr
# 仅构建 SSR 应用
cross-env TASKS=ssr:nav npm run build1
2
3
4
5
2
3
4
5
导航站开发服务绑定 SERVER_HOST:9890。开发环境中的 SERVER_HOST 会自动解析为本机可用的 IPv4 地址;本机和同一局域网设备均可通过 http://{SERVER_HOST}:9890 访问,例如 http://192.168.1.10:9890。
本地开发的 API 代理
生产环境中浏览器端的 /api/ 请求由 Nginx 转发到 Express 服务;本地开发没有 Nginx,因此 generateNuxtConfig 在 NODE_ENV === "development" 时通过 Nitro 的 devProxy 将 /api 代理到 http://{SERVER_HOST}:{SERVER_PORT}/api(即 apiInternalBase),模拟生产网关行为。该代理仅在 dev server 生效,不影响生产构建产物;SSR 服务端请求仍直接使用私有 apiInternalBase。
部署与网关
部署脚本上传 .output 到独立站目录,并由 PM2 启动 .output/server/index.mjs。Nginx 将站点根路径代理到 Nitro 端口;浏览器端 /api/ 请求仍代理到 Express,SSR 请求则通过私有 apiInternalBase 访问同一组 API。
当站点与主站位于同一父域且需要登录、收藏等用户功能时,生产会话 Cookie 使用父域 .verysites.com,以便请求可在 Nuxt SSR 与浏览器端 API 调用中保持一致。