Landing page informativa sobre "Vibe Coding" basada en el trabajo de Peter Wong. Proyecto construido con Deno Fresh con soporte para internacionalización (español e inglés) y tema oscuro.
- Runtime: Deno
- Framework: Fresh 1.7.3
- UI: Preact 10.22.0
- CSS: Tailwind CSS 3.4.1
- Deployment: Cloudflare Workers (via Wrangler)
Nota sobre dependencias: El proyecto usa Deno como runtime principal, pero
incluye un package.json mínimo con Wrangler 4.80.0 como devDependency
exclusivamente para GitHub Actions CI/CD. Tailwind y otras herramientas se
instalan vía Deno.
- Components (
/components/): Componentes estáticos renderizados en servidor - Islands (
/islands/): Componentes interactivos que se hidratan en cliente - Usar
PagePropscon generics para tipado de props en rutas - Handler functions en
Handlers<Data, MiddlewareState>
- Archivos: PascalCase (ej:
Footer.tsx,DarkMode.tsx) - Componentes: PascalCase export default
- Funciones utilities: camelCase
- Interfaces: PascalCase con sufijo
Propspara componentes
Usar interfaces explícitas con readonly para propiedades de solo lectura:
interface SectionWrapperContentProps {
readonly title?: string;
readonly attrClass?: string;
readonly children: preact.ComponentChildren;
}- Archivos JSON en
/localescon estructura anidada por sección - Función
t(lang)enutils/i18n.tspara cargar traducciones - Fallback automático a español si el idioma no existe
- Usar
dangerouslySetInnerHTMLcondeno-lint-ignore react-no-dangerpara HTML en traducciones
- Implementado con Tailwind
dark:classes - Estado guardado en
localStoragecon keytheme - Detecta preferencia del sistema via
prefers-color-scheme
deno task start # Desarrollo con hot-reload
deno task check # Fmt + Lint + Type check (verificación completa)
deno task fmt # Formatear código
deno task precommit # Formatear + validar (usado en pre-commit hook)
deno task build # Build de producción
deno task deploy # Desplegar a Cloudflare Workers
deno lint # Verificar lint
deno check **/*.ts # Verificar tiposEl proyecto usa Husky para garantizar calidad de código antes de cada commit.
Ejecuta automáticamente deno task precommit:
deno fmt- Formatea código automáticamentedeno lint- Valida reglas de linting (bloquea si falla)deno check **/*.ts **/*.tsx- Valida tipos TypeScript (bloquea si falla)
Después de clonar el repositorio:
deno install # Instala dependencias npm (Tailwind, Wrangler, etc.)
deno task prepare # Configura git hooks de Huskydeno task check: Usado en CI - valida sin modificar (fmt --check)deno task precommit: Usado en hook - formatea automáticamente (fmt)
git commit --no-verify -m "mensaje"Nota: El CI de GitHub Actions ejecuta deno task check y validará de todas
formas.
Hook no se ejecuta:
# Re-instalar hooks
deno task prepareDeno no encontrado en hook:
El hook .husky/pre-commit ya incluye export PATH="$HOME/.deno/bin:$PATH"
para garantizar que Deno esté disponible. Si aún falla, verificar:
# Verificar que Deno está instalado
which deno
# Si no está, instalarlo:
curl -fsSL https://deno.land/install.sh | shHook muy lento:
- Considerar usar
lint-stagedpara verificar solo archivos modificados - Por ahora,
deno checkverifica todos los archivos .ts/.tsx
interface MiddlewareState {
lang: string;
translations: typeof translations;
}
interface Data {
languages: string[];
}
export const handler: Handlers<Data, MiddlewareState> = {
async GET(_, ctx) {
const languages = await getLanguages();
return ctx.render({ languages });
},
};
export default function Home(
{ state, data }: PageProps<Data, MiddlewareState>,
) {
// state contiene lang y translations del middleware
// data contiene los datos del handler
}"use client";
import { useEffect, useState } from "preact/hooks";
export default function Component() {
const [state, setState] = useState(initialValue);
useEffect(() => {
// Efectos de cliente
}, []);
return <button onClick={() => setState(!state)}>Toggle</button>;
}deno.json- Configuración de tareas, imports y lintfresh.config.ts- Plugins de Fresh (Tailwind)tailwind.config.ts- Configuración de Tailwindwrangler.jsonc- Configuración de Cloudflare Workers.github/workflows/deploy.yml- Pipeline de CI/CD
- El proyecto está configurado para Cloudflare Workers
- Secrets necesarios:
CLOUDFLARE_API_TOKENyCLOUDFLARE_ACCOUNT_IDen GitHub Actions - El archivo
static/styles.csses generado por Tailwind durante el build
- V8 Isolates: Sin filesystem, solo APIs Web Standards
- Cold start: ~5ms (súper rápido)
- 300+ edge locations: Latencia ultra baja global
- ❌ NO
Deno.readTextFile()/Deno.writeFile()- sin filesystem - ❌ NO
Deno.env.get()- usar env bindings de Cloudflare - ✅ Usar imports estáticos para assets (JSON, archivos)
⚠️ Límite CPU: 50ms por request (plan gratuito)⚠️ Bundle size: 1MB compressed
- Servidos desde Cloudflare CDN (configurado en
wrangler.jsonc) - Directorio
./staticsube automáticamente - Accesibles vía rutas absolutas (ej:
/styles.css)
- Importadas estáticamente en
utils/i18n.ts - Bundleadas en build time (no filesystem en runtime)
- Agregar nuevo idioma requiere rebuild + deploy