Aller au contenu
Vincle

Chargement…

    Génération statique

    Générez des fichiers HTML avec les mêmes composants que votre serveur.

    Quand utiliser la génération statique#

    Le statique convient aux pages stables, aux builds de documentation et aux déploiements sans serveur de rendu permanent.

    Statique pur#

    Pour une page entièrement statique, rendez le document et écrivez la chaîne HTML dans un fichier. Aucun traitement client n’est nécessaire.

    import type { JSX } from "@vincle/core";
    import { renderToStatic } from "@vincle/flow";
    import { writeFile } from "node:fs/promises";
    declare const pages: { Component: () => JSX.Element; out: string }[];
    await renderToStatic(async (ctx) => {
    await Promise.all(
    pages.map(async (page) => {
    const html = await ctx.renderPage(() => <page.Component />);
    await writeFile(page.out, "<!DOCTYPE html>\n" + html);
    }),
    );
    });

    Avec des fragments différés#

    Configurez adapter et generatePath pour les régions différées. Écrivez la page initiale puis les fragments avec emitFragments, aux URL utilisées par les emplacements.

    import type { JSX } from "@vincle/core";
    import { renderToStatic } from "@vincle/flow";
    import { NativeAdapter } from "@vincle/flow/adapters";
    import { writeFile } from "node:fs/promises";
    declare const pages: { Component: () => JSX.Element; out: string }[];
    await renderToStatic(
    async (ctx) => {
    for (const page of pages) {
    const html = await ctx.renderPage(() => <page.Component />);
    await writeFile(page.out, "<!DOCTYPE html>\n" + html);
    }
    // One .html file per deferred fragment.
    await ctx.emitFragments((_id, url, html) => writeFile("./dist" + url, html));
    },
    { adapter: NativeAdapter },
    );

    Régénération à la demande#

    Une route peut régénérer un fragment avec renderFragment. Conservez le même adaptateur et le même calcul de chemin que lors du build initial.

    import { renderFragment } from "@vincle/flow";
    import { NativeAdapter } from "@vincle/flow/adapters";
    declare function fetchPrice(symbol: string): Promise<{ value: number }>;
    // A Netlify/Vercel Edge Function: both run standard Request → Response
    // handlers, so this needs no platform SDK import.
    export default async function handler(req: Request): Promise<Response> {
    const symbol = new URL(req.url).searchParams.get("symbol");
    if (!symbol) return new Response("Missing symbol", { status: 400 });
    const price = await fetchPrice(symbol);
    const { url, html } = await renderFragment(
    `price-${symbol}`,
    <span>{price.value.toFixed(2)}</span>,
    { adapter: NativeAdapter },
    );
    // `url` matches the path the full build already wrote this fragment to,
    // upload `html` there (blob store, on-demand revalidation, CDN purge +
    // PUT…). The shell page that includes it never needs rebuilding.
    return Response.json({ url, html });
    }