密码的,YOU不能不知道的Next.jsSSR(服务端渲染)

我是 前端SSR 彭于晏,我喂自己袋盐,我把页面在服务器渲染好了,请把你分享给我,SEO 杠杠的。

随着网站对 首屏性能、SEO 优化和个性化内容 的要求越来越高,服务端渲染(SSR) 成为了现代前端框架的重要技能。本文将基于 Next.js 13+(最新Next15) 展示一个完整的 SSR 分享页面实战案例,帮助你快速掌握 Next.js SSR 的核心要点。


🧪 SSR 使用场景分析

SSR(Server Side Rendering)是指页面的 HTML 内容在服务器端生成,而不是完全依赖浏览器执行 JavaScript 渲染。

🔹 SSR 的基本流程

  1. 客户端请求页面 → 浏览器向服务器发起请求
  2. 服务端渲染 HTML → 服务器根据请求参数、Cookie、用户身份等生成完整 HTML
  3. 返回 HTML 给浏览器 → 浏览器直接拿到带内容的页面并展示
  4. 前端框架接管 → 前端 JS 执行 Hydration("水合"),页面变得可交互

为什么要用 SSR?

优点 说明
首屏渲染快 用户首次打开页面就能看到完整内容,弱网和低性能设备尤佳
SEO 优化 搜索引擎爬虫能抓取完整 HTML,提升流量
支持动态内容 可根据用户请求返回个性化内容(登录状态、推荐列表)
用户体验佳 页面不会出现"白屏"或闪烁,降低用户流失

SSR缺点?缺点没有

什么时候需要 SSR?

  • 资讯类、商城、博客、官网等依赖搜索引擎流量的页面
  • 需要更好首屏性能和用户体验
  • 页面内容经常变化,需要个性化展示

什么时候不需要 SSR?

  • 管理后台、内部系统(SEO 不重要)
  • 简单静态展示页,可用 SSG 或 CDN 缓存

⚙️ Next.js 13+ SSR 实战

我当前有一个分享页面,需要渲染接口返回的动态内容,同时搜索引擎要能抓取 标题、描述、图片,所以我们必须用 SSR。

关键点:generateMetadata

在 Next.js 13+ App Router 模式下,每个 page.tsxlayout.tsx 可以导出一个 generateMetadata 方法,用于生成页面 <head> 元信息,等价于自己写 <Head>

typescript 复制代码
export async function generateMetadata(
  props: { params: Record<string, string>, searchParams: Record<string, string> }
): Promise<Metadata> {
  // 可以在这里请求接口、处理数据
  return {
    title: "页面标题",
    description: "页面描述",
    openGraph: {
      title: "OG 标题",
      description: "OG 描述",
      images: ["https://example.com/cover.png"],
    },
  };
}

1️⃣ 服务端 SSR 分享页面示例

javascript 复制代码
import ShareClient from "./ShareClient";
import { Metadata } from "next";
import { CDN } from "@/utils/env";
import { getWebContent } from "@/store/share/shareAPI";
import Base64 from "base-64";

interface ShareParams {
  searchParams?: Promise<{ u?: string }>;
}

export async function generateMetadata({ searchParams }: ShareParams): Promise<Metadata> {
  try {
    const u = (await searchParams)?.u;
    const decodedStr = Base64.decode(u || "");
    const obj = JSON.parse(decodedStr);
    const content = await getWebContent(obj);

    return {
      title: content?.data?.title,
      description: content?.data?.descrble,
      icons: {
        icon: `${CDN}images/logo.svg`,
        shortcut: `${CDN}images/logo.svg`,
        apple: `${CDN}images/logo.svg`,
        other: {
          rel: "apple-touch-icon-precomposed",
          url: `${CDN}images/logo.svg`,
        },
      },
      openGraph: {
        title: content?.data?.title,
        description: content?.data?.descrble,
        url: `${CDN}images/logo.svg`,
        siteName: "HAHAHUB",
        images: [
          { url: content?.data?.cover_url },
        ],
      },
    };
  } catch {
    return {};
  }
}

export default function Page() {
  return <ShareClient />;
}

💡 说明:

  • 前端 ShareClient 组件就是正常的 H5 页面,无需关心SSR
  • 从app分享出来的地址,searchParams.u 是 Base64 加密参数,需要先解密app分享参数再请求接口
  • 服务器返回 HTML 就包含了标题、描述、封面等信息,SEO 完美支持

我的分享链接:

我的分享页面:


🔧 生产环境注意事项

SSR 服务依赖 Node.js 运行,但 Node 本身不稳定,生产环境推荐使用 PM2 守护:

ecosystem.config.js

yaml 复制代码
module.exports = {
  apps: [
    {
      name: "nextjs-app",
      script: "node_modules/next/dist/bin/next",
      args: "start -p 3000",
      cwd: "./",
      instances: "max",
      exec_mode: "cluster",
      watch: false,
      autorestart: true,
      max_memory_restart: "1G",
      env: {
        NODE_ENV: "production",
      },
    },
  ],
};

启动:

arduino 复制代码
pm2 start ecosystem.config.js

🔚 总结

关键点 描述
SSR 适用场景 高实时性内容、动态内容、SEO 需求强的页面
SSR 优点 首屏快、SEO 好、支持动态内容、用户体验佳
SSR 不适用场景 后台管理系统、静态展示页
Next.js 提供的功能 generateMetadata 生成动态 <meta>,自动 SSR Hydration

💡 小贴士:SSR 能让页面首屏秒开,搜索引擎抓取无压力,分享页面、资讯页、商城首页都非常适合。生产环境记得配 PM2 或其他守护工具,稳稳的。

相关推荐
IT_陈寒16 分钟前
「Redis性能翻倍的5个核心优化策略:从数据结构选择到持久化配置全解析」
前端·人工智能·后端
Never_Satisfied18 分钟前
在JavaScript / HTML中,转移字符导致js生成的html出错
开发语言·javascript·html
weixin_4469388722 分钟前
uniapp vue-i18n如何使用
前端·vue.js·uni-app
知识分享小能手35 分钟前
微信小程序入门学习教程,从入门到精通,WXS语法详解(10)
前端·javascript·学习·微信小程序·小程序·vue·团队开发
excel37 分钟前
Vue 组件与插件的区别详解
前端
JarvanMo2 小时前
Flutter 开发:应用颜色使用 Class 还是 Enum?—— 你应该选择哪一个?
前端
HBR666_2 小时前
AI编辑器(二) ---调用模型的fim功能
前端·ai·编辑器·fim·tiptap
csgo打的菜又爱玩5 小时前
Vue 基础(实战模板与命名指南)
前端·javascript·vue.js
ding_zhikai6 小时前
SD:在一个 Ubuntu 系统安装 stable diffusion Web UI
前端·ubuntu·stable diffusion
gerrgwg7 小时前
Vue-library-start,一个基于Vite的vue组件库开发模板
前端·javascript·vue.js