bf8ee1edb4
For some context: [https://vercel.slack.com/archives/CGU8HUTUH/p1662124179102509](https://vercel.slack.com/archives/CGU8HUTUH/p1662124179102509) Continuation of #40221 and #40227 Adds `experimental.fontLoaders`. SWC next-font-loaders (#40221) transforms font loader (e.g. #40227) call expressions into an import with the function call arguments as a query. The imports will be matched by `next-font-loader`. It runs the configured font loaders - emits font files and returns CSS. Exports are added, and the font-family is made locally scoped. The returned CSS is turned into a CSS module with `css-loader` which lets you consume the font-family. `FontLoaderManifestPlugin` creates a manifest of the preloaded font files for each entrypoint. Preload/preconnect are then added in `_document.tsx` if any font files were found for that path. Co-authored-by: JJ Kasper <jj@jjsweb.site>
52 lines
1.5 KiB
TypeScript
52 lines
1.5 KiB
TypeScript
import type { BuildManifest } from '../../server/get-page-files'
|
|
import type { ServerRuntime } from 'next/types'
|
|
import type { NEXT_DATA } from './utils'
|
|
import type { FontConfig } from '../../server/font-utils'
|
|
import type { FontLoaderManifest } from '../../build/webpack/plugins/font-loader-manifest-plugin'
|
|
|
|
import { createContext } from 'react'
|
|
|
|
export type HtmlProps = {
|
|
__NEXT_DATA__: NEXT_DATA
|
|
dangerousAsPath: string
|
|
docComponentsRendered: {
|
|
Html?: boolean
|
|
Main?: boolean
|
|
Head?: boolean
|
|
NextScript?: boolean
|
|
}
|
|
buildManifest: BuildManifest
|
|
ampPath: string
|
|
inAmpMode: boolean
|
|
hybridAmp: boolean
|
|
isDevelopment: boolean
|
|
dynamicImports: string[]
|
|
assetPrefix?: string
|
|
canonicalBase: string
|
|
headTags: any[]
|
|
unstable_runtimeJS?: false
|
|
unstable_JsPreload?: false
|
|
devOnlyCacheBusterQueryString: string
|
|
scriptLoader: {
|
|
afterInteractive?: string[]
|
|
beforeInteractive?: any[]
|
|
worker?: any[]
|
|
}
|
|
locale?: string
|
|
disableOptimizedLoading?: boolean
|
|
styles?: React.ReactElement[] | React.ReactFragment
|
|
head?: Array<JSX.Element | null>
|
|
crossOrigin?: string
|
|
optimizeCss?: any
|
|
optimizeFonts?: FontConfig
|
|
nextScriptWorkers?: boolean
|
|
runtime?: ServerRuntime
|
|
hasConcurrentFeatures?: boolean
|
|
largePageDataBytes?: number
|
|
fontLoaderManifest?: FontLoaderManifest
|
|
}
|
|
|
|
export const HtmlContext = createContext<HtmlProps>(null as any)
|
|
if (process.env.NODE_ENV !== 'production') {
|
|
HtmlContext.displayName = 'HtmlContext'
|
|
}
|