Turbo Monorepo中Next.js项目共享字体报404的解决方法咨询
Turbo Monorepo 下共享 Next.js 项目字体的解决方案
问题根源
Next.js 默认仅将自身项目根目录下的 public 文件夹视为静态资源目录,packages 目录下的自定义 public 文件夹不会被自动识别,导致组件库引用时出现 404 错误。
方案一:构建脚本同步字体到各项目 public 目录
这种方式直接利用 Next.js 原生的静态资源机制,适配性最强:
- 调整目录结构:在
packages下新建shared-assets包(替代原packages/public),内部创建fonts文件夹存放.woff字体文件。 - 添加同步脚本:在
shared-assets/package.json中添加复制脚本(需先安装依赖:npm install copyfiles -D):"scripts": { "copy-fonts": "copyfiles -u 2 packages/shared-assets/fonts/* apps/*/public/fonts/" } - 配置 Turbo 流水线:在项目根目录的
turbo.json中,让各 Next.js 项目的构建任务依赖同步脚本:{ "$schema": "https://turbo.build/schema.json", "pipeline": { "copy-fonts": { "outputs": [] }, "build": { "dependsOn": ["^copy-fonts"], "outputs": ["dist/**", ".next/**"] } } } - 组件库引用字体:直接使用相对项目 public 目录的路径:
@font-face { font-family: 'CustomFont'; src: url('/fonts/your-font.woff') format('woff'); font-weight: normal; }
方案二:Next.js 重写规则映射共享字体路径
通过配置 Next.js 的重写规则,让项目直接识别共享目录的字体资源:
- 整理共享字体目录:将字体统一放在
packages/shared-assets/fonts下。 - 修改各项目的 next.config.js:添加重写规则,将
/fonts/*请求映射到共享目录:/** @type {import('next').NextConfig} */ const nextConfig = { async rewrites() { return [ { source: '/fonts/:path*', destination: '../../packages/shared-assets/fonts/:path*', }, ]; }, }; module.exports = nextConfig; - 组件库引用方式:和方案一一致,使用
/fonts/your-font.woff路径即可。
方案三:将字体作为模块导入(Next.js 12+ 支持)
利用 Next.js 的资源导入能力,把字体当作模块导入使用:
- 在共享包导出字体:在
packages/shared-assets/src/fonts下存放字体,创建index.js导出资源:export const CustomFontRegular = require('./regular.woff'); export const CustomFontBold = require('./bold.woff'); - 组件库中导入并使用:安装
shared-assets包后,在样式文件中通过导入的变量引用字体:@font-face { font-family: 'CustomFont'; src: url(${CustomFontRegular}) format('woff'); font-weight: normal; } - 优势:无需手动同步目录,Next.js 会自动将字体打包到静态资源目录,避免路径问题。
内容的提问来源于stack exchange,提问作者kyun
相关产品推荐
相关产品推荐

