Astro 컨í ì´ë API (ì¤íì )
ì¶ê°ë ë²ì :
astro@4.9.0
컨í ì´ë API를 ì¬ì©íë©´ Astro ì»´í¬ëí¸ë¥¼ ë 립ì ì¼ë¡ ë ëë§í ì ììµëë¤.
ì´ ì¤íì ì¸ ìë² ì¸¡ APIë ë¤ìí ì ì¬ì 미ë íì© ê°ë¥ì±ì ì´ì´ì£¼ì§ë§, íì¬ë vitestì ê°ì vite íê²½ìì .astro ì»´í¬ëí¸ ì¶ë ¥ì í
ì¤í¸í ì ìëë¡ ë²ìê° ì íëì´ ììµëë¤.
ëí ìì² ì ë ëë§ëë íì´ì§ë vite ì¸ë¶(ì: PHP ëë Elixir ì í리ì¼ì´ì
ë´ë¶)ì 기í âì
¸â íê²½ìì 컨í
ì´ë를 ìì±í기 ìí ë ëë§ ì¤í¬ë¦½í¸ë¥¼ ìëì¼ë¡ ì§ì ë¡ëí ì ììµëë¤.
ì´ API를 ì¬ì©íë©´ ì 컨í
ì´ë를 ìì±íê³ , 문ìì´ ëë Response를 ë°ííë Astro ì»´í¬ëí¸ë¥¼ ë ëë§í ì ììµëë¤.
ì´ APIë ì¤íì ì´ë©°, ë§ì´ë ëë í¨ì¹ 릴리ì¤ììë í¸íì±ì 깨ë¨ë¦¬ë ë³ê²½ ì¬íì´ ë°ìí ì ììµëë¤. ë³ê²½ ì¬íì Astro ë³ê²½ ë¡ê·¸ë¥¼ 참조íì¸ì. ì´ íì´ì§ë íì ìµì ë²ì ì Astroì ëí ì ë³´ë¡ ì ë°ì´í¸ë©ëë¤.
create()
ì¹ì
ì 목: âcreate()âíì
: (options?: AstroContainerOptions) => Promise<experimental_AstroContainer>
컨í ì´ëì ì ì¸ì¤í´ì¤ë¥¼ ìì±í©ëë¤.
import { experimental_AstroContainer } from "astro/container";
const container = await experimental_AstroContainer.create();ë¤ì ìµì ì ê°ì§ ê°ì²´ë¥¼ ë°ìµëë¤.
export type AstroContainerOptions = { streaming?: boolean; renderers?: AddServerRenderer[];};
export type AddServerRenderer = | { renderer: NamedSSRLoadedRendererValue; name: never; } | { renderer: SSRLoadedRendererValue; name: string; };streaming ìµì
ì¹ì
ì 목: âstreaming ìµì
âíì
: boolean
기본ê°: false
HTML ì¤í¸ë¦¬ë°ì ì¬ì©í ì»´í¬ëí¸ ë ëë§ì íì±íí©ëë¤.
renderers ìµì
ì¹ì
ì 목: ârenderers ìµì
âíì
: AddServerRenderer[]
기본ê°: []
ì»´í¬ëí¸ì íìí ë¡ëë í´ë¼ì´ì¸í¸ ë ëë¬ ëª©ë¡ì
ëë¤. .astro ì»´í¬ëí¸ê° ê³µì Astro íµí©(ì: React, Vue ë±)ì ì¬ì©íì¬ UI íë ììí¬ ì»´í¬ëí¸ ëë MDX를 ë ëë§íë ê²½ì°ì ì´ë¥¼ ì¬ì©íì¸ì.
ì ì ì í리ì¼ì´ì
ì´ë ë°íì ì 컨í
ì´ëê° í¸ì¶ëì§ ìë ê²½ì°(ì: vitest를 ì¬ì©íì¬ í
ì¤í¸íë ê²½ì°)ìë 컨í
ì´ë API를 íµí´ ë ëë¬ë¥¼ ìëì¼ë¡ ì¶ê°í ì ììµëë¤.
ìì² ì ë ëë§ëë ì í리ì¼ì´ì ì´ë ë°íì ì ëë ë¤ë¥¸ âì ¸â(ì: PHP, Ruby, Java ë±)ìì 컨í ì´ëê° í¸ì¶ëë ê²½ì°, ë ëë¬ë¥¼ ìëì¼ë¡ ì§ì ê°ì ¸ìì¼ í©ëë¤.
컨í ì´ë API를 íµí´ ë ëë¬ ì¶ê°í기
ì¹ì ì 목: â컨í ì´ë API를 íµí´ ë ëë¬ ì¶ê°í기âê° ê³µì Astro íµí©ììë ì ì© container-renderer ì§ì
ì ì getContainerRenderer() ëì°ë¯¸ í¨ì를 ì¬ì©íì¬ í´ë¼ì´ì¸í¸ ë° ìë² ë ëë§ ì¤í¬ë¦½í¸ë¥¼ ë
¸ì¶í ì ììµëë¤. ì´ë¬í ì§ì
ì ì @astrojs/react, @astrojs/preact, @astrojs/solid-js, @astrojs/svelte, @astrojs/vue, @astrojs/mdxìì ì ê³µë©ëë¤.
@astrojs npm ì¡°ì§ ì¸ë¶ì ë ëë¬ í¨í¤ì§ì ê²½ì°, í´ë¹ 문ììì getContainerRenderer() ëë ì ì¬í í¨ìê° ì ê³µëëì§ íì¸íì¸ì.
vite (vitest, Astro íµí© ë±)를 ì¬ì©í ë, ë ëë¬ë ê°ì 모ë astro:containerì loadRenderers() í¨ì를 íµí´ ë¡ëë©ëë¤.
vite ì¸ë¶ ëë ìì²ì íµí´ ì¬ì©í기 ìí´ìë ë ëë¬ë¥¼ ìëì¼ë¡ ì§ì ë¡ëí´ì¼ í©ëë¤.
ë¤ìì React ì»´í¬ëí¸ì Svelte ì»´í¬ëí¸ë¥¼ ë ëë§íë Astro ì»´í¬ëí¸ë¥¼ ë ëë§íë ë° íìí ê°ì²´ë¥¼ ì ê³µíë ììì ëë¤.
import { experimental_AstroContainer } from "astro/container";import { getContainerRenderer as reactContainerRenderer } from "@astrojs/react/container-renderer";import { getContainerRenderer as svelteContainerRenderer } from "@astrojs/svelte/container-renderer";import { loadRenderers } from "astro:container";import ReactWrapper from "./ReactWrapper.astro";
const renderers = await loadRenderers([ reactContainerRenderer(), svelteContainerRenderer(),]);const container = await experimental_AstroContainer.create({ renderers,});const result = await container.renderToString(ReactWrapper);ë ëë¬ ì§ì ì¶ê°í기
ì¹ì ì 목: âë ëë¬ ì§ì ì¶ê°í기â컨í
ì´ëê° ë°íì ì ëë ë¤ë¥¸ âì
¸âìì í¸ì¶ë ëë astro:container ê°ì 모ëì ëì°ë¯¸ í¨ì를 ì¬ì©í ì ììµëë¤. íìí ìë² ë° í´ë¼ì´ì¸í¸ ë ëë¬ë¥¼ ìëì¼ë¡ ì§ì ê°ì ¸ì addServerRenderer ë° addClientRenderer를 ì¬ì©íì¬ ì»¨í
ì´ëì ì ì¥í´ì¼ í©ëë¤.
íë¡ì í¸ ë¹ëìë ìë² ë ëë¬ê° íìíë©°, ì¬ì©ë 모ë íë ììí¬ë³ë¡ 컨í
ì´ëì ì ì¥ëì´ì¼ í©ëë¤. client:* ì§ìì´ë¥¼ ì¬ì©íì¬ í´ë¼ì´ì¸í¸ 측 ì»´í¬ëí¸ë¥¼ íì´ëë ì´ì
íë ¤ë©´ í´ë¼ì´ì¸í¸ ë ëë¬ê° ì¶ê°ë¡ íìí©ëë¤.
íë ììí¬ë¹ íëì ê°ì ¸ì¤ê¸° êµ¬ë¬¸ì´ íìí©ëë¤. ë ëë¬ë¥¼ ê°ì ¸ì¤ë©´ ìë² ë ëë¬ì í´ë¼ì´ì¸í¸ ë ëë¬ ëª¨ë 컨í ì´ëìì ì¬ì©í ì ìê² ë©ëë¤. ê·¸ë¬ë ë°ëì í´ë¼ì´ì¸í¸ ë ëë¬ë³´ë¤ ìë² ë ëë¬ë¥¼ 컨í ì´ëì 먼ì ì¶ê°í´ì¼ í©ëë¤. ì´ë ê² íë©´ ì ì²´ 컨í ì´ëê° ë¨¼ì ë ëë§ë í ìí¸ìì© ê°ë¥í ì»´í¬ëí¸ë¥¼ íì´ëë ì´ì í ì ììµëë¤.
ë¤ìì ì ì Vue ì»´í¬ëí¸ì .mdx íì´ì§ë¥¼ íìí기 ìí´ íìí ìë² ë ëë¬ë¥¼ ìëì¼ë¡ ì§ì ê°ì ¸ì¤ë ììì
ëë¤. ëí ìí¸ìì© ê°ë¥í React ì»´í¬ëí¸ë¥¼ ìí´ ìë² ë° í´ë¼ì´ì¸í¸ ë ëë¬ë¥¼ 모ë ì¶ê°í©ëë¤.
import { experimental_AstroContainer } from "astro/container";import reactRenderer from "@astrojs/react/server.js";import vueRenderer from "@astrojs/vue/server.js";import mdxRenderer from "@astrojs/mdx/server.js";
const container = await experimental_AstroContainer.create();container.addServerRenderer({ renderer: vueRenderer });container.addServerRenderer({ renderer: mdxRenderer });
container.addServerRenderer({ renderer: reactRenderer });container.addClientRenderer({ name: "@astrojs/react", entrypoint: "@astrojs/react/client.js",});renderToString()
ì¹ì
ì 목: ârenderToString()âíì
: (component: AstroComponentFactory; options?: ContainerRenderOptions) => Promise<string>
ì´ í¨ìë 컨í ì´ëìì í¹ì ì»´í¬ëí¸ë¥¼ ë ëë§í©ëë¤. Astro ì»´í¬ëí¸ë¥¼ ì¸ìë¡ ë°ìë¤ì´ë©°, Astro ì»´í¬ëí¸ê° ë ëë§í HTML/ì½í ì¸ ë¥¼ ëíë´ë 문ìì´ì ë°íí©ëë¤.
import { experimental_AstroContainer } from "astro/container";import Card from "../src/components/Card.astro";
const container = await experimental_AstroContainer.create();const result = await container.renderToString(Card);ì´ í¨ìë ë´ë¶ì ì¼ë¡ renderToResponse()ì Response.text()를 í¸ì¶í©ëë¤.
ëí ë ë²ì§¸ ì¸ìë¡ ì¬ë¬ ìµì ì í¬í¨í ì ìë ê°ì²´ë¥¼ ë°ìµëë¤.
renderToResponse()
ì¹ì
ì 목: ârenderToResponse()âíì
: (component: AstroComponentFactory; options?: ContainerRenderOptions) => Promise<Response>
ì»´í¬ëí¸ë¥¼ ë ëë§íê³ , Response ê°ì²´ë¥¼ ë°íí©ëë¤.
import { experimental_AstroContainer } from "astro/container";import Card from "../src/components/Card.astro";
const container = await experimental_AstroContainer.create();const result = await container.renderToResponse(Card);ëí ë ë²ì§¸ ì¸ìë¡ ì¬ë¬ ìµì ì í¬í¨í ì ìë ê°ì²´ë¥¼ ë°ìµëë¤.
ë ëë§ ìµì
ì¹ì ì 목: âë ëë§ ìµì ârenderToResponse()ì renderToString() 모ë ë ë²ì§¸ ì¸ìë¡ ê°ì²´ë¥¼ ë°ìµëë¤.
export type ContainerRenderOptions = { slots?: Record<string, any>; props?: Record<string, unknown>; request?: Request; params?: Record<string, string | undefined>; locals?: App.Locals; routeType?: RouteType; partial?: boolean;};ì´ë¬í ì íì ê°ë¤ì Astro ì»´í¬ëí¸ë¥¼ ì¬ë°ë¥´ê² ë ëë§íë ë° íìí ì¶ê° ì 보를 ì ê³µí기 ìí´ ë ëë§ í¨ìì ì ë¬ë ì ììµëë¤.
íì
: Record<string, any>
<slots>ë¡ ë ëë§í ì½í
ì¸ ë¥¼ ì ë¬íë ìµì
ì
ëë¤.
Astro ì»´í¬ëí¸ê° íëì 기본 ì¬ë¡¯ì ë ëë§íë ê²½ì°, default를 í¤ë¡ ì¬ì©íë ê°ì²´ë¥¼ ì ë¬íì¸ì.
import { experimental_AstroContainer } from "astro/container";import Card from "../src/components/Card.astro";
const container = await experimental_AstroContainer.create();const result = await container.renderToString(Card, { slots: { default: "í¹ì ê°" },});ì»´í¬ëí¸ê° ëª ëª ë ì¬ë¡¯ì ë ëë§íë ê²½ì°, ì¬ë¡¯ ì´ë¦ì ê°ì²´ í¤ë¡ ì¬ì©íì¸ì.
------<div> <slot name="header" /> <slot name="footer" /></div>import { experimental_AstroContainer } from "astro/container";import Card from "../src/components/Card.astro";
const container = await experimental_AstroContainer.create();const result = await container.renderToString(Card, { slots: { header: "í¤ë ì½í
ì¸ ", footer: "í¸í°", },});ì»´í¬ëí¸ë¥¼ ê³ë¨ìì¼ë¡ ë ëë§í ìë ììµëë¤.
------<div> <slot name="header" /> <slot name="footer" /></div>import { experimental_AstroContainer } from "astro/container";import Card from "../src/components/Card.astro";import CardHeader from "../src/components/CardHeader.astro";import CardFooter from "../src/components/CardFooter.astro";
const container = await experimental_AstroContainer.create();const result = await container.renderToString(Card, { slots: { header: await container.renderToString(CardHeader), footer: await container.renderToString(CardFooter), },});props ìµì
ì¹ì
ì 목: âprops ìµì
âíì
: Record<string, unknown>
Astro ì»´í¬ëí¸ì ìì±ì ì ë¬íë ìµì ì ëë¤.
import { experimental_AstroContainer } from "astro/container";import Card from "../src/components/Card.astro";
const container = await experimental_AstroContainer.create();const result = await container.renderToString(Card, { props: { name: "íìí©ëë¤!" },});---// TypeScript ì§ìì ìí´ ì¬ì©í©ëë¤.interface Props { name: string;};
const { name } = Astro.props;---<div> {name}</div>request ìµì
ì¹ì
ì 목: ârequest ìµì
âíì
: Request
ì»´í¬ëí¸ê° ë ëë§í ê²½ë¡/URLì ëí ì 보를 í¬í¨íë Request를 ì ë¬íë ìµì
ì
ëë¤.
ì»´í¬ëí¸ìì Astro.url ëë Astro.requestì ê°ì ì 보를 ì½ì´ì¼ í ë ì´ ìµì
ì ì¬ì©í©ëë¤.
ê°ë¥í í¤ëë ì¿ í¤ë 주ì í ì ììµëë¤.
import { experimental_AstroContainer } from "astro/container";import Card from "../src/components/Card.astro";
const container = await experimental_AstroContainer.create();const result = await container.renderToString(Card, { request: new Request("https://example.com/blog", { headers: { "x-some-secret-header": "test-value", }, }),});params ìµì
ì¹ì
ì 목: âparams ìµì
âíì
: Record<string, string | undefined>
ëì ë¼ì°í¸ë¥¼ ìì±íë Astro ì»´í¬ëí¸ì ê²½ë¡ ë§¤ê°ë³ì ì 보를 ì ë¬í기 ìí ê°ì²´ì ëë¤.
ì»´í¬ëí¸ê° ë¨ì¼ ë¼ì°í¸ë¥¼ ëì ì¼ë¡ ìì±í기 ìí´ Astro.params ê°ì´ íìí ê²½ì° ì´ ìµì
ì ì¬ì©í©ëë¤.
---const { locale, slug } = Astro.params;---<div></div>import { experimental_AstroContainer } from "astro/container";import LocaleSlug from "../src/pages/[locale]/[slug].astro";
const container = await experimental_AstroContainer.create();const result = await container.renderToString(LocaleSlug, { params: { locale: "en", slug: "getting-started", },});locals ìµì
ì¹ì
ì 목: âlocals ìµì
âíì
: App.Locals
ì»´í¬ëí¸ë¥¼ ë ëë§í기 ìí´ Astro.localsì ì 보를 ì ë¬íë ìµì
ì
ëë¤.
ë¡ê·¸ì¸ ìíì ê°ì´ ìì²ì ë¼ì´íì¬ì´í´ ëì ì ì¥ë ì ë³´ê° ì»´í¬ëí¸ ë ëë§ì íìí ê²½ì° ì´ ìµì ì ì¬ì©í©ëë¤.
---const { checkAuth } = Astro.locals;const isAuthenticated = checkAuth();---
{isAuthenticated ? <span>ë¡ê·¸ì¸ ìíì
ëë¤.</span> : <span>ë¡ê·¸ìì ìíì
ëë¤.</span>}import { experimental_AstroContainer } from "astro/container";import Card from "../src/components/Card.astro";import test from "node:test";
const container = await experimental_AstroContainer.create();
test("ì¬ì©ìê° ë¡ê·¸ì¸ ìíì¸ ê²½ì°", async () => { const result = await container.renderToString(Card, { locals: { checkAuth() { return true; }, }, });
// ê²°ê³¼ì "ë¡ê·¸ì¸ ìíì
ëë¤."ê° í¬í¨ëì´ ìëì§ íì¸});
test("ì¬ì©ìê° ë¡ê·¸ìì ìíì¸ ê²½ì°", async () => { const result = await container.renderToString(Card, { locals: { checkAuth() { return false; }, }, });
// ê²°ê³¼ì "ë¡ê·¸ìì ìíì
ëë¤."ê° í¬í¨ëì´ ìëì§ íì¸});routeType ìµì
ì¹ì
ì 목: ârouteType ìµì
âíì
: RouteType
ìëí¬ì¸í¸ë¥¼ ë ëë§íê³ ìë¤ë ê²ì ëª
ìí기 ìí´ renderToResponse()ì í¨ê» ì¬ì©í ì ìë ìµì
ì
ëë¤.
container.renderToString(Endpoint, { routeType: "endpoint" });import { experimental_AstroContainer } from "astro/container";import * as Endpoint from "../src/pages/api/endpoint.js";
const container = await experimental_AstroContainer.create();const response = await container.renderToResponse(Endpoint, { routeType: "endpoint",});const json = await response.json();POST, PATCH ë± ë©ìëì ëí ìëí¬ì¸í¸ í
ì¤í¸ë¥¼ ìííë ¤ë©´ request ìµì
ì ì¬ì©íì¬ ì¬ë°ë¥¸ í¨ì를 í¸ì¶í´ì¼ í©ëë¤.
export function GET() {}
// í
ì¤í¸ê° íìí©ëë¤.export function POST() {}import { experimental_AstroContainer } from "astro/container";import * as Endpoint from "../src/pages/api/endpoint.js";
const container = await experimental_AstroContainer.create();const response = await container.renderToResponse(Endpoint, { routeType: "endpoint", request: new Request("https://example.com", { method: "POST", // í
ì¤í¸ë¥¼ ìí´ POST ë©ìë ì§ì }),});const json = await response.json();partial ìµì
ì¹ì
ì 목: âpartial ìµì
âíì
: boolean
기본ê°: true
astro@4.16.6
컨í
ì´ë APIê° ì»´í¬ëí¸ë¥¼ íì´ì§ ë¶ë¶ì²ë¼ ë ëë§í ì§ ì¬ë¶ì
ëë¤. ê¸°ë³¸ê° true ì¤ì ì ì ì²´ íì´ì§ ì
¸ ìì´ ì»´í¬ëí¸ë¥¼ ë
립ì ì¼ë¡ ë ëë§í©ëë¤.
<!DOCTYPE html>ì í¬í¨í ì ì²´ Astro íì´ì§ë¡ ì»´í¬ëí¸ë¥¼ ë ëë§íë ¤ë©´ partialì falseë¡ ì¤ì íì¬ ì´ ëìì ë¹íì±íí ì ììµëë¤.
import { experimental_AstroContainer } from "astro/container";import Blog from "../src/pages/Blog.astro";
const container = await experimental_AstroContainer.create();const result = await container.renderToString(Blog, { partial: false,});console.log(result); // HTML ìì ë¶ë¶ì `<!DOCTYPE html>`ì´ í¬í¨ë©ëë¤.