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

Next.js最新App Router字体消失问题求助

Next.js App Router 字体消失问题解决方案

问题根源

你在App Router中同时定义了根布局(app/layout.tsx)和菜单页布局(如app/menu/layout.tsx),两个布局都渲染了<html>和<body>标签。通过客户端路由切换页面时,这种重复定义会导致<body>上的字体变量className被覆盖或丢失,最终引发字体失效。

修复步骤

1. 保留根布局作为全局入口

根布局app/layout.tsx是App Router的全局布局,所有页面都会继承它,只需在这里统一配置字体变量、全局样式和基础标签:

// app/layout.tsx
import type { Metadata } from "next";
import "./globals.css";
import { kaushanVar, robotoVar } from "@/utils/fonts";

export const metadata: Metadata = {
  title: "Leaf Llama",
  description: "Lettuce eat!",
};

export default function RootLayout({
  children,
}: Readonly<{
  children: React.ReactNode;
}>) {
  return (
    <html lang="en">
      <body className={`${robotoVar} ${kaushanVar}`}>
        {children}
      </body>
    </html>
  );
}

2. 修改菜单页布局为嵌套布局

菜单页的布局不需要重新定义<html>和<body>,只需作为嵌套布局添加Navbar等局部内容:

// app/menu/layout.tsx
import Navbar from "@/components/Navbar";

export default function MenuLayout({
  children,
}: Readonly<{
  children: React.ReactNode;
}>) {
  return (
    <>
      <Navbar />
      {children}
    </>
  );
}

3. 确认Tailwind配置不变

你的Tailwind配置已经正确关联了字体变量,无需修改:

// tailwind.config.ts
import type { Config } from "tailwindcss";

const config: Config = {
  content: [
    "./pages/**/*.{js,ts,jsx,tsx,mdx}",
    "./components/**/*.{js,ts,jsx,tsx,mdx}",
    "./app/**/*.{js,ts,jsx,tsx,mdx}",
  ],
  mode: 'jit',
  theme: {
    extend: {
      fontFamily: {
        'roboto': ['var(--font-roboto)'],
        'kaushan': ['var(--font-kaushan)']
      },
    },
  },
  plugins: [],
};
export default config;

原理说明

App Router的布局是嵌套继承的:根布局提供最外层的<html>和<body>,子目录的布局只负责包裹该目录下的页面内容,不会覆盖根布局的基础标签。这样字体变量会始终存在于<body>上,无论页面如何切换都不会丢失。

内容的提问来源于stack exchange,提问作者donut king

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.16 11:21:20