Next.js 16 vs Remix
Next.js 16 (Turbopack por defecto, Partial Prerendering) frente a Remix (Shopify, estándares web) — comparación de meta-frameworks de React en 2026.
El origen de Next.js — despliega las funciones más nuevas sin demora y con configuración cero
Red global de isolates V8 — egress cero, ahora con su propia capa Next.js llamada vinext
Depende del escenario. Si quieres las funciones más nuevas de Next.js sin demora, elige Vercel — riesgo de paridad cero. Si tu proyecto tiene mucho ancho de banda, alcance global y priorizas la previsibilidad de costes, Cloudflare es la apuesta correcta; junto a OpenNext ahora también está vinext, todavía en beta pero en rápido desarrollo. En trabajo crítico empieza con OpenNext, y prueba vinext en un proyecto nuevo.
| Categoría | Vercel | Cloudflare (Workers + Pages) |
|---|---|---|
| Rendimiento | 8/10 | 9/10 |
| Facilidad de aprendizaje | 9/10 | 6/10 |
| Ecosistema | 9/10 | 7/10 |
| Comunidad | 9/10 | 8/10 |
| Mercado laboral | 8/10 | 7/10 |
| A prueba de futuro | 8/10 | 8/10 |
// Vercel — Next.js 16 App Router, Cache Components (PPR por defecto) + purge on-demand
// next.config.ts
import type { NextConfig } from "next";
const nextConfig: NextConfig = {
cacheComponents: true,
};
export default nextConfig;
// app/blog/[slug]/page.tsx — datos cacheados con 'use cache' + cacheTag
import { cacheTag } from "next/cache";
async function getPost(slug: string) {
"use cache";
cacheTag(`post-${slug}`);
const res = await fetch(`https://api.example.com/posts/${slug}`);
return res.json();
}
export default async function BlogPost({
params,
}: {
params: Promise<{ slug: string }>;
}) {
const { slug } = await params;
const post = await getPost(slug);
return (
<article>
<h1>{post.title}</h1>
<div dangerouslySetInnerHTML={{ __html: post.html }} />
</article>
);
}
// app/api/revalidate/route.ts — purge on-demand (Vercel Data Cache)
// "max" = stale-while-revalidate; para invalidar al instante en un webhook usa { expire: 0 }
import { revalidateTag } from "next/cache";
import { NextRequest, NextResponse } from "next/server";
export async function POST(req: NextRequest) {
const { slug } = await req.json();
revalidateTag(`post-${slug}`, "max");
return NextResponse.json({ revalidated: true });
}
// vercel.json — preferencia de región y duración de la función
{
"regions": ["fra1"],
"functions": {
"app/api/revalidate/route.ts": { "maxDuration": 10 }
}
}
// Deploy
// $ vercel --prod// Cloudflare — desplegar Next.js 16 en Workers (vinext, ruta oficial por defecto)
// 1) Primero mide la compatibilidad, luego añádelo al proyecto (vinext init genera la config de Vite)
// $ npx vinext check
// $ npx vinext init
// vite.config.ts — caché de Workers para ISR a nivel de ruta, KV para caché de datos
import { cloudflare } from "@cloudflare/vite-plugin";
import { cdnAdapter } from "@vinext/cloudflare/cache/cdn-adapter";
import { kvDataAdapter } from "@vinext/cloudflare/cache/kv-data-adapter";
import { defineConfig } from "vite";
import vinext from "vinext";
export default defineConfig({
plugins: [
vinext({
// cdnAdapter solo funciona si wrangler.jsonc tiene "cache": { "enabled": true }
cache: { cdn: cdnAdapter(), data: kvDataAdapter() },
}),
cloudflare({
viteEnvironment: { name: "rsc", childEnvironments: ["ssr"] },
}),
],
});
// Deploy — genera la configuración del Worker automáticamente
// $ npx @vinext/cloudflare deploy
// Alternativa: adaptador OpenNext — open-next.config.ts
import { defineCloudflareConfig } from "@opennextjs/cloudflare";
import r2IncrementalCache from "@opennextjs/cloudflare/overrides/incremental-cache/r2-incremental-cache";
export default defineCloudflareConfig({ incrementalCache: r2IncrementalCache });
// $ opennextjs-cloudflare build && opennextjs-cloudflare deploy
// Access for Workers — vincular el Worker a la aplicación Access
// POST /accounts/{account_id}/access/apps
// "destinations": [{ "type": "worker", "worker_id": "<worker-id>" }]Depende del escenario. Si quieres las funciones más nuevas de Next.js sin demora, elige Vercel — riesgo de paridad cero. Si tu proyecto tiene mucho ancho de banda, alcance global y priorizas la previsibilidad de costes, Cloudflare es la apuesta correcta; junto a OpenNext ahora también está vinext, todavía en beta pero en rápido desarrollo. En trabajo crítico empieza con OpenNext, y prueba vinext en un proyecto nuevo.
Solicita una consultoría gratuitaNo del todo, pero está cerca: la nueva capa vinext de Cloudflare soporta ~94% de la superficie de la API de Next.js 16 (App Router, Server Actions, ISR, middleware) y es la ruta oficial por defecto — pero sigue en beta; la documentación indica ejecutar `npx vinext check` antes de adoptarla en una aplicación de producción existente. El adaptador más maduro `@opennextjs/cloudflare` tiene, en cambio, un problema de obsolescencia en el backend de caché R2 para ISR+Partial Prerendering (issue abierto en GitHub).