Skip to main content
doc0blade47/next.jsdocumentation home
Sign in

Font Optimization

Last updated Oct 12, 2026
Relevant source files

The following files were used as context for generating this wiki page:

Overview

The font optimization subsystem in Next.js automatically self-hosts Google Fonts and local font files at build time to eliminate external network requests, enhance privacy, and optimize performance. By integrating directly into the build pipeline via custom loaders and PostCSS plugins, Next.js transforms declarative font function calls into optimized local @font-face declarations, injects scoped class names, computes layout-shift fallback metrics, and records route-specific font mappings for asset preloading.

Sources: packages/font/src/google/loader.ts:28-162, packages/font/src/local/loader.ts:15-112, packages/next/src/build/webpack/loaders/next-font-loader/index.ts:9-168, packages/next/src/build/webpack/loaders/next-font-loader/postcss-next-font.ts:21-188, packages/next/src/build/webpack/plugins/next-font-manifest-plugin.ts:55-178

Webpack Loader Pipeline Integration

Virtual Target CSS and Transformation Flow

The SWC transform plugin (next-transform-font) converts font function declarations such as Inter({ subset: ['latin'] }) into explicit CSS imports terminating in virtual target CSS files carrying a serialised JSON resource query. For instance, an Inter call becomes an import from next/font/google/target.css?{"import":"Inter","subsets":["latin"]}. This query string supplies the target font loader with the function name, call arguments, file path, and assigned variable name.

Sources: packages/next/src/build/webpack/loaders/next-font-loader/index.ts:16-30, packages/next/src/build/webpack/config/blocks/css/loaders/next-font.ts:13-69

Caution

Using font optimization functions inside pages/_document.js triggers an explicit NextFontError and halts compilation. next-font-loader inspects the originating file path for pages/_document. and aborts before invoking font generation.

Sources: packages/next/src/build/webpack/loaders/next-font-loader/index.ts:32-46

Loader Configuration Options and Pipeline Architecture

The next font loader pipeline pairs two primary Webpack loaders executed in sequence: css-loader configured with custom module rules, followed by next-font-loader. Client builds also prepend a client-side style loader.

Option KeyTarget LoaderValue / BehaviorPurpose
importLoaderscss-loader1Forces css-loader to process imported stylesheets through subsequent loaders (i.e. next-font-loader).
esModulecss-loaderfalseEnables CommonJS export mode for backwards compatibility.
exportLocalsConventioncss-loader'asIs'Prevents transformation of CSS module class names.
exportOnlyLocalscss-loaderctx.isServerDisables CSS emission on server-side renders, outputting local export mappings exclusively.
modecss-loader'pure'Disallows global style exports to enable isolated CSS code-splitting without load-order concerns.
getLocalIdentcss-loaderCustom function returning __${exportName}_${meta.fontFamilyHash}Generates scoped, unguessable identifiers using the hash computed from font CSS content.
fontLoadercss-loadertrueSignals css-loader to expose font exports directly from metadata.

Sources: packages/next/src/build/webpack/config/blocks/css/loaders/next-font.ts:13-69

During execution, next-font-loader parses the resource query, loads either next/font/google or next/font/local via fontLoaderPath, and supplies an emitFontFile helper. Font assets are interpolated into static/media/[hash][selector-modifiers].[ext], where -s denotes size-adjust fallback font usage and .p indicates preloaded assets. Only client builds emit these files via this.emitFile, while both client and server receive the resulting asset URL paths with deployment IDs. Finally, the loader processes the generated CSS through PostCSS using postcssNextFontPlugin and passes the resulting PostCSS AST, fallback exports, and a 6-character SHA1 fontFamilyHash back to css-loader via the loader meta argument.

Sources: packages/next/src/build/webpack/loaders/next-font-loader/index.ts:25-165, packages/next/src/build/webpack/loaders/css-loader/src/index.ts:177-179

Google Fonts Ingestion and Downloading

Font Loader Execution and Caching Architecture

The Google font loading pipeline orchestrates validation, URL generation, asset downloading, and CSS rewriting inside nextFontGoogleFontLoader. Function arguments are validated via validateGoogleFontFunctionCall, after which getFontAxes and getGoogleFontsUrl construct the Google Fonts stylesheet request URL. Memory caching is maintained using module-scoped cssCache and fontCache maps keyed by URL strings to prevent redundant network fetches across separate client and server compiler passes.

const nextFontGoogleFontLoader: FontLoader = async ({
  functionName,
  data,
  emitFontFile,
  isDev,
  isServer,
}) => {
  const {
    fontFamily,
    weights,
    styles,
    display,
    preload,
    selectedVariableAxes,
    fallback,
    adjustFontFallback,
    variable,
    subsets,
  } = validateGoogleFontFunctionCall(functionName, data[0])
 
  // Validate and get the font axes required to generated the URL
  const fontAxes = getFontAxes(
    fontFamily,
    weights,
    styles,
    selectedVariableAxes
  )
 
  // Generate the Google Fonts URL from the font family, axes and display value
  const url = getGoogleFontsUrl(fontFamily, fontAxes, display)
 
  // Get precalculated fallback font metrics, used to generate the fallback font CSS
  const adjustFontFallbackMetrics: AdjustFontFallback | undefined =
    adjustFontFallback ? getFallbackFontOverrideMetrics(fontFamily) : undefined
 
  const result = {
    fallbackFonts: fallback,
    weight:
      weights.length === 1 && weights[0] !== 'variable'
        ? weights[0]
        : undefined,
    style: styles.length === 1 ? styles[0] : undefined,
    variable,
    adjustFontFallback: adjustFontFallbackMetrics,
  }
 
  try {
    /**
     * Hacky way to make sure the fetch is only done once.
     * Otherwise both the client and server compiler would fetch the CSS.
     * The reason we need to return the actual CSS from both the server and client is because a hash is generated based on the CSS content.
     */
    const hasCachedCSS = cssCache.has(url)
    // Fetch CSS from Google Fonts or get it from the cache
    let fontFaceDeclarations = hasCachedCSS
      ? cssCache.get(url)
      : await fetchCSSFromGoogleFonts(url, fontFamily, isDev).catch((err) => {
          console.error(err)
          return null
        })
    if (!hasCachedCSS) {
      cssCache.set(url, fontFaceDeclarations ?? null)
    } else {
      cssCache.delete(url)
    }
    if (fontFaceDeclarations == null) {
      nextFontError(`Failed to fetch \`${fontFamily}\` from Google Fonts.`)
    }
 

Sources: packages/font/src/google/loader.ts:28-96

Note

cssCache entries are deleted upon their second access to clear transient cache references after both server and client compiler passes have retrieved the generated stylesheet content.

Sources: packages/font/src/google/loader.ts:80-92

Asset Fetching, Retries, and Mocking

Stylesheet and font binary retrievals are handled through fetchCSSFromGoogleFonts and fetchFontFile, both of which wrap network requests in a 3-attempt retry helper function and rely on fetchResource. When the environment variable NEXT_FONT_GOOGLE_MOCKED_RESPONSES is populated, network calls are bypassed entirely to read test mocks from disk or memory.

import { nextFontError } from '../next-font-error'
import { fetchResource } from './fetch-resource'
import { retry } from './retry'
 
/**
 * Fetches the CSS containing the @font-face declarations from Google Fonts.
 * The fetch has a user agent header with a modern browser to ensure we'll get .woff2 files.
 *
 * The env variable NEXT_FONT_GOOGLE_MOCKED_RESPONSES may be set containing a path to mocked data.
 * It's used to define mocked data to avoid hitting the Google Fonts API during tests.
 */
export async function fetchCSSFromGoogleFonts(
  url: string,
  fontFamily: string,
  isDev: boolean
): Promise<string> {
  if (process.env.NEXT_FONT_GOOGLE_MOCKED_RESPONSES) {
    const mockFile = require(process.env.NEXT_FONT_GOOGLE_MOCKED_RESPONSES)
    const mockedResponse = mockFile[url]
    if (!mockedResponse) {
      nextFontError('Missing mocked response for URL: ' + url)
    }
    return mockedResponse
  }
 
  const buffer = await retry(async () => {
    return fetchResource(
      url,
      isDev,
      `Failed to fetch font \`${fontFamily}\`: ${url}\n` +
        `Please check your network connection.`
    )
  }, 3)
 
  return buffer.toString('utf8')
}

Sources: packages/font/src/google/fetch-css-from-google-fonts.ts:1-36

import fs from 'node:fs'
import { retry } from './retry'
import { fetchResource } from './fetch-resource'
 
/**
 * Fetches a font file and returns its contents as a Buffer.
 * If NEXT_FONT_GOOGLE_MOCKED_RESPONSES is set, we handle mock data logic.
 */
export async function fetchFontFile(url: string, isDev: boolean) {
  if (process.env.NEXT_FONT_GOOGLE_MOCKED_RESPONSES) {
    if (url.startsWith('/')) {
      return fs.readFileSync(url)
    }
    return Buffer.from(url)
  }
 
  return await retry(async () => {
    return fetchResource(
      url,
      isDev,
      `Failed to fetch font file from \`${url}\`.`
    )
  }, 3)
}

Sources: packages/font/src/google/fetch-font-file.ts:1-24

Warning

In development mode (isDev), network failures during font asset downloading do not throw fatal compilation errors; instead, the loader catches the error and emits a fallback font CSS declaration using local metric overrides.

Sources: packages/font/src/google/loader.ts:163-193

File Emission and CSS Rewriting

Once the @font-face CSS declarations are fetched, findFontFilesInCss parses the source to locate individual font assets. Each asset is downloaded, filtered for valid extensions matching /\.(woff|woff2|eot|ttf|otf)$/, and emitted via emitFontFile into .next/static/media. Finally, remote Google Fonts asset URLs inside the @font-face rules are replaced with self-hosted static asset paths.

// CSS Variables may be set on a body tag, ignore them to keep the CSS module pure
fontFaceDeclarations = fontFaceDeclarations.split('body {', 1)[0]
 
// Find font files to download, provide the array of subsets we want to preload if preloading is enabled
const fontFiles = findFontFilesInCss(
  fontFaceDeclarations,
  preload ? subsets : undefined
)
 
// Download the font files extracted from the CSS
const downloadedFiles = await Promise.all(
  fontFiles.map(async ({ googleFontFileUrl, preloadFontFile }) => {
    const hasCachedFont = fontCache.has(googleFontFileUrl)
    // Download the font file or get it from cache
    const fontFileBuffer = hasCachedFont
      ? fontCache.get(googleFontFileUrl)
      : await fetchFontFile(googleFontFileUrl, isDev).catch((err) => {
          console.error(err)
          return null
        })
    if (!hasCachedFont) {
      fontCache.set(googleFontFileUrl, fontFileBuffer ?? null)
    } else {
      fontCache.delete(googleFontFileUrl)
    }
    if (fontFileBuffer == null) {
      nextFontError(`Failed to fetch \`${fontFamily}\` from Google Fonts.`)
    }
 
    const ext = /\.(woff|woff2|eot|ttf|otf)$/.exec(googleFontFileUrl)![1]
    // Emit font file to .next/static/media
    const selfHostedFileUrl = emitFontFile(
      fontFileBuffer,
      ext,
      preloadFontFile,
      !!adjustFontFallbackMetrics
    )
 
    return {
      googleFontFileUrl,
      selfHostedFileUrl,
    }
  })
)
 
/**
 * Replace the @font-face sources with the self-hosted files we just downloaded to .next/static/media
 *
 * E.g.
 * @font-face {
 *   font-family: 'Inter';
 *   src: url(https://fonts.gstatic.com/...) -> url(/_next/static/media/_.woff2)
 * }
 */
let updatedCssResponse = fontFaceDeclarations
for (const { googleFontFileUrl, selfHostedFileUrl } of downloadedFiles) {
  updatedCssResponse = updatedCssResponse.replace(
    new RegExp(escapeStringRegexp(googleFontFileUrl), 'g'),
    selfHostedFileUrl
  )
}
 
return {
  ...result,
  css: updatedCssResponse,
}

Sources: packages/font/src/google/loader.ts:97-162

Google Font Fallback Metric Overrides

Fallback Metric Calculation Pipeline

When adjustFontFallback is requested for a Google font, nextFontGoogleFontLoader invokes getFallbackFontOverrideMetrics to compute size adjustments and override percentages based on capsize-font-metrics.json. The calculation sequence flows through specific transformation functions in exact call order: nextFontGoogleFontLoader invokes getFallbackFontOverrideMetrics, which calls calculateSizeAdjustValues, which subsequently executes formatName to normalize the font family lookup key and finishes by executing formatOverrideValue to serialize the computed metrics.

  1. nextFontGoogleFontLoader calls getFallbackFontOverrideMetrics with the font family name. Sources: packages/font/src/google/loader.ts:60-61
  2. getFallbackFontOverrideMetrics delegates calculation to calculateSizeAdjustValues. Sources: packages/font/src/google/get-fallback-font-override-metrics.ts:13-16
  3. calculateSizeAdjustValues runs formatName to normalize the font family lookup key. Sources: packages/next/src/server/font-utils.ts:19-20
  4. calculateSizeAdjustValues finishes by executing formatOverrideValue to serialize the computed metrics. Sources: packages/next/src/server/font-utils.ts:33-42

Note

If metric calculation throws an error due to missing font data, getFallbackFontOverrideMetrics catches the exception and logs an error without halting compilation. Sources: packages/font/src/google/get-fallback-font-override-metrics.ts:24-26

Metric Transformation Functions and Output Types

The utility functions in font-utils.ts normalize font family strings and compute proportionate fallback metric values against standard system fonts. The resulting structure supplies property definitions for ascent, descent, line gap, and size adjustments.

function formatName(str: string): string {
  return str
    .replace(/(?:^\w|[A-Z]|\b\w)/g, function (word, index) {
      return index === 0 ? word.toLowerCase() : word.toUpperCase()
    })
    .replace(/\s+/g, '')
}
 
function formatOverrideValue(val: number) {
  return Math.abs(val * 100).toFixed(2)
}

Sources: packages/next/src/server/font-utils.ts:7-17

export type AdjustFontFallback = {
  fallbackFont: string
  ascentOverride?: string
  descentOverride?: string
  lineGapOverride?: string
  sizeAdjust?: string
}

Sources: packages/next/font/index.d.ts:1-7

Property NameType / FormatDescription
fallbackFontstringThe default fallback family (DEFAULT_SERIF_FONT or DEFAULT_SANS_SERIF_FONT).
ascentOverridestring (percentage)Normalized ascent metric scaled by size adjustment.
descentOverridestring (percentage)Normalized descent metric scaled by size adjustment.
lineGapOverridestring (percentage)Normalized line gap metric scaled by size adjustment.
sizestring (percentage)Computed size-adjust percentage comparing average character widths.

Sources: packages/next/src/server/font-utils.ts:33-42, packages/next/font/index.d.ts:1-7

Important

formatOverrideValue multiplies values by 100 and fixes them to two decimal places to match CSS percentage descriptors required by @font-face metric override rules. Sources: packages/next/src/server/font-utils.ts:15-17

Local Font Binary Metric Extraction

Selecting Representative Local Font Files

When a local font configuration defines multiple font source files with varying weights and styles, pickFontFileForFallbackGeneration evaluates the array to select a single representative binary for automatic fallback metric extraction. The selection heuristic assumes that the bulk of page text uses normal weight (400) and normal style. It computes the numeric weight distance from normal using getDistanceFromNormalWeight, which parses standard CSS keywords or variable font weight ranges specified as two space-separated numbers. If two font files share the exact absolute distance from normal weight, the thinner font file is preferred.

Sources: packages/font/src/local/pick-font-file-for-fallback-generation.ts:10-57, packages/font/src/local/pick-font-file-for-fallback-generation.ts:68-103

Warning

If a variable font weight range is invalid and cannot be parsed into numbers, nextFontError halts execution with an explicit error message specifying expected formats. Sources: packages/font/src/local/pick-font-file-for-fallback-generation.ts:31-36

Extracting Size-Adjust Metrics via Fontkit

Once a representative font file binary is loaded into memory, nextFontLocalFontLoader passes the fileBuffer to fontFromBuffer from fontkit. If metadata parsing succeeds, getFallbackMetricsFromFontFile computes proportional fallback parameters by evaluating the average character width across a Latin reference string (aaabcdeeeefghiijklmnnoopqrrssttuvwxyz ) against system fallback baselines.

const DEFAULT_SANS_SERIF_FONT = {
  name: 'Arial',
  azAvgWidth: 934.5116279069767,
  unitsPerEm: 2048,
}
const DEFAULT_SERIF_FONT = {
  name: 'Times New Roman',
  azAvgWidth: 854.3953488372093,
  unitsPerEm: 2048,
}

Sources: packages/font/src/local/get-fallback-metrics-from-font-file.ts:6-15

Fallback Font ConstantTarget NameAverage Width (azAvgWidth)Units Per Em
DEFAULT_SANS_SERIF_FONTArial934.51162790697672048
DEFAULT_SERIF_FONTTimes New Roman854.39534883720932048

Sources: packages/font/src/local/get-fallback-metrics-from-font-file.ts:6-15

Caution

If the loaded font file lacks any code points required by the reference character string, calcAverageWidth aborts metric extraction and returns undefined, skipping automatic size-adjust generation for that font family. Sources: packages/font/src/local/get-fallback-metrics-from-font-file.ts:35-41

PostCSS Font Face Transformation

Family Name Normalization and Hashing

The PostCSS plugin processes incoming @font-face rules by iterating through the AST nodes, extracting the font-family declaration, and removing quote characters using normalizeFamily before formatting them with single quotes. It derives an unguessable family name from the CSS content using loaderUtils.getHashDigest with SHA-1 truncated to 6 hex characters. If no @font-face rule with a font-family declaration is encountered, postcssNextFontPlugin throws an error.

Once(root: any) {
  let fontFamily: string | undefined
 
  const normalizeFamily = (family: string) => {
    return family.replace(/['"]/g, '')
  }
 
  const formatFamily = (family: string) => {
    return `'${family}'`
  }
 
  // Hash font-family names
  for (const node of root.nodes) {
    if (node.type === 'atrule' && node.name === 'font-face') {
      const familyNode = node.nodes.find(
        (decl: Declaration) => decl.prop === 'font-family'
      )
      if (!familyNode) {
        continue
      }
 
      if (!fontFamily) {
        fontFamily = normalizeFamily(familyNode.value)
      }
 
      familyNode.value = formatFamily(fontFamily)
    }
  }
 
  if (!fontFamily) {
    throw new Error("Font loaders must return one or more @font-face's")
  }

Sources: packages/next/src/build/webpack/loaders/next-font-loader/postcss-next-font.ts:38-69

Warning

Font loaders must return one or more valid @font-face blocks containing a font-family property, or the transformation will fail with a NextFontError. Sources: packages/next/src/build/webpack/loaders/next-font-loader/postcss-next-font.ts:67-69

Fallback Declaration and Rule Generation

When adjustFontFallback metrics are provided, the plugin generates an additional fallback @font-face block referencing a local system font and overrides. It also creates .className and .variable rules containing the complete font family stack, weight, and style descriptors unless they represent ranges.

// Add fallback @font-face with the provided override values
let adjustFontFallbackFamily: string | undefined
if (adjustFontFallback) {
  adjustFontFallbackFamily = formatFamily(`${fontFamily} Fallback`)
  const fallbackFontFace = postcss.atRule({ name: 'font-face' })
  const {
    fallbackFont,
    ascentOverride,
    descentOverride,
    lineGapOverride,
    sizeAdjust,
  } = adjustFontFallback
  fallbackFontFace.nodes = [
    new postcss.Declaration({
      prop: 'font-family',
      value: adjustFontFallbackFamily,
    }),
    new postcss.Declaration({
      prop: 'src',
      value: `local("${fallbackFont}")`,
    }),
    ...(ascentOverride
      ? [
          new postcss.Declaration({
            prop: 'ascent-override',
            value: ascentOverride,
          }),
        ]
      : []),
    ...(descentOverride
      ? [
          new postcss.Declaration({
            prop: 'descent-override',
            value: descentOverride,
          }),
        ]
      : []),
    ...(lineGapOverride
      ? [
          new postcss.Declaration({
            prop: 'line-gap-override',
            value: lineGapOverride,
          }),
        ]
      : []),
    ...(sizeAdjust
      ? [
          new postcss.Declaration({
            prop: 'size-adjust',
            value: sizeAdjust,
          }),
        ]
      : []),
  ]
  root.nodes.push(fallbackFontFace)
}

Sources: packages/next/src/build/webpack/loaders/next-font-loader/postcss-next-font.ts:71-126

At-Rule / Rule PropertyTarget AST PropertySource Configuration Field
font-familyadjustFontFallbackFamilyadjustFontFallback
srclocal("${fallbackFont}")adjustFontFallback.fallbackFont
ascent-overrideascentOverrideadjustFontFallback.ascentOverride
descent-overridedescentOverrideadjustFontFallback.descentOverride
line-gap-overridelineGapOverrideadjustFontFallback.lineGapOverride
size-adjustsizeAdjustadjustFontFallback.sizeAdjust

Sources: packages/next/src/build/webpack/loaders/next-font-loader/postcss-next-font.ts:83-124

Tip

Variable weight or style values containing spaces are identified as ranges using isRange and are omitted from direct class property declarations to prevent invalid CSS output. Sources: packages/next/src/build/webpack/loaders/next-font-loader/postcss-next-font.ts:128-162

Manifest Generation and Route Preloading

NextFontManifestPlugin Architecture

The NextFontManifestPlugin collects all font files emitted by next-font-loader during compilation and constructs a structured JSON and Edge-compatible manifest file. This manifest is subsequently consumed by Next.js server render functions in pages/ and app/ to inject precise preload or preconnect links for fonts utilized on the active route.

/**
 * The NextFontManifestPlugin collects all font files emitted by next-font-loader and creates a manifest file.
 * The manifest file is used in the Next.js render functions (_document.tsx for pages/ and app-render for app/) to add preload tags for the font files.
 * We only want to att preload fonts that are used by the current route.
 *
 * For pages/ the plugin finds the fonts imported in the entrypoint chunks and creates a map:
 * { [route]: fontFile[] }
 * When rendering the app in _document.tsx, it gets the font files to preload: manifest.pages[currentRouteBeingRendered].
 *
 * For app/, the manifest is a bit different.
 * Instead of creating a map of route to font files, it creates a map of the webpack module request to font files.
 * { [webpackModuleRequest]: fontFile[]]}
 * When creating the component tree in app-render it looks for font files to preload: manifest.app[moduleBeingRendered]
 */

Sources: packages/next/src/build/webpack/plugins/next-font-manifest-plugin.ts:41-54

Sources: packages/next/src/build/webpack/plugins/next-font-manifest-plugin.ts:63-173

Manifest Field / HelperType / ReturnPurpose
pages{[path: string]: string[]}Maps route paths in pages/ to arrays of preloaded font file names.
app{[entry: string]: string[]}Maps webpack module/chunk entries in app/ to arrays of preloaded font files.
appUsingSizeAdjustbooleanTracks whether any app font uses size-adjust fallback metrics (-s in file name).
pagesUsingSizeAdjustbooleanTracks whether any pages font uses size-adjust fallback metrics.
getPreloadedFontFilesstring[]Filters font file arrays for extensions matching `/.p.(woff
getPageIsUsingSizeAdjustbooleanReturns true if any font file string includes -s.

Sources: packages/next/src/build/webpack/plugins/next-font-manifest-plugin.ts:7-39

Note

When a font entry is present in the manifest but contains an empty array of preloaded files, Next.js injects a preconnect link tag instead of a preload tag for that font family. Sources: packages/next/src/build/webpack/plugins/next-font-manifest-plugin.ts:107-112

Dev Overlay Font Serving

During local development, the Next.js dev overlay manages its own isolated typography requirements via FontStyles and getDevOverlayFontMiddleware. The middleware intercepts requests matching /__nextjs_font/, checks file existence, and serves hardcoded fallback font binaries with immutable cache headers.

const FONT_PREFIX = '/__nextjs_font/'
 
const VALID_FONTS = [
  'geist-latin-ext.woff2',
  'geist-mono-latin-ext.woff2',
  'geist-latin.woff2',
  'geist-mono-latin.woff2',
]
 
const FONT_HEADERS = {
  'Content-Type': 'font/woff2',
  'Cache-Control': 'public, max-age=31536000, immutable',
} as const
 

Sources: packages/next/src/next-devtools/server/font/get-dev-overlay-font-middleware.ts:8-21

Valid Dev Overlay FontContent-TypeCache-Control Header
geist-latin-ext.woff2font/woff2public, max-age=31536000, immutable
geist-mono-latin-ext.woff2font/woff2public, max-age=31536000, immutable
geist-latin.woff2font/woff2public, max-age=31536000, immutable
geist-mono-latin.woff2font/woff2public, max-age=31536000, immutable

Sources: packages/next/src/next-devtools/server/font/get-dev-overlay-font-middleware.ts:10-20

Warning

Requests to the dev overlay font middleware whose pathnames do not start with /__nextjs_font/ or do not match the exact entries in VALID_FONTS immediately invoke next() or return a 404 Not Found response. Sources: packages/next/src/next-devtools/server/font/get-dev-overlay-font-middleware.ts:31-38

Was this page helpful?