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

Next.js v13中如何正确使用@next/font配置两款Google字体?

关于Next.js v13 @next/font搭配TailwindCSS使用双字体的问题解答

一、为什么未使用header变量仍会下载Alegreya Sans字体?

@next/font的核心运行逻辑是:只要调用了字体导出的函数(比如Alegreya_Sans({...})),Next.js就会自动触发字体加载流程——它会生成对应的@font-face CSS规则,默认将字体文件自托管,也可配置从Google Fonts请求,随后把这些CSS注入到页面中。这个过程和你是否使用函数返回的变量(比如header)无关,函数执行本身就会触发字体加载。

二、能不能不声明变量直接调用字体函数?

可以,但不推荐。直接执行Alegreya_Sans({ subsets: ["latin"], weight: "500" })确实能触发字体加载,但这样你就无法获取函数返回的className或variable属性,没法利用@next/font提供的灵活样式控制(比如通过CSS变量统一管理字体),后续维护也不够清晰。

三、当前配置的优化建议(双字体最优方案)

你现在的配置能运行,但没有完全利用@next/font的字体优化能力(比如预加载、避免无样式文本闪烁),且样式管理不够统一。推荐调整为以下方案:

1. 修改layout.tsx:给标题字体添加CSS变量

import { Alegreya_Sans, PT_Sans } from "@next/font/google";
import "../styles/globals.css";

// 标题字体:添加variable参数
const headerFont = Alegreya_Sans({
  subsets: ["latin"],
  weight: "500",
  variable: "--font-header",
});

// 正文字体保持原有配置
const bodyFont = PT_Sans({
  subsets: ["latin"],
  weight: "400",
  variable: "--font-body",
});

export default function RootLayout({
  children,
}: {
  children: React.ReactNode;
}) {
  return (
    <html lang="en-us" className={`${headerFont.variable} ${bodyFont.variable}`}>
      <head />
      <body className="font-body">
        {children}
      </body>
    </html>
  );
}

2. 修改tailwind.config.js:扩展标题字体的Tailwind配置

const defaultTheme = require("tailwindcss/defaultTheme");

/** @type {import('tailwindcss').Config} */
module.exports = {
  content: [
    "./src/app/**/*.{js,ts,jsx,tsx}",
    "./src/pages/**/*.{js,ts,jsx,tsx}",
    "./src/components/**/*.{js,ts,jsx,tsx}",
  ],
  theme: {
    extend: {
      fontFamily: {
        body: ["var(--font-body)", ...defaultTheme.fontFamily.sans],
        header: ["var(--font-header)", ...defaultTheme.fontFamily.sans],
      },
    },
  },
  plugins: [],
};

3. 修改globals.css:用Tailwind的字体变量统一设置标题样式

@tailwind base;
@tailwind components;
@tailwind utilities;

@layer base {
  h1,
  h2,
  h3,
  h4,
  h5,
  h6 {
    font-family: var(--font-header);
    font-weight: 500;
    /* 或者直接用Tailwind类:@apply font-header font-medium; */
  }
}

方案优势:

  • 完全利用@next/font的优化:自动预加载字体、自托管字体文件(避免第三方依赖延迟)、自动处理字体格式兼容性
  • 样式管理统一:通过CSS变量和Tailwind配置绑定,字体变更只需修改一处
  • 代码逻辑清晰:所有字体变量都被明确使用,避免无意义的资源加载疑惑

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.05 02:50:33