Next.js 14.2.13字体无法应用问题求助
Next.js 14.2.13 Google Fonts 配置问题解决方案
问题1:page.tsx 中使用 montserrat.className 字体未生效
排查与修复步骤
检查
fonts.ts定义是否规范
必须为字体声明variable属性,这是注入全局CSS变量和确保类名生效的关键:// ./app/fonts.ts import { Montserrat, Open_Sans } from 'next/font/google'; export const montserrat = Montserrat({ subsets: ['latin'], variable: '--font-montserrat', // 必须定义该字段 weight: ['400', '700'] // 按需指定字重,可选 }); export const openSans = Open_Sans({ subsets: ['latin'], variable: '--font-open-sans', });修正
layout.tsx的body类名引用
需将字体的variable类添加到body,而非直接用className,这样才能全局注入CSS变量,同时单个元素的className才能生效:// ./app/layout.tsx import { montserrat, openSans } from './fonts'; import './globals.css'; export default function RootLayout({ children }: { children: React.ReactNode }) { return ( <html lang="en"> <body className={`${montserrat.variable} ${openSans.variable}`}> {children} </body> </html> ); }验证
page.tsx的使用方式
确保正确导入并使用字体类名:// ./app/page.tsx import { montserrat } from './fonts'; export default function Home() { return ( <main> <h1 className={montserrat.className}>This text uses Montserrat</h1> </main> ); }
问题2:全局样式 globals.css 中字体CSS变量报错(ESLint警告+浏览器提示未定义)
排查与修复步骤
确保CSS变量已全局注入
先确认fonts.ts已定义variable属性,且layout.tsx的body上已添加对应variable类(参考问题1的配置),这是变量能被全局访问的前提。解决ESLint警告
可以通过两种方式处理:- 在使用变量的CSS代码上方添加注释忽略警告:
/* eslint-disable-next-line no-undef */ body { font-family: var(--font-montserrat), sans-serif; } - 在项目根目录的
.eslintrc.json中全局关闭相关规则:{ "rules": { "no-undef": "off" } }
- 在使用变量的CSS代码上方添加注释忽略警告:
适配Tailwind CSS(若使用)
若项目依赖Tailwind,需在tailwind.config.ts中扩展字体族,确保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}', ], theme: { extend: { fontFamily: { montserrat: ['var(--font-montserrat)', 'sans-serif'], opensans: ['var(--font-open-sans)', 'sans-serif'], }, }, }, plugins: [], }; export default config;
额外检查项
确认 tsconfig.json 的路径配置正确,避免因导入路径错误导致字体未加载:
{ "compilerOptions": { // 其他配置... "paths": { "@/*": ["./*"] } }, "include": ["next-env.d.ts", "**/*.ts", "**/*.tsx", ".next/types/**/*.ts"], "exclude": ["node_modules"] }
内容的提问来源于stack exchange,提问作者Yonatan Alon
相关产品推荐
相关产品推荐

