콘텐츠로 이동

Astro 폰트 제공자 API

추가된 버전: astro@6.0.0

폰트 API를 사용하면 통합된 방식으로 폰트에 액세스할 수 있습니다. 각 패밀리에는 원격 서비스에서 폰트 파일을 다운로드하거나 디스크에서 로컬 폰트 파일을 로드하는 Astro 폰트 제공자가 필요합니다.

Astro는 astro/config에서 내장 폰트 제공자를 내보냅니다.

import { fontProviders } from 'astro/config'

내장 폰트 제공자를 사용하려면 provider를 선택한 제공자에 적합한 값으로 설정하세요.

Adobe에서 폰트를 가져옵니다.

provider: fontProviders.adobe({ id: "your-id" })

Adobe 폰트 제공자에 Astro 구성 파일의 환경 변수로 로드된 ID를 전달하세요.

Bunny에서 폰트를 가져옵니다.

provider: fontProviders.bunny()

Fontshare에서 폰트를 가져옵니다.

provider: fontProviders.fontshare()

Fontsource에서 폰트를 가져옵니다.

provider: fontProviders.fontsource()

Google에서 폰트를 가져옵니다.

provider: fontProviders.google()

이 제공자에는 font.options 객체에 추가할 수 있는 다음과 같은 패밀리별 옵션이 포함되어 있습니다.

타입: string[]

각 폰트 패밀리에 포함될 글리프 목록을 지정할 수 있습니다. 이를 통해 폰트 파일의 크기를 줄일 수 있습니다.

{
// ...
provider: fontProviders.google(),
options: {
experimental: {
glyphs: ["a"]
}
}
}

타입: Partial<Record<VariableAxis, ([string, string] | string)[]>>

가변 축 구성을 설정할 수 있습니다.

{
// ...
provider: fontProviders.google(),
options: {
experimental: {
variableAxis: {
slnt: [["-15", "0"]],
CASL: [["0", "1"]],
CRSV: ["1"],
MONO: [["0", "1"]],
}
}
}
}

Google Icons에서 폰트를 가져옵니다.

provider: fontProviders.googleicons()

이 제공자에는 font.options 객체에 추가할 수 있는 다음과 같은 패밀리별 옵션이 포함되어 있습니다.

타입: string[]

새로운 Material Symbols 아이콘을 해석할 때, 각 폰트 패밀리에 포함될 글리프 목록을 지정할 수 있습니다. 이를 통해 폰트 파일의 크기를 줄일 수 있습니다.

{
// ...
provider: fontProviders.googleicons(),
options: {
experimental: {
glyphs: ["a"]
}
}
}

디스크에서 폰트를 가져옵니다.

provider: fontProviders.local()

이 제공자는 font.options 객체variants가 정의되어 있어야 합니다.

타입: LocalFontFamily["variants"]

options.variants 속성은 필수입니다. 각 변형은 @font-face 선언을 나타내며 src가 필요합니다.

또한 각 변형 내에 기타 다른 속성들을 지정할 수 있습니다.

astro.config.mjs
import { defineConfig, fontProviders } from "astro/config";
export default defineConfig({
fonts: [{
provider: fontProviders.local(),
name: "Custom",
cssVariable: "--font-custom",
options: {
variants: [
{
weight: 400,
style: "normal",
src: ["./src/assets/fonts/custom-400.woff2"]
},
{
weight: 700,
style: "normal",
src: ["./src/assets/fonts/custom-700.woff2"]
}
// ...
]
}
}]
});

타입: number | string
기본값: undefined

폰트 두께입니다.

weight: 200

연관된 폰트가 가변 폰트인 경우 두께 범위를 지정할 수 있습니다.

weight: "100 900"

값이 설정되지 않은 경우, Astro는 기본적으로 첫 번째 source를 기반으로 값을 유추하려고 시도합니다.

타입: "normal" | "italic" | "oblique"
기본값: undefined

폰트 스타일입니다.

style: "normal"

값이 설정되지 않은 경우, Astro는 기본적으로 첫 번째 source를 기반으로 값을 유추하려고 시도합니다.

타입: (string | URL | { url: string | URL; tech?: string })[]

폰트 소스입니다. 루트에 대한 상대 경로, 패키지 가져오기 또는 URL일 수 있습니다. 통합을 통해 로컬 폰트를 주입하는 경우 URL이 특히 유용합니다.

src: ["./src/assets/fonts/MyFont.woff2", "./src/assets/fonts/MyFont.woff"]

객체를 제공하여 tech를 지정할 수도 있습니다.

src: [{ url:"./src/assets/fonts/MyFont.woff2", tech: "color-COLRv1" }]

폰트 패밀리의 다음 옵션들도 변형 내의 로컬 폰트 패밀리에 사용할 수 있습니다.

astro.config.mjs
import { defineConfig, fontProviders } from "astro/config";
export default defineConfig({
fonts: [{
provider: fontProviders.local(),
name: "Custom",
cssVariable: "--font-custom",
options: {
variants: [
{
weight: 400,
style: "normal",
src: ["./src/assets/fonts/custom-400.woff2"],
display: "block"
}
]
}
}]
});

node_modules에 로컬로 설치된 패키지 또는 CDN에서 NPM 패키지의 폰트를 가져옵니다.

provider: fontProviders.npm()

제공자는 package.json 의존성에서 폰트를 자동으로 감지하며 @fontsource/*, @fontsource-variable/* 및 기타 알려진 폰트 패키지의 폰트를 해석할 수 있습니다.

NPM 제공자는 다음 구성 옵션을 허용합니다.

타입: string
기본값: 'https://cdn.jsdelivr.net/npm'

npm 패키지를 원격으로 가져오는 데 사용할 CDN입니다.

provider: fontProviders.npm({ cdn: 'https://esm.sh' })

타입: boolean
기본값: true

로컬 해석에 실패했을 때 CDN에서 가져오기로 대체할지 여부입니다. 로컬에 설치된 패키지에서만 해석하려면 false로 설정하세요.

provider: fontProviders.npm({ remote: false })

이 제공자에는 font.options 객체에 추가할 수 있는 다음과 같은 패밀리별 옵션이 포함되어 있습니다.

타입: string
기본값: 자동 감지되거나 패밀리 이름에서 유추됨

NPM 패키지 이름입니다. 지정하지 않으면 제공자는 알려진 폰트 패키지 패턴에서 폰트 패밀리를 찾거나 Fontsource 규칙에 따라 유추하려고 시도합니다.

{
// ...
provider: fontProviders.npm(),
options: {
package: '@fontsource/roboto'
}
}

타입: string
기본값: 'latest'

패키지의 버전입니다 (CDN 해석에만 사용됨).

{
// ...
provider: fontProviders.npm(),
options: {
version: '5.0.0'
}
}

타입: string
기본값: 'index.css'

패키지에서 파싱할 엔트리 CSS 파일입니다.

{
// ...
provider: fontProviders.npm(),
options: {
file: 'latin.css'
}
}

내장 제공자 중 하나를 사용하고 싶지 않은 경우 (예: 서드파티 유니폰트 제공자를 사용하거나 비공개 레지스트리를 위한 무언가를 구축하려는 경우) 직접 만들 수 있습니다.

커스텀 폰트 제공자를 구현하는 권장 방법은 FontProvider 객체를 반환하고 구성을 매개변수로 받는 함수를 내보내는 것입니다.

FontProvider는 필수 nameresolveFont() 속성을 포함하는 객체입니다. 또한 선택적으로 config, init(), listFonts() 속성을 사용할 수도 있습니다.

FontProvider 타입은 패밀리 옵션에 대한 제네릭을 허용합니다.

타입: string

로그 및 식별에 사용되는 제공자의 고유 이름입니다.

타입: (options: ResolveFontOptions) => Awaitable<{ fonts: FontFaceData[] } | undefined>

주어진 옵션을 기반으로 폰트 페이스 데이터를 조회하고 반환하는 데 사용됩니다.

타입: Record<string, any>
기본값: undefined

식별에 사용되는 직렬화 가능한 객체입니다.

타입: (context: FontProviderInitContext) => Awaitable<void>
기본값: undefined

초기화 로직을 수행하는 데 사용되는 선택적 콜백입니다.

타입: Storage

캐싱에 유용합니다.

타입: URL

프로젝트 루트로, 로컬 파일 경로를 해석하는 데 유용합니다.

타입: () => Awaitable<string[] | undefined>
기본값: undefined

사용 가능한 폰트 이름 목록을 반환하는 데 사용되는 선택적 콜백입니다.

다음 예시는 비공개 레지스트리를 위한 폰트 제공자를 정의합니다.

font-provider.ts
import type { FontProvider } from "astro";
import { retrieveFonts, type Fonts } from "./utils.js",
export function registryFontProvider(): FontProvider {
let data: Fonts = {}
return {
name: "registry",
init: async () => {
data = await retrieveFonts(token);
},
listFonts: () => {
return Object.keys(data);
},
resolveFont: ({ familyName, ...rest }) => {
const fonts = data[familyName];
if (fonts) {
return { fonts };
}
return undefined;
},
};
}

그 후 Astro 구성에 이 폰트 제공자를 등록할 수 있습니다.

astro.config.ts
import { defineConfig } from "astro/config";
import { registryFontProvider } from "./font-provider";
export default defineConfig({
fonts: [{
provider: registryFontProvider(),
name: "Custom",
cssVariable: "--font-custom"
}]
});

서드파티 유니폰트 제공자 지원

섹션 제목: “서드파티 유니폰트 제공자 지원”

내부적으로 유니폰트 제공자를 사용하여 Astro 폰트 제공자를 정의할 수 있습니다.

font-provider.ts
import type { FontProvider } from "astro";
import type { InitializedProvider } from "unifont";
import { acmeProvider } from "@acme/unifont-provider"
export function acmeFontProvider(): FontProvider {
const provider = acmeProvider();
let initializedProvider: InitializedProvider | undefined;
return {
name: provider._name,
async init(context) {
initializedProvider = await provider(context);
},
async resolveFont({ familyName, ...rest }) {
return await initializedProvider?.resolveFont(familyName, rest);
},
async listFonts() {
return await initializedProvider?.listFonts?.();
},
};
}

그 후 Astro 구성에 이 폰트 제공자를 등록할 수 있습니다.

astro.config.ts
import { defineConfig } from "astro/config";
import { acmeFontProvider } from "./font-provider";
export default defineConfig({
fonts: [{
provider: acmeFontProvider(),
name: "Custom",
cssVariable: "--font-custom"
}]
});
기여하기 커뮤니티 후원하기