You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

为何Next.js显示<template>标签而非组件?如何实现SSR直接渲染HTML?

Next.js显示<template data-dgst="NEXT_DYNAMIC_NO_SSR_CODE">的原因及SSR渲染解决方案

问题原因

你代码里的getServerData()是标记了"use server"的异步函数,在Next.js中,服务器组件直接调用带use server的函数会触发动态渲染降级——Next.js会判定该页面无法在服务器端完成完整渲染,于是用<template>标签占位,等客户端 hydration 阶段再执行组件渲染。

本质是use server标记的函数默认在服务器的请求处理阶段执行,而非SSR的页面渲染阶段,导致服务器无法提前生成完整HTML,只能用占位符替代。

实现SSR直接渲染HTML的方法

方法一:移除use server,用服务器组件原生异步获取数据

服务器组件本身支持顶层await,无需use server标记即可实现服务器端数据获取,调整代码如下:

export default async function FooPage() {
  // 直接编写服务器端数据获取逻辑
  const res = await fetch('你的API地址', { cache: 'force-cache' });
  const data = await res.json();

  return <div>Foo</div>;
}

这样Next.js会在SSR阶段完成数据获取和HTML渲染,不会生成占位标签。

方法二:Pages Router下使用getServerSideProps

如果你的页面在pages/目录下,改用getServerSideProps来获取数据:

export async function getServerSideProps() {
  const { data } = await getServerData();
  return { props: { data } };
}

export default function FooPage({ data }) {
  return <div>Foo</div>;
}

getServerSideProps会在SSR阶段执行数据获取,确保服务器能生成完整HTML返回。

方法三:保留use server但调整调用方式

若必须保留getServerData()的use server标记,需确保它在服务器组件的顶层直接调用,且不要在客户端组件中作为回调使用。同时确认使用的是App Router的稳定版本,避免版本兼容问题。


内容的提问来源于stack exchange,提问作者Yanick Rochon

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.01 09:13:26