Aller au contenu
Vincle

Chargement…

    serve

    Construit une Response HTTP à partir d’une page Flow et des options de négociation.

    Signature#

    serve(request, page, adapter, options?) prend la requête, une fonction produisant la page et un adaptateur, puis retourne la réponse encodée.

    import { serve } from "@vincle/flow/http";
    function serve(
    req: Request,
    page: (n: Negotiation) => JSX.Element,
    adapter: StreamingAdapter,
    opts?: FlowOptions & ResponseInit & { negotiate?: Negotiate; mode?: "full" | "fragment" },
    ): Promise<Response>;

    Paramètres#

    La requête transmet son signal d’annulation. Les options configurent le mode, les en-têtes, la négociation, les erreurs et les délais.

    Paramètre Type Description
    req Request Requête HTTP entrante
    page (n: Negotiation) => JSX.Element Fonction produisant la page
    adapter StreamingAdapter Adaptateur de représentation des fragments
    opts FlowOptions & ResponseInit & { negotiate?: Negotiate; mode?: "full" | "fragment" } Options Flow, en-têtes et mode

    Utilisation#

    Utilisez la fonction dans votre routeur ou votre serveur compatible avec les API Web.

    import { serve } from "@vincle/flow/http";
    import { NativeAdapter } from "@vincle/flow/adapters";
    Bun.serve({
    port: 3000,
    fetch(req) {
    return serve(req, () => <HomePage />, NativeAdapter);
    },
    });

    Avec la négociation HTMX#

    negotiateHtmx sélectionne le fragment indiqué par HTMX. La réponse conserve les informations Vary nécessaires pour distinguer les modes de rendu dans les caches.

    import { serve, negotiateHtmx } from "@vincle/flow/http";
    import { HtmxAdapter } from "@vincle/flow/adapters";
    Bun.serve({
    port: 3000,
    fetch(req) {
    return serve(req, () => <Page />, HtmxAdapter, {
    negotiate: negotiateHtmx,
    });
    },
    });

    Avec une négociation personnalisée#

    Une fonction de négociation personnalisée peut déterminer le fragment et les en-têtes de variation d’après la requête.

    import type { Negotiate } from "@vincle/flow";
    const negotiateMyLib: Negotiate = (req) => {
    const fragment = req.headers.get("X-Fragment-Id") ?? undefined;
    return {
    headers: { Vary: "X-Fragment-Id" },
    target: fragment,
    };
    };

    Avec un gestionnaire d’erreur personnalisé#

    onError reçoit une erreur de contenu différé et peut retourner un remplacement adapté au fragment.

    serve(req, () => <Page />, NativeAdapter, {
    onError: (error, { id, kind }) => {
    console.error(`Fragment ${id} failed:`, error);
    return <p>Unavailable</p>;
    },
    });

    Avec des en-têtes#

    Ajoutez vos en-têtes via les options. Le type de contenu HTML et les en-têtes nécessaires à la négociation sont composés dans la réponse.

    serve(req, () => <Page />, NativeAdapter, {
    headers: { "X-Custom": "value" },
    status: 200,
    });

    Options#

    Les options comprennent adapter, negotiate, signal, onError, defaultTimeout et headers.

    Option Type Valeur par défaut Description
    signal AbortSignal Aucune Annuler les rendus en cours
    onError (error, info) => JSX.Element | void Aucune Gestionnaire d’erreur par fragment
    defaultTimeout number Aucune Délai par fragment (ms)
    negotiate (req: Request) => Negotiation Aucune Déterminer le mode selon la requête
    mode "full" | "fragment" "full" Rendre le document complet ou un fragment
    headers HeadersInit Aucune En-têtes supplémentaires de la réponse
    status number 200 Code de statut de la réponse
    statusText string Aucune Texte du statut de la réponse