soul v4.2.0

Tres niveles de pagina

Elegir cuanto cuesta servir cada pagina, y por que casi nunca conviene 0.

La decision#

Cada pagina de un proyecto elige como se sirve, y eso determina su costo. Son tres niveles:

NivelComo se sirveWorkerD1Para que
EstaticaAsset prerenderizado00Landing, precios, terminos
Publica dinamicaWorker + cache-first10 en hitPerfil publico, recurso por slug
PortalWorker tras el login1NTodo lo que es por usuario u organizacion

El mito que hay que desarmar#

Y aun asi, casi nunca persigas el 0#

Los Workers son el recurso abundante: 100.000 requests diarias en el plan gratuito. D1 es el escaso. Optimizar requests a cero solo vale la pena en paginas fijas de mucho trafico — la landing, poco mas. En el resto, gastar una request para tener contenido fresco es el negocio correcto.

Nivel 1: estatica#

Terminal
npx soul g page landing --static
TypeScript
import { defineStatic } from "@jun/soul/static";
import { shell } from "./core";

export const staticPages = defineStatic([
  { path: "/", render: () => shell({ title: "Mi SaaS", body: landing() }) },
]);

Se prerenderiza con soul build y se sirve desde public/. Ver Static.

Nivel 2: publica dinamica#

Terminal
npx soul g page perfil --public
TypeScript
import { cacheKeyFor } from "@jun/soul/lib";

app.get("/u/:slug", async (c) => {
  const key = cacheKeyFor(c.req.url);
  const hit = await caches.default.match(key);
  if (hit) return hit;                      // el Worker corre, D1 no

  const row = await c.env.DB.prepare(
    "SELECT nombre, bio FROM perfiles WHERE slug = ?",
  ).bind(c.req.param("slug")).first();
  if (!row) return c.html(errorPage("No encontrado", "…"), 404);

  const res = c.html(shell({ title: row.nombre, body: render(row) }));
  res.headers.set("Cache-Control", "public, max-age=300");
  c.executionCtx.waitUntil(caches.default.put(key, res.clone()));
  return res;
});

Nivel 3: portal#

Terminal
npx soul g page ajustes

Detras de tenancy.requireSessionWithOrg(). No se cachea nunca: el contenido depende de quien mira.

Como elegir#

  • ¿Depende de quien mira? → portal.
  • ¿Es publica pero sale de la base? → publica dinamica.
  • ¿Es publica, fija, y publicar un cambio puede esperar a un deploy? → estatica.