{"id":35991,"date":"2026-06-15T11:18:54","date_gmt":"2026-06-15T09:18:54","guid":{"rendered":"https:\/\/www.codemotion.com\/magazine\/?p=35991"},"modified":"2026-06-15T11:18:55","modified_gmt":"2026-06-15T09:18:55","slug":"sobreviviran-los-frameworks-javascript-a-la-inteligencia-artificial","status":"publish","type":"post","link":"https:\/\/www.codemotion.com\/magazine\/es\/lenguajes-de-programacion\/sobreviviran-los-frameworks-javascript-a-la-inteligencia-artificial\/","title":{"rendered":"\u00bfLos frameworks de JS est\u00e1n quedando obsoletos o se est\u00e1n transformando para sobrevivir a la era de los agentes?"},"content":{"rendered":"\n<p>Las convenciones, la inteligencia del compilador y los l\u00edmites del servidor no son detalles de ergonom\u00eda: son la nueva interfaz entre las codebases y los agentes de IA que trabajan dentro de ellas.<\/p>\n\n\n\n<p>Lo s\u00e9, lo s\u00e9\u2026 La pregunta, as\u00ed formulada, es realmente provocadora. Implica que existe un umbral a partir del cual los agentes de IA vuelven superfluas las abstracciones que llamamos \u201cframeworks\u201d. Adem\u00e1s, sugiere que la historia reciente de React, Next.js, Angular, Svelte, Astro, Solid y compa\u00f1\u00eda es la historia de herramientas pensadas para humanos que ahora deber\u00edan dar un paso atr\u00e1s.<\/p>\n\n\n\n<p>Es un framing c\u00f3modo para generar titulares, y casi in\u00fatil para entender qu\u00e9 est\u00e1 ocurriendo realmente en el ecosistema JavaScript. <\/p>\n\n\n\n<p>Hecha esta necesaria aclaraci\u00f3n, quit\u00e9monos el sombrero de papel de aluminio y empecemos a observar que lo que est\u00e1 pasando es m\u00e1s interesante que espectacular. Los frameworks no est\u00e1n retrocediendo. Est\u00e1n cambiando de interlocutor. Durante quince a\u00f1os han optimizado una \u00fanica m\u00e9trica: la Developer Experience, porque su usuario principal era un ser humano frente a un IDE.<\/p>\n\n\n\n<p>Desde hace unos dos a\u00f1os, esta premisa ha dejado de ser cierta. Una cuota creciente del c\u00f3digo que entra en producci\u00f3n es generado, modificado u orquestado por un agente de IA: <a href=\"https:\/\/cursor.com\/\" target=\"_blank\" rel=\"noreferrer noopener\">Cursor<\/a>,\u00a0<a href=\"https:\/\/claude.ai\/code\" target=\"_blank\" rel=\"noreferrer noopener\">Claude Code<\/a>,\u00a0<a href=\"https:\/\/github.com\/features\/copilot\" target=\"_blank\" rel=\"noreferrer noopener\">GitHub Copilot<\/a>,\u00a0<a href=\"https:\/\/devin.ai\/\">Devin<\/a>,\u00a0<a href=\"https:\/\/windsurf.com\/\">Windsurf<\/a>,\u00a0 el que prefieras. El usuario del framework ya no es solo un humano. Es un sistema software con sus l\u00edmites, sus sesgos y sus \u201cpreferencias\u201d (si es que podemos llamarlas as\u00ed). <\/p>\n\n\n\n<figure class=\"wp-block-image size-full\"><img loading=\"lazy\" decoding=\"async\" width=\"1024\" height=\"683\" src=\"https:\/\/www.codemotion.com\/magazine\/wp-content\/uploads\/2026\/06\/image-4.png\" alt=\"\" class=\"wp-image-35993\" srcset=\"https:\/\/www.codemotion.com\/magazine\/wp-content\/uploads\/2026\/06\/image-4.png 1024w, https:\/\/www.codemotion.com\/magazine\/wp-content\/uploads\/2026\/06\/image-4-300x200.png 300w, https:\/\/www.codemotion.com\/magazine\/wp-content\/uploads\/2026\/06\/image-4-768x512.png 768w, https:\/\/www.codemotion.com\/magazine\/wp-content\/uploads\/2026\/06\/image-4-600x400.png 600w\" sizes=\"auto, (max-width: 1024px) 100vw, 1024px\" \/><\/figure>\n\n\n\n<p>Los frameworks que sobrevivan a los pr\u00f3ximos cinco a\u00f1os ser\u00e1n aquellos que est\u00e9n redise\u00f1ando sus convenciones tambi\u00e9n para este nuevo usuario. No deben sustituir al humano, sino permitir que agente e ingeniero trabajen juntos. El punto central de este art\u00edculo es que el framework, en la era agentica, deja de ser una \u201ccomodidad para quien escribe c\u00f3digo\u201d y se convierte en algo estructuralmente distinto: una capa de compresi\u00f3n cognitiva entre la intenci\u00f3n (humana o del agente) y la m\u00e1quina.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\" id=\"h-de-dx-a-adx\">De DX a ADX<\/h2>\n\n\n\n<p>Durante a\u00f1os, la m\u00e9trica dominante ha sido la Developer Experience (DX para los amigos): tiempo de setup, ergonom\u00eda de las APIs, calidad de los errores, hot reload, autocompletado. Era una m\u00e9trica calibrada para un cerebro humano leyendo c\u00f3digo pieza a pieza.<\/p>\n\n\n\n<p>En el \u00faltimo a\u00f1o (m\u00e1s o menos), est\u00e1 emergiendo una m\u00e9trica paralela que, a falta de mejor nombre, podemos llamar Agent Developer Experience (ADX). \u00bfQu\u00e9 es la ADX?<\/p>\n\n\n\n<p>Se refiere a lo f\u00e1cil que es, para un agente de IA:<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li>navegar una codebase<\/li>\n\n\n\n<li>entender qu\u00e9 modificar<\/li>\n\n\n\n<li>hacer la modificaci\u00f3n correcta al primer intento<\/li>\n\n\n\n<li>no romper aquello que no ve o que todav\u00eda no \u201cconoce\u201d<\/li>\n<\/ul>\n\n\n\n<p>La ADX no es lo opuesto a la DX: es su derivada, si queremos usar t\u00e9rminos matem\u00e1ticos. Las caracter\u00edsticas que hacen que un c\u00f3digo sea legible para un humano competente (convenciones estables, dependencias expl\u00edcitas, tipos end-to-end, side effects localizados) son las mismas que lo hacen manipulable por un LLM. Pero con una diferencia de escala: cuando el c\u00f3digo se genera en masa, incluso peque\u00f1as ambig\u00fcedades se amplifican en errores enormes y poco controlables.<\/p>\n\n\n\n<p>Seguro que lo hab\u00e9is visto: empiezas con una petici\u00f3n simple como \u201ccr\u00e9ame un hook de React\u201d y, veinte minutos despu\u00e9s, est\u00e1s perdido entre tests, linters que no pasan y un \u201cspaghetti code\u201d indescifrable.<\/p>\n\n\n\n<p>Los frameworks modernos est\u00e1n respondiendo a esta presi\u00f3n de forma bastante coherente: file-based routing, server components, typed routing\u2026 Son todas respuestas al mismo problema: reducir la variabilidad del output. Hacer que, para una intenci\u00f3n dada, exista un n\u00famero reducido de soluciones plausibles, idealmente una sola.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\" id=\"h-la-tesis-de-la-compresion-cognitiva\">La tesis de la compresi\u00f3n cognitiva<\/h2>\n\n\n\n<p>Para entender por qu\u00e9 esta convergencia no es casual, conviene dar un paso atr\u00e1s. Un sistema software complejo se caracteriza por la entrop\u00eda de decisiones que deben tomar quienes trabajan en \u00e9l:<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li>\u00bfD\u00f3nde va ese componente?<\/li>\n\n\n\n<li>\u00bfC\u00f3mo se hace fetch de datos?<\/li>\n\n\n\n<li>\u00bfD\u00f3nde empieza el servidor?<\/li>\n\n\n\n<li>\u00bfC\u00f3mo se declara una ruta?<\/li>\n<\/ul>\n\n\n\n<p>Cada pregunta admite m\u00faltiples respuestas t\u00e9cnicamente equivalentes, pero cognitivamente costosas.<\/p>\n\n\n\n<p>Un framework opinionado responde a estas preguntas antes de que se formulen. Reduce la varianza. Comprime el espacio de decisiones. Para un equipo humano esto es ergonom\u00eda. Para un agente de IA es algo m\u00e1s cr\u00edtico: es la condici\u00f3n para que su output sea verificable.<\/p>\n\n\n\n<p>Repit\u00e1moslo como un mantra: un LLM no \u201ccomprende\u201d el c\u00f3digo en sentido fuerte. Un LLM razona sobre patrones, sobre distribuciones estad\u00edsticas de tokens, sobre estructuras sint\u00e1cticas aprendidas durante el entrenamiento. Un LLM funciona mejor donde las estructuras est\u00e1n m\u00e1s representadas y son m\u00e1s estables.<\/p>\n\n\n\n<figure class=\"wp-block-image size-full\"><img loading=\"lazy\" decoding=\"async\" width=\"1024\" height=\"683\" src=\"https:\/\/www.codemotion.com\/magazine\/wp-content\/uploads\/2026\/06\/image-5.png\" alt=\"\" class=\"wp-image-35994\" srcset=\"https:\/\/www.codemotion.com\/magazine\/wp-content\/uploads\/2026\/06\/image-5.png 1024w, https:\/\/www.codemotion.com\/magazine\/wp-content\/uploads\/2026\/06\/image-5-300x200.png 300w, https:\/\/www.codemotion.com\/magazine\/wp-content\/uploads\/2026\/06\/image-5-768x512.png 768w, https:\/\/www.codemotion.com\/magazine\/wp-content\/uploads\/2026\/06\/image-5-600x400.png 600w\" sizes=\"auto, (max-width: 1024px) 100vw, 1024px\" \/><\/figure>\n\n\n\n<p>Un App Router de Next.js, con su jerarqu\u00eda <code>app\/[segment]\/page.tsx<\/code>, es f\u00e1cil de representar para un modelo: a una ruta URL le corresponde un archivo, a un layout otro archivo, a un loading state otro m\u00e1s. Una SPA en React con react-router configurado manualmente en un <code>App.tsx<\/code>, con lazy imports dispersos y providers anidados, obliga al modelo a reconstruir un mapa que el framework ha decidido no imponer. El primer caso es legible. El segundo debe interpretarse.<\/p>\n\n\n\n<p><strong>La diferencia, en producci\u00f3n, no es te\u00f3rica: <\/strong>se mide en el n\u00famero de archivos que el agente toca para implementar una feature, en la probabilidad de modificar el archivo correcto a la primera, y en la cantidad de c\u00f3digo que el senior tiene que reescribir durante el review.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\" id=\"h-anatomia-de-un-framework-ai-native\">Anatom\u00eda de un framework \u201cAI-native\u201d<\/h2>\n\n\n\n<p>Ahora que hemos aclarado qu\u00e9 es la ADX y por qu\u00e9 es relevante, podemos analizar cinco caracter\u00edsticas que est\u00e1n emergiendo como patrones comunes en frameworks adaptados a la era agentica.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\" id=\"h-convenciones-basadas-en-archivos-comprensibles-sin-documentacion\">Convenciones basadas en archivos comprensibles sin documentaci\u00f3n<\/h3>\n\n\n\n<p>Next.js App Router, \u00a0<a href=\"https:\/\/nuxt.com\/\" target=\"_blank\" rel=\"noreferrer noopener\">Nuxt<\/a>,\u00a0<a href=\"https:\/\/kit.svelte.dev\/\">SvelteKit<\/a>,\u00a0<a href=\"https:\/\/start.solidjs.com\/\">SolidStart<\/a>,, Astro, \u00a0<a href=\"https:\/\/qwik.dev\/\">Qwik City<\/a>,\u00a0<a href=\"https:\/\/tanstack.com\/start\">TanStack Start<\/a>:\u00a0: todos convergen en sistemas de ficheros donde la posici\u00f3n del archivo es informaci\u00f3n en s\u00ed misma. No es un detalle est\u00e9tico: es una API legible sin necesidad de manual (humano o m\u00e1quina). Una codebase con <code>app\/dashboard\/[id]\/page.tsx<\/code> y <code>app\/dashboard\/[id]\/layout.tsx<\/code> explica su arquitectura sin README.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\" id=\"h-reactividad-explicita-no-magica\">Reactividad expl\u00edcita, no m\u00e1gica<\/h3>\n\n\n\n<p>Los frameworks compiler-first (como Svelte) tienen una ventaja estructural: el c\u00f3digo se traduce de forma formal y determinista. Las runes de Svelte 5 y los signals de Solid o Angular son modelos declarativos de reactividad: no dependen del orden de ejecuci\u00f3n (como los hooks de React) ni de reglas de linting para ser correctos.<\/p>\n\n\n\n<p>Para un LLM que modifica reactividad, la diferencia es enorme. Un closure stale en un <code>useEffect<\/code> es un bug cl\u00e1sico que los agentes siguen reproduciendo. Una rune declarada con <code>$state<\/code> es casi imposible de romper de la misma forma. Es precisamente este tipo de previsibilidad lo que la memoizaci\u00f3n <a href=\"https:\/\/react.dev\/learn\/react-compiler\">intenta recuperar a nivel de compilador.<\/a><\/p>\n\n\n\n<blockquote class=\"wp-block-quote is-layout-flow wp-block-quote-is-layout-flow\">\n<p>Optimiza autom\u00e1ticamente tu aplicaci\u00f3n React gestionando la memorizaci\u00f3n por ti, eliminando la necesidad de usar manualmente <code>useMemo<\/code>, <code>useCallback<\/code> y <code>React.memo<\/code>.<\/p>\n<\/blockquote>\n\n\n\n<h3 class=\"wp-block-heading\" id=\"h-tipos-end-to-end\">Tipos end-to-end<\/h3>\n\n\n\n<p><a href=\"https:\/\/tanstack.com\/router\/latest\">TanStack Router<\/a> ha convertido el routing tipado en una caracter\u00edstica de primera clase: par\u00e1metros de ruta, search params y loaders son tipos que fluyen a trav\u00e9s de la app. Next.js est\u00e1 llegando a lo mismo por otra v\u00eda, con<a href=\"https:\/\/nextjs.org\/docs\/app\/api-reference\/config\/next-config-js\/typedRoutes\" target=\"_blank\" rel=\"noreferrer noopener\"> typed routes<\/a> y Server Actions tipadas en el boundary.<\/p>\n\n\n\n<p>Para un agente, el tipado end-to-end es una red de seguridad que evita toda una clase de outputs plausibles pero incorrectos.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\" id=\"h-server-boundaries-explicitos\">Server boundaries expl\u00edcitos<\/h3>\n\n\n\n<p>Los React Server Components, las Server Actions de Next.js y React Router 7, los loaders\/actions de TanStack Start, o los <code>+page.server.ts<\/code> de SvelteKit son intentos de hacer visible d\u00f3nde termina el cliente y d\u00f3nde empieza el servidor.<\/p>\n\n\n\n<p>Sin esta declaraci\u00f3n, cada componente es potencialmente todo a la vez. Un agente que genera c\u00f3digo debe adivinar. Con esta separaci\u00f3n expl\u00edcita, el problema desaparece.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\" id=\"h-metadatos-estructurados-e-introspeccion\">Metadatos estructurados e introspecci\u00f3n<\/h3>\n\n\n\n<p><a href=\"https:\/\/docs.astro.build\/en\/guides\/content-collections\/#defining-datatypes-with-zod\" target=\"_blank\" rel=\"noreferrer noopener\">Astro Content Collections con schema Zod,<\/a> frontmatter tipado, manifiestos de build, route manifests\u2026 Son formas de exponer la estructura de la app en formato legible por m\u00e1quinas. Aqu\u00ed entra MCP <a href=\"https:\/\/modelcontextprotocol.io\/\" target=\"_blank\" rel=\"noreferrer noopener\">(Model Context Protocol)<\/a>, que se est\u00e1 convirtiendo en est\u00e1ndar de facto para exponer contexto y capacidades a agentes. Un servidor MCP que publica rutas, layouts y server functions de una app Next.js marca la diferencia entre un agente que hace grep y uno que hace queries estructuradas.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\" id=\"h-framework-por-framework-sin-fanatismos\">Framework por framework, sin fanatismos<\/h2>\n\n\n\n<p>Vale la pena ver algunos ejemplos. Para cada uno se explora el mismo caso m\u00ednimo (una ruta que obtiene una lista de usuarios desde una API y la renderiza), porque es la forma m\u00e1s honesta de comparar c\u00f3mo se adaptan al ADX.<\/p>\n\n\n\n<p>La pregunta impl\u00edcita es siempre la misma: si a un agente le pido \u201ca\u00f1ade una p\u00e1gina \/users que liste usuarios\u201d, \u00bfcu\u00e1ntas decisiones tiene que tomar por s\u00ed solo y cu\u00e1l es la probabilidad de que las tome bien?<\/p>\n\n\n\n<h3 class=\"wp-block-heading\" id=\"h-next-js-app-router\">Next.js (App Router)<\/h3>\n\n\n\n<p>Next.js es el ejemplo m\u00e1s claro de framework que se est\u00e1 transformando en protocolo. App Router, Server Actions, integraci\u00f3n nativa con el AI SDK de Vercel, soporte creciente de MCP, generadores como v0 que producen directamente c\u00f3digo Next.js: es un sistema donde las decisiones de runtime, build, edge y data fetching est\u00e1n predefinidas para un modelo mental concreto.<\/p>\n\n\n\n<p>La contrapartida es la concentraci\u00f3n: elegir Next.js<strong> significa adoptar, en gran medida, la visi\u00f3n de Vercel sobre el futuro de la web. <\/strong>Para muchos equipos es un trade-off razonable. Para otros, es una preocupaci\u00f3n leg\u00edtima, y el debate sobre React Server Components fuera del ecosistema Next es un s\u00edntoma evidente de ello.<\/p>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-1\" data-shcb-language-name=\"JSON \/ JSON with Comments\" data-shcb-language-slug=\"json\"><span><code class=\"hljs language-json\"><span class=\"hljs-comment\">\/\/ app\/users\/page.tsx &lt;strong&gt;export&lt;\/strong&gt; &lt;strong&gt;default&lt;\/strong&gt; &lt;strong&gt;async&lt;\/strong&gt; &lt;strong&gt;function&lt;\/strong&gt; &lt;strong&gt;UsersPage&lt;\/strong&gt;() { &lt;strong&gt;const&lt;\/strong&gt; users = &lt;strong&gt;await&lt;\/strong&gt; fetch('https:\/\/api.example.com\/users') .then((r) =&gt; r.json()) &lt;strong&gt;return&lt;\/strong&gt; ( &lt;&lt;strong&gt;ul&lt;\/strong&gt;&gt; {users.map((u) =&gt; &lt;&lt;strong&gt;li&lt;\/strong&gt; key={u.id}&gt;{u.name}&lt;\/&lt;strong&gt;li&lt;\/strong&gt;&gt;)} &lt;\/&lt;strong&gt;ul&lt;\/strong&gt;&gt; ) }<\/span><\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-1\"><span class=\"shcb-language__label\">Code language:<\/span> <span class=\"shcb-language__name\">JSON \/ JSON with Comments<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">json<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n\n\n<p>ADX: la ruta del archivo es la URL, el componente es server-side por defecto (es un async server component), el fetch no requiere useEffect, ni react-query, ni un store. Un agente que recibe \u201ca\u00f1ade una p\u00e1gina \/users que liste los usuarios\u201d sabe exactamente d\u00f3nde crear el archivo, qu\u00e9 firma usar y que el fetch es server-side sin tener que tomar decisiones. El espacio de soluciones plausibles es min\u00fasculo.<\/p>\n\n\n\n<p>Modificar la p\u00e1gina para a\u00f1adir cach\u00e9, streaming o revalidaci\u00f3n requiere tocar el mismo archivo con primitivas bien conocidas (fetch con next.revalidate, , revalidatePath). Alta densidad de convenci\u00f3n por l\u00ednea de c\u00f3digo.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\" id=\"h-react-sin-framework\">React sin framework<\/h2>\n\n\n\n<p>React \u201cpuro y duro\u201d es la posici\u00f3n que la era agentica est\u00e1 penalizando m\u00e1s. No porque React sea obsoleto, sino porque la combinaci\u00f3n \u201cReact + Vite + react-router + tanstack-query + zustand + librer\u00eda de formularios + librer\u00eda de tablas\u201d es una colecci\u00f3n de decisiones locales \u00f3ptimas que no se comunican entre s\u00ed.<\/p>\n\n\n\n<p><strong>Cada proyecto es casi artesanal.<\/strong> Cada agente, frente a uno de estos proyectos, tiene que reconstruir convenciones que no existen (o que est\u00e1n en la cabeza del desarrollador que cre\u00f3 el proyecto) y trabajar con \u201clo que hay\u201d.<\/p>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-2\" data-shcb-language-name=\"JSON \/ JSON with Comments\" data-shcb-language-slug=\"json\"><span><code class=\"hljs language-json\"><span class=\"hljs-comment\">\/\/ src\/App.tsx &lt;strong&gt;import&lt;\/strong&gt; { BrowserRouter, Routes, Route } &lt;strong&gt;from&lt;\/strong&gt; 'react-router-dom' &lt;strong&gt;import&lt;\/strong&gt; { QueryClient, QueryClientProvider, useQuery } &lt;strong&gt;from&lt;\/strong&gt; '@tanstack\/react-query' &lt;strong&gt;const&lt;\/strong&gt; qc = &lt;strong&gt;new&lt;\/strong&gt; QueryClient() &lt;strong&gt;function&lt;\/strong&gt; &lt;strong&gt;UsersPage&lt;\/strong&gt;() { &lt;strong&gt;const&lt;\/strong&gt; { data, isLoading } = useQuery({ queryKey: &#91;'users'], queryFn: () =&gt; fetch('\/api\/users').then((r) =&gt; r.json()), }) &lt;strong&gt;if&lt;\/strong&gt; (isLoading) &lt;strong&gt;return&lt;\/strong&gt; &lt;&lt;strong&gt;div&lt;\/strong&gt;&gt;Loading\u2026&lt;\/&lt;strong&gt;div&lt;\/strong&gt;&gt; &lt;strong&gt;return&lt;\/strong&gt; &lt;&lt;strong&gt;ul&lt;\/strong&gt;&gt;{data.map((u: any) =&gt; &lt;&lt;strong&gt;li&lt;\/strong&gt; key={u.id}&gt;{u.name}&lt;\/&lt;strong&gt;li&lt;\/strong&gt;&gt;)}&lt;\/&lt;strong&gt;ul&lt;\/strong&gt;&gt; } &lt;strong&gt;export&lt;\/strong&gt; &lt;strong&gt;default&lt;\/strong&gt; &lt;strong&gt;function&lt;\/strong&gt; &lt;strong&gt;App&lt;\/strong&gt;() { &lt;strong&gt;return&lt;\/strong&gt; ( &lt;&lt;strong&gt;QueryClientProvider&lt;\/strong&gt; client={qc}&gt; &lt;&lt;strong&gt;BrowserRouter&lt;\/strong&gt;&gt; &lt;&lt;strong&gt;Routes&lt;\/strong&gt;&gt; &lt;&lt;strong&gt;Route&lt;\/strong&gt; path=\"\/users\" element={&lt;UsersPage \/&gt;} \/&gt; &lt;\/&lt;strong&gt;Routes&lt;\/strong&gt;&gt; &lt;\/&lt;strong&gt;BrowserRouter&lt;\/strong&gt;&gt; &lt;\/&lt;strong&gt;QueryClientProvider&lt;\/strong&gt;&gt; ) }<\/span><\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-2\"><span class=\"shcb-language__label\">Code language:<\/span> <span class=\"shcb-language__name\">JSON \/ JSON with Comments<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">json<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n\n\n<p><strong>ADX<\/strong>: nada est\u00e1ndar. El agente tiene que descubrir por s\u00ed mismo d\u00f3nde est\u00e1n declaradas las rutas (\u00bfun componente en alg\u00fan sitio? \u00bfun archivo routes.ts? \u00bfimports lazy?), qu\u00e9 fetcher se est\u00e1 usando (\u00bfreact-query? \u00bfswr? \u00bffetch directo? \u00bfun cliente API personalizado?), d\u00f3nde viven los providers, si hay SSR. Cada decisi\u00f3n es arbitraria, cada proyecto es distinto. La probabilidad de que el agente genere c\u00f3digo \u201cplausible pero incoherente con el resto\u201d es alta, y crece con el tama\u00f1o del repositorio.<\/p>\n\n\n\n<p>La verdadera pregunta que hay que hacerse en 2026 ya no es \u201cqu\u00e9 librer\u00eda de UI\u201d, sino \u201cqu\u00e9 framework alrededor de React\u201d.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\" id=\"h-angular\">Angular<\/h2>\n\n\n\n<p><strong>Angular est\u00e1 viviendo un renacimiento silencioso que muchos comentaristas<a href=\"https:\/\/angular.dev\/guide\/components\"> est\u00e1n ignorando<\/a><\/strong>. Componentes standalone, signals, control flow nativo, defer block: el Angular de 2026 es un framework profundamente distinto al de los NgModule, y es (parad\u00f3jicamente) uno de los m\u00e1s amigables para LLMs que existen.<\/p>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-3\" data-shcb-language-name=\"HTML, XML\" data-shcb-language-slug=\"xml\"><span><code class=\"hljs language-xml\">\/\/ app\/users\/users.component.ts\n<span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">strong<\/span>&gt;<\/span>import<span class=\"hljs-tag\">&lt;\/<span class=\"hljs-name\">strong<\/span>&gt;<\/span> { Component, inject } <span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">strong<\/span>&gt;<\/span>from<span class=\"hljs-tag\">&lt;\/<span class=\"hljs-name\">strong<\/span>&gt;<\/span> '@angular\/core'\n<span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">strong<\/span>&gt;<\/span>import<span class=\"hljs-tag\">&lt;\/<span class=\"hljs-name\">strong<\/span>&gt;<\/span> { HttpClient } <span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">strong<\/span>&gt;<\/span>from<span class=\"hljs-tag\">&lt;\/<span class=\"hljs-name\">strong<\/span>&gt;<\/span> '@angular\/common\/http'\n<span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">strong<\/span>&gt;<\/span>import<span class=\"hljs-tag\">&lt;\/<span class=\"hljs-name\">strong<\/span>&gt;<\/span> { toSignal } <span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">strong<\/span>&gt;<\/span>from<span class=\"hljs-tag\">&lt;\/<span class=\"hljs-name\">strong<\/span>&gt;<\/span> '@angular\/core\/rxjs-interop'\n\n@Component({\n  standalone: true,\n  template: `\n    <span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">ul<\/span>&gt;<\/span>\n      @for (u of users(); track u.id) {\n        <span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">li<\/span>&gt;<\/span>{{ u.name }}<span class=\"hljs-tag\">&lt;\/<span class=\"hljs-name\">li<\/span>&gt;<\/span>\n      }\n    <span class=\"hljs-tag\">&lt;\/<span class=\"hljs-name\">ul<\/span>&gt;<\/span>\n  `,\n})\n<span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">strong<\/span>&gt;<\/span>export<span class=\"hljs-tag\">&lt;\/<span class=\"hljs-name\">strong<\/span>&gt;<\/span> <span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">strong<\/span>&gt;<\/span>class<span class=\"hljs-tag\">&lt;\/<span class=\"hljs-name\">strong<\/span>&gt;<\/span> <span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">strong<\/span>&gt;<\/span>UsersComponent<span class=\"hljs-tag\">&lt;\/<span class=\"hljs-name\">strong<\/span>&gt;<\/span> {\n  private http = inject(HttpClient)\n\n  users = toSignal(\n    <span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">strong<\/span>&gt;<\/span>this<span class=\"hljs-tag\">&lt;\/<span class=\"hljs-name\">strong<\/span>&gt;<\/span>.http.get<span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">{<\/span> <span class=\"hljs-attr\">id:<\/span> <span class=\"hljs-attr\">number<\/span>; <span class=\"hljs-attr\">name:<\/span> <span class=\"hljs-attr\">string<\/span> }&#91;]&gt;<\/span>('\/api\/users'),\n    { initialValue: &#91;] }\n  )\n}\n\n\/\/ app.routes.ts\n<span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">strong<\/span>&gt;<\/span>import<span class=\"hljs-tag\">&lt;\/<span class=\"hljs-name\">strong<\/span>&gt;<\/span> { Routes } <span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">strong<\/span>&gt;<\/span>from<span class=\"hljs-tag\">&lt;\/<span class=\"hljs-name\">strong<\/span>&gt;<\/span> '@angular\/router'\n<span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">strong<\/span>&gt;<\/span>export<span class=\"hljs-tag\">&lt;\/<span class=\"hljs-name\">strong<\/span>&gt;<\/span> <span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">strong<\/span>&gt;<\/span>const<span class=\"hljs-tag\">&lt;\/<span class=\"hljs-name\">strong<\/span>&gt;<\/span> routes: Routes = &#91;\n  {\n    path: 'users',\n    loadComponent: () =&gt;\n      <span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">strong<\/span>&gt;<\/span>import<span class=\"hljs-tag\">&lt;\/<span class=\"hljs-name\">strong<\/span>&gt;<\/span>('.\/users\/users.component').then((m) =&gt; m.UsersComponent),\n  },\n]<\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-3\"><span class=\"shcb-language__label\">Code language:<\/span> <span class=\"shcb-language__name\">HTML, XML<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">xml<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n\n\n<p><strong>ADX<\/strong>: dependencias inyectadas expl\u00edcitamente (inject(HttpClient)), signals declarativos en lugar de observables \u201cm\u00e1gicos\u201d, control flow nativo (@for con track). Para un LLM todo es expl\u00edcito: qu\u00e9 se importa, d\u00f3nde vive el estado, c\u00f3mo se itera, d\u00f3nde la ruta carga el componente.<\/p>\n\n\n\n<p>Pocos misterios en tiempo de ejecuci\u00f3n, convenciones rigurosas, errores del compilador claros: si el ecosistema enterprise lo est\u00e1 redescubriendo, una de las razones es precisamente esta.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\" id=\"h-vue-nuxt\">Vue \/ Nuxt<\/h2>\n\n\n\n<p><a href=\"https:\/\/vuejs.org\/\">Vue<\/a> y Nuxt ocupan el nicho de \u201clo aburrido es bonito\u201d: convenciones s\u00f3lidas, ecosistema maduro, sin cambios radicales. Para muchos equipos es exactamente lo que hace falta.<\/p>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-4\" data-shcb-language-name=\"PHP\" data-shcb-language-slug=\"php\"><span><code class=\"hljs language-php\">&lt;!-- pages\/users.vue --&gt; &lt;&lt;strong&gt;script&lt;\/strong&gt; setup lang=<span class=\"hljs-string\">\"ts\"<\/span>&gt; &lt;strong&gt;<span class=\"hljs-class\"><span class=\"hljs-keyword\">interface<\/span>&lt;\/<span class=\"hljs-title\">strong<\/span>&gt; &lt;<span class=\"hljs-title\">strong<\/span>&gt;<span class=\"hljs-title\">User<\/span>&lt;\/<span class=\"hljs-title\">strong<\/span>&gt; <\/span>{ id: number; name: string } &lt;strong&gt;<span class=\"hljs-keyword\">const<\/span>&lt;\/strong&gt; { data: users } = await useFetch&lt;User&#91;]&gt;(<span class=\"hljs-string\">'\/api\/users'<\/span>) &lt;\/&lt;strong&gt;script&lt;\/strong&gt;&gt; &lt;&lt;strong&gt;template&lt;\/strong&gt;&gt; &lt;&lt;strong&gt;ul&lt;\/strong&gt;&gt; &lt;&lt;strong&gt;li&lt;\/strong&gt; v-<span class=\"hljs-keyword\">for<\/span>=<span class=\"hljs-string\">\"u in users\"<\/span> :key=<span class=\"hljs-string\">\"u.id\"<\/span>&gt;{{ u.name }}&lt;\/&lt;strong&gt;li&lt;\/strong&gt;&gt; &lt;\/&lt;strong&gt;ul&lt;\/strong&gt;&gt; &lt;\/&lt;strong&gt;template&lt;\/strong&gt;&gt;<\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-4\"><span class=\"shcb-language__label\">Code language:<\/span> <span class=\"shcb-language__name\">PHP<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">php<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n\n\n<p><strong>ADX<\/strong>: archivo en <code>pages\/<\/code> = ruta, <code>useFetch<\/code> es la convenci\u00f3n est\u00e1ndar (server en el primer render, cliente despu\u00e9s), componente de archivo \u00fanico con secciones declarativas claramente separadas. Para un agente es casi trivial: el patr\u00f3n es id\u00e9ntico para cualquier p\u00e1gina, el auto-import de Nuxt reduce a\u00fan m\u00e1s las decisiones. La verbosidad es baja, la ambig\u00fcedad tambi\u00e9n. Un c\u00f3digo base en Nuxt es casi siempre m\u00e1s legible que uno equivalente en complejidad en Next.js, simplemente porque el ecosistema de Vue siempre ha priorizado la convenci\u00f3n sobre la innovaci\u00f3n.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\" id=\"h-svelte-5-sveltekit\">Svelte 5 \/ SvelteKit<\/h2>\n\n\n\n<p>Svelte 5 ha hecho la apuesta m\u00e1s radical: las runes trasladan la reactividad de \u201cm\u00e1gica e impl\u00edcita\u201d a \u201cexpl\u00edcita y declarativa\u201d.<\/p>\n\n\n\n<p>\/\/ src\/routes\/users\/+page.server.ts<br>import type { PageServerLoad } from &#8216;.\/$types&#8217;<\/p>\n\n\n\n<p>export const load: PageServerLoad = async ({ fetch }) =&gt; {<br>const users = await fetch(&#8216;\/api\/users&#8217;).then((r) =&gt; r.json())<br>return { users }<br>}<br>Code language: JavaScript (javascript)<\/p>\n\n\n\n<p><strong>ADX<\/strong>: el <code>+page.server.ts<\/code> hace que el boundary cliente\/servidor sea expl\u00edcito a nivel l\u00e9xico; no es una convenci\u00f3n sint\u00e1ctica como <code>'use server'<\/code>, est\u00e1 escrito directamente en el nombre del archivo. No hay posibilidad de equivocarse.<\/p>\n\n\n\n<p>Las runes ($props, $state, $derived) son declaraciones, no llamadas sensibles al orden como los hooks de React. El compilador garantiza que la salida en runtime sea analizable y optimizada. Para un LLM que tiene que modificar un componente, la diferencia entre $state(0) y una variable cuya reactividad depende de reglas sint\u00e1cticas es la diferencia entre una API y un misterio. Es una de las ergonom\u00edas m\u00e1s favorables para agentes del mercado.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\" id=\"h-solid-solidstart\">Solid \/ SolidStart<\/h2>\n\n\n\n<p>Solid y SolidStart comparten la filosof\u00eda compiler-first de Svelte con un purismo conceptual a\u00fan m\u00e1s marcado. La reactividad granular de Solid es uno de los modelos mentales m\u00e1s limpios de todo el ecosistema.<\/p>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-5\" data-shcb-language-name=\"JSON \/ JSON with Comments\" data-shcb-language-slug=\"json\"><span><code class=\"hljs language-json\"><span class=\"hljs-comment\">\/\/ src\/routes\/users.tsx &lt;strong&gt;import&lt;\/strong&gt; { For } &lt;strong&gt;from&lt;\/strong&gt; 'solid-js' &lt;strong&gt;import&lt;\/strong&gt; { createAsync, query } &lt;strong&gt;from&lt;\/strong&gt; '@solidjs\/router' &lt;strong&gt;const&lt;\/strong&gt; getUsers = query(&lt;strong&gt;async&lt;\/strong&gt; () =&gt; { &lt;strong&gt;const&lt;\/strong&gt; res = &lt;strong&gt;await&lt;\/strong&gt; fetch('\/api\/users') &lt;strong&gt;return&lt;\/strong&gt; res.json() &lt;strong&gt;as&lt;\/strong&gt; Promise&lt;{ id: number; name: string }&#91;]&gt; }, 'users') &lt;strong&gt;export&lt;\/strong&gt; &lt;strong&gt;default&lt;\/strong&gt; &lt;strong&gt;function&lt;\/strong&gt; &lt;strong&gt;Users&lt;\/strong&gt;() { &lt;strong&gt;const&lt;\/strong&gt; users = createAsync(() =&gt; getUsers()) &lt;strong&gt;return&lt;\/strong&gt; ( &lt;&lt;strong&gt;ul&lt;\/strong&gt;&gt; &lt;&lt;strong&gt;For&lt;\/strong&gt; each={users()}&gt;{(u) =&gt; &lt;&lt;strong&gt;li&lt;\/strong&gt;&gt;{u.name}&lt;\/&lt;strong&gt;li&lt;\/strong&gt;&gt;}&lt;\/&lt;strong&gt;For&lt;\/strong&gt;&gt; &lt;\/&lt;strong&gt;ul&lt;\/strong&gt;&gt; ) }<\/span><\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-5\"><span class=\"shcb-language__label\">Code language:<\/span> <span class=\"shcb-language__name\">JSON \/ JSON with Comments<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">json<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n\n\n<p>ADX: reactividad basada en signals expl\u00edcita: los par\u00e9ntesis () revelan el acceso reactivo de un vistazo. en lugar de .map() para listas, porque Solid no vuelve a renderizar todo el componente: la diferencia es visible a nivel sint\u00e1ctico. El modelo mental es coherente al 100%: no hay casos especiales, no hay \u201creglas de hooks\u201d, no hay dependencias que declarar a mano. Para un LLM, la coherencia es oro \u2014 y no es casualidad que las ideas de Ryan Carniato hayan migrado, en formas distintas, dentro de Vue, Angular e incluso el trabajo sobre React Forget.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\" id=\"h-astro\">Astro<\/h2>\n\n\n\n<p>Astro ha elegido un posicionamiento lateral e inteligente: content-first, islands, esquema estructurado para el contenido. Es el framework que mejor se adapta a sitios donde el contenido es el producto y la interactividad es puntual.<\/p>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-6\" data-shcb-language-name=\"JavaScript\" data-shcb-language-slug=\"javascript\"><span><code class=\"hljs language-javascript\">--- <span class=\"hljs-comment\">\/\/ src\/pages\/users.astro interface User { id: number; name: string } &lt;strong&gt;const&lt;\/strong&gt; users: User&#91;] = &lt;strong&gt;await&lt;\/strong&gt; fetch('https:\/\/api.example.com\/users') .then((r) =&gt; r.json()) --- &lt;&lt;strong&gt;ul&lt;\/strong&gt;&gt; {users.map((u) =&gt; &lt;&lt;strong&gt;li&lt;\/strong&gt;&gt;{u.name}&lt;\/&lt;strong&gt;li&lt;\/strong&gt;&gt;)} &lt;\/&lt;strong&gt;ul&lt;\/strong&gt;&gt;<\/span><\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-6\"><span class=\"shcb-language__label\">Code language:<\/span> <span class=\"shcb-language__name\">JavaScript<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">javascript<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n\n\n<p>ADX: el frontmatter (&#8212;) es server-side por construcci\u00f3n, siempre, sin excepciones. El template es est\u00e1tico por defecto. No hay nada que decidir sobre cliente vs servidor: se deduce de la propia sintaxis. A\u00f1adir interactividad requiere una island expl\u00edcita (), y ese es precisamente el mecanismo que reduce la varianza para el agente. Cuando se entra en el terreno de los contenidos, las Content Collections con esquema Zod se convierten en un contrato legible para el LLM: el esquema es la documentaci\u00f3n, y el agente lo usa como tal para generar contenido coherente.<\/p>\n\n\n\n<p>Una codebase de Astro bien estructurada es uno de los terrenos m\u00e1s ergon\u00f3micos en absoluto para un agente.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\" id=\"h-qwik-qwik-city\">Qwik \/ Qwik City<\/h2>\n\n\n\n<p>Qwik es la apuesta a largo plazo: la resumabilidad sustituye la hidrataci\u00f3n, el modelo de ejecuci\u00f3n es formalmente m\u00e1s limpio, la app es \u201clazy\u201d por construcci\u00f3n.<\/p>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-7\" data-shcb-language-name=\"JSON \/ JSON with Comments\" data-shcb-language-slug=\"json\"><span><code class=\"hljs language-json\"><span class=\"hljs-comment\">\/\/ src\/routes\/users\/index.tsx &lt;strong&gt;import&lt;\/strong&gt; { component$ } &lt;strong&gt;from&lt;\/strong&gt; '@builder.io\/qwik' &lt;strong&gt;import&lt;\/strong&gt; { routeLoader$ } &lt;strong&gt;from&lt;\/strong&gt; '@builder.io\/qwik-city' &lt;strong&gt;export&lt;\/strong&gt; &lt;strong&gt;const&lt;\/strong&gt; useUsers = routeLoader$(&lt;strong&gt;async&lt;\/strong&gt; () =&gt; { &lt;strong&gt;const&lt;\/strong&gt; res = &lt;strong&gt;await&lt;\/strong&gt; fetch('https:\/\/api.example.com\/users') &lt;strong&gt;return&lt;\/strong&gt; res.json() &lt;strong&gt;as&lt;\/strong&gt; Promise&lt;{ id: number; name: string }&#91;]&gt; }) &lt;strong&gt;export&lt;\/strong&gt; &lt;strong&gt;default&lt;\/strong&gt; component$(() =&gt; { &lt;strong&gt;const&lt;\/strong&gt; users = useUsers() &lt;strong&gt;return&lt;\/strong&gt; ( &lt;&lt;strong&gt;ul&lt;\/strong&gt;&gt; {users.value.map((u) =&gt; &lt;&lt;strong&gt;li&lt;\/strong&gt; key={u.id}&gt;{u.name}&lt;\/&lt;strong&gt;li&lt;\/strong&gt;&gt;)} &lt;\/&lt;strong&gt;ul&lt;\/strong&gt;&gt; ) })<\/span><\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-7\"><span class=\"shcb-language__label\">Code language:<\/span> <span class=\"shcb-language__name\">JSON \/ JSON with Comments<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">json<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n\n\n<p>ADX: el sufijo $ no es cosm\u00e9tico, es la marca l\u00e9xica de un boundary de lazy loading, legible tanto para el compilador como para el agente como un l\u00edmite de ejecuci\u00f3n. <code>routeLoader$<\/code> es server-side por construcci\u00f3n; <code>component$<\/code> es el marcador de un componente resumable.<\/p>\n\n\n\n<p>M\u00e1s r\u00edgido que otros frameworks, pero precisamente por eso extraordinariamente legible para una m\u00e1quina: cada $ es una declaraci\u00f3n formal de \u201caqu\u00ed sucede algo espec\u00edfico\u201d, y no hay ambig\u00fcedad sobre qu\u00e9. Qwik a\u00fan no tiene el momentum de los frameworks principales, pero la formalidad de su modelo lo hace especialmente interesante para quienes piensan a largo plazo.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\" id=\"h-react-router-7-ex-remix\">React Router 7 (ex Remix)<\/h2>\n\n\n\n<p>Remix se ha convertido en React Router 7, fusionando el framework y el router en una \u00fanica entidad. El movimiento es coherente con la tesis de este art\u00edculo: cada vez menos piezas separadas, cada vez m\u00e1s contratos integrados.<\/p>\n\n\n\n<p>\/\/ app\/routes\/users.tsx <strong>import<\/strong> type { Route } <strong>from<\/strong> &#8216;.\/+types\/users&#8217; <strong>export<\/strong> <strong>async<\/strong> <strong>function<\/strong> <strong>loader<\/strong>() { <strong>const<\/strong> res = <strong>await<\/strong> fetch(&#8216;https:\/\/api.example.com\/users&#8217;) <strong>const<\/strong> users = (<strong>await<\/strong> res.json()) <strong>as<\/strong> { id: number; name: string }[] <strong>return<\/strong> { users } } <strong>export<\/strong> <strong>default<\/strong> <strong>function<\/strong> <strong>Users<\/strong>({ loaderData }: Route.ComponentProps) { <strong>return<\/strong> ( &lt;<strong>ul<\/strong>> {loaderData.users.map((u) => &lt;<strong>li<\/strong> key={u.id}>{u.name}&lt;\/<strong>li<\/strong>>)} &lt;\/<strong>ul<\/strong>> ) }<\/p>\n\n\n\n<p>ADX: patr\u00f3n loader\/component can\u00f3nico, tipos auto-generados (Route.ComponentProps viene de .\/+types\/users) que fluyen del loader al componente sin que el desarrollador (o el agente de turno) tenga que declararlos. Un agente sabe exactamente d\u00f3nde est\u00e1 el fetch (loader, server) y d\u00f3nde est\u00e1 la presentaci\u00f3n (componente, posiblemente client).<\/p>\n\n\n\n<p>La fusi\u00f3n Remix =&gt; RR7 ha consolidado este patr\u00f3n como uno de los m\u00e1s limpios del ecosistema React, y es uno de los pocos casos en los que una evoluci\u00f3n arquitect\u00f3nica ha aumentado el ADX en lugar de degradarlo.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\" id=\"h-tanstack-start\">TanStack Start<\/h2>\n\n\n\n<p>TanStack representa el anti-modelo declarado. La filosof\u00eda de Tanner Linsley es clara: en lugar de un framework opinado, primitivas fuertemente tipadas y componibles.<\/p>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-8\" data-shcb-language-name=\"JSON \/ JSON with Comments\" data-shcb-language-slug=\"json\"><span><code class=\"hljs language-json\"><span class=\"hljs-comment\">\/\/ src\/routes\/users.tsx &lt;strong&gt;import&lt;\/strong&gt; { createFileRoute } &lt;strong&gt;from&lt;\/strong&gt; '@tanstack\/react-router' &lt;strong&gt;export&lt;\/strong&gt; &lt;strong&gt;const&lt;\/strong&gt; Route = createFileRoute('\/users')({ loader: &lt;strong&gt;async&lt;\/strong&gt; () =&gt; { &lt;strong&gt;const&lt;\/strong&gt; res = &lt;strong&gt;await&lt;\/strong&gt; fetch('\/api\/users') &lt;strong&gt;return&lt;\/strong&gt; res.json() &lt;strong&gt;as&lt;\/strong&gt; Promise&lt;{ id: number; name: string }&#91;]&gt; }, component: UsersPage, }) &lt;strong&gt;function&lt;\/strong&gt; &lt;strong&gt;UsersPage&lt;\/strong&gt;() { &lt;strong&gt;const&lt;\/strong&gt; users = Route.useLoaderData() &lt;strong&gt;return&lt;\/strong&gt; ( &lt;&lt;strong&gt;ul&lt;\/strong&gt;&gt; {users.map((u) =&gt; &lt;&lt;strong&gt;li&lt;\/strong&gt; key={u.id}&gt;{u.name}&lt;\/&lt;strong&gt;li&lt;\/strong&gt;&gt;)} &lt;\/&lt;strong&gt;ul&lt;\/strong&gt;&gt; ) }<\/span><\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-8\"><span class=\"shcb-language__label\">Code language:<\/span> <span class=\"shcb-language__name\">JSON \/ JSON with Comments<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">json<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n\n\n<p>ADX: la tipizaci\u00f3n end-to-end es muy fuerte: el tipo del loader se propaga al componente, a los search params y a todos los que apuntan a esta ruta.<\/p>\n\n\n\n<p>Para un agente, TanStack es un terreno de juego excelente: los errores de tipos interceptan gran parte de las salidas incorrectas antes de que lleguen a revisi\u00f3n humana. Para un agente menos disciplinado que ignora los tipos, la verbosidad se convierte en ruido. La pregunta que la era agentica plantea sobre TanStack es honesta: \u00bfqu\u00e9 tan bien se comporta cuando la mitad del c\u00f3digo es escrito por un agente que no tiene las mismas intuiciones que el equipo que eligi\u00f3 las primitivas?<\/p>\n\n\n\n<p>Es una pregunta abierta, y que vale la pena mantener abierta.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">Qu\u00e9 ve un agente cuando entra en un repositorio<\/h2>\n\n\n\n<p>Vale la pena detenerse y ver con detalle qu\u00e9 ocurre, concretamente, cuando una herramienta como Cursor, Codex o Claude Code abre por primera vez una codebase. Es el punto donde las consideraciones te\u00f3ricas se traducen en diferencias medibles y donde la idea de \u201ccompresi\u00f3n cognitiva\u201d deja de ser met\u00e1fora.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\">Codebase indexing<\/h3>\n\n\n\n<p>La herramienta construye en segundo plano una representaci\u00f3n estructurada del proyecto. Los componentes t\u00edpicos de esta representaci\u00f3n son al menos tres:<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li>Un mapa de archivos con metadatos b\u00e1sicos (ruta, lenguaje, tama\u00f1o, hash).<\/li>\n\n\n\n<li>Un conjunto de embeddings sem\u00e1nticos calculados sobre chunks de c\u00f3digo de tama\u00f1o variable (funci\u00f3n, clase, bloque de imports, secci\u00f3n de documentaci\u00f3n).<\/li>\n\n\n\n<li>Un grafo de s\u00edmbolos p\u00fablicos (funciones exportadas, tipos, clases) derivado de an\u00e1lisis est\u00e1tico o de language servers como tsserver.<\/li>\n<\/ul>\n\n\n\n<p>Cursor publica documentaci\u00f3n expl\u00edcita sobre esto (aqu\u00ed puedes leer un buen an\u00e1lisis), y Claude Code hace algo similar de forma menos verbosa. La calidad de la indexaci\u00f3n depende en gran medida de cu\u00e1n estructurada y reconocible sea la codebase: un m\u00f3dulo llamado <code>users.ts<\/code> con un export llamado <code>getUsers<\/code> es infinitamente m\u00e1s f\u00e1cil de encontrar que una arrow function an\u00f3nima dentro de un <code>useQuery<\/code> en un componente.<\/p>\n\n\n\n<p>Cuando llega un prompt tipo \u201ca\u00f1ade paginaci\u00f3n a la lista de usuarios\u201d, el agente no env\u00eda todo el repositorio al modelo. Hace retrieval: combina b\u00fasqueda sem\u00e1ntica sobre embeddings, b\u00fasqueda l\u00e9xica (normalmente ripgrep bajo el cap\u00f3) y navegaci\u00f3n del grafo de s\u00edmbolos para construir un contexto relevante.<\/p>\n\n\n\n<p>Sobre ese contexto, y una serie de herramientas como <code>read_file<\/code>, <code>grep<\/code>, <code>find_references<\/code>, <code>edit_file<\/code>, el modelo razona de forma iterativa. Es un bucle: propone una consulta, recibe resultados, propone un cambio o nueva consulta, y as\u00ed hasta producir el diff final. Cada paso consume tokens, latencia, y sobre todo abre la puerta a desviarse.<\/p>\n\n\n\n<p>Aqu\u00ed las convenciones del framework empiezan a marcar diferencias reales. En una codebase de Next.js App Router, \u201cencontrar la p\u00e1gina de usuarios\u201d se resuelve en el primer paso: <code>app\/users\/page.tsx<\/code> existe o no existe. En Astro, \u201cmodificar el esquema de posts\u201d es un \u00fanico archivo en <code>src\/content\/config.ts<\/code> con un esquema Zod expl\u00edcito legible tanto por el agente como por un humano. En Angular moderno, los standalone components con <code>inject()<\/code> expl\u00edcito dicen al modelo qu\u00e9 importar y desde d\u00f3nde. En SvelteKit, <code>+page.server.ts<\/code> declara de forma l\u00e9xica que el archivo es server-side: el agente no puede confundirlo con c\u00f3digo cliente.<\/p>\n\n\n\n<p>En una codebase React \u201cvanilla\u201d con configuraci\u00f3n artesanal, nada de esto est\u00e1 dado. \u201cEncontrar la p\u00e1gina de usuarios\u201d se convierte en: grep en todo el repo, parsing manual de d\u00f3nde est\u00e1 <code>&lt;Routes&gt;<\/code>, navegaci\u00f3n de imports, identificar el componente, ver si el fetch est\u00e1 en <code>useEffect<\/code>, en <code>useQuery<\/code>, en un hook custom o en un servicio API.<\/p>\n\n\n\n<p>Cada paso es una oportunidad de error. El agente suele hacerlo bien en casos comunes, y por eso la ilusi\u00f3n de \u201cla IA lo hace todo\u201d es tan convincente. El problema es la varianza: errores sutiles frecuentes, y coste de revisi\u00f3n humana creciente.<\/p>\n\n\n\n<p>En una codebase peque\u00f1a no se nota; en equipos grandes s\u00ed, y se mide en PRs rechazadas, regresiones en producci\u00f3n y sesiones de debugging evitables.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">MCP y el cambio de interfaz<\/h2>\n\n\n\n<p>Aqu\u00ed aparece un modelo emergente: el Model Context Protocol. Est\u00e1ndar promovido por Anthropic y adoptado por herramientas modernas, permite exponer a los agentes no solo archivos sino capacidades estructuradas.<\/p>\n\n\n\n<p>Un MCP server para una app Next.js puede responder preguntas como:<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li>\u201clista todas las rutas\u201d<\/li>\n\n\n\n<li>\u201ccu\u00e1l es el loader de \/dashboard\/[id]\u201d<\/li>\n\n\n\n<li>\u201cqu\u00e9 Server Actions modifican la tabla users\u201d<\/li>\n\n\n\n<li>\u201cqu\u00e9 esquema devuelve getUserById\u201d<\/li>\n<\/ul>\n\n\n\n<p>Un agente con acceso a MCP ya no hace grep: hace queries estructuradas. Es la diferencia entre leer documentaci\u00f3n a mano y consultar un SQL bien dise\u00f1ado.<\/p>\n\n\n\n<p>Vercel empuja expl\u00edcitamente en esta direcci\u00f3n; SvelteKit, Nuxt y Angular tienen iniciativas similares. Un framework que expone su \u201cAPI interna\u201d (rutas, layouts, server functions, esquemas de datos, config de build) se convierte en una herramienta programable para agentes.<\/p>\n\n\n\n<p>Es la extensi\u00f3n natural de la compresi\u00f3n cognitiva: primero el framework reduce decisiones mediante convenciones; luego las expone de forma machine-readable mediante protocolos.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">Standardizaci\u00f3n, fragmentaci\u00f3n y Schelling points<\/h2>\n\n\n\n<p>La pregunta de fondo es si la IA fragmenta o estandariza el ecosistema.<\/p>\n\n\n\n<p>La intuici\u00f3n de la fragmentaci\u00f3n es simple: si un agente me ayuda con cualquier framework, puedo elegir cualquiera. Pero los LLM no funcionan as\u00ed: son distribucionales. Rinden mejor en patrones m\u00e1s representados en los datos.<\/p>\n\n\n\n<p>Eso crea un bucle:<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li>frameworks m\u00e1s usados \u2192 mejor rendimiento del modelo<\/li>\n\n\n\n<li>mejor rendimiento del modelo \u2192 m\u00e1s adopci\u00f3n<\/li>\n\n\n\n<li>m\u00e1s adopci\u00f3n \u2192 m\u00e1s datos<\/li>\n<\/ul>\n\n\n\n<p>Resultado: convergencia.<\/p>\n\n\n\n<p>Esto es un efecto Schelling point.<\/p>\n\n\n\n<p>Schelling planteaba un problema: dos personas deben coordinarse sin comunicarse. La soluci\u00f3n tiende a un punto focal (Grand Central Station, mediod\u00eda). No porque sea \u00f3ptimo, sino porque ambos esperan que el otro lo elija.<\/p>\n\n\n\n<p>En frameworks ocurre algo similar entre tres actores:<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li>desarrolladores<\/li>\n\n\n\n<li>herramientas de IA<\/li>\n\n\n\n<li>frameworks<\/li>\n<\/ul>\n\n\n\n<p>Todos convergen hacia los mismos puntos de mayor visibilidad en datos: documentaci\u00f3n, GitHub, ejemplos, tutoriales.<\/p>\n\n\n\n<p>No es solo efecto de red. Es un loop estad\u00edstico de entrenamiento.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">Consecuencias<\/h2>\n\n\n\n<p>Esto favorece el mainstream (React + Next.js + Vercel), pero penaliza ecosistemas peque\u00f1os no por inferioridad t\u00e9cnica, sino por menor presencia en datos.<\/p>\n\n\n\n<p>Tambi\u00e9n crea presi\u00f3n hacia versiones recientes: App Router es m\u00e1s visible en datasets actuales que Pages Router. Incluso dentro del mismo framework, el \u201cpresente\u201d gana sobre el \u201clegacy\u201d.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">Implicaci\u00f3n para equipos senior<\/h2>\n\n\n\n<p>El rol senior cambia: menos escribir l\u00f3gica compleja, m\u00e1s dise\u00f1ar l\u00edmites donde los agentes pueden operar sin romper el sistema.<\/p>\n\n\n\n<p>La code review deja de ser lectura l\u00ednea por l\u00ednea y pasa a ser verificaci\u00f3n de coherencia arquitect\u00f3nica.<\/p>\n\n\n\n<p>La decisi\u00f3n tecnol\u00f3gica deja de ser \u201cqu\u00e9 nos gusta\u201d y pasa a ser \u201cqu\u00e9 es legible para humanos + agentes en 3 a\u00f1os\u201d.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">Debito t\u00e9cnico generado por agentes<\/h2>\n\n\n\n<p>Aparece un nuevo tipo de deuda: c\u00f3digo correcto pero fr\u00e1gil en casos no cubiertos. Es dif\u00edcil de detectar porque \u201cparece terminado\u201d.<\/p>\n\n\n\n<p>Las convenciones fuertes reducen este espacio de error.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">Escenarios a 3\u20135 a\u00f1os<\/h2>\n\n\n\n<ol class=\"wp-block-list\">\n<li>Convergencia hacia framework-as-protocol (Next\/Vercel\/MCP dominante).<\/li>\n\n\n\n<li>Dominio de compiler-first (Svelte\/Solid\/React evolucionado).<\/li>\n\n\n\n<li>Fragmentaci\u00f3n asistida por mejores agentes.<\/li>\n\n\n\n<li>El framework desaparece como preocupaci\u00f3n humana.<\/li>\n<\/ol>\n\n\n\n<h2 class=\"wp-block-heading\">La pregunta real<\/h2>\n\n\n\n<p>La cuesti\u00f3n no es qu\u00e9 framework elegir.<\/p>\n\n\n\n<p>Es otra:<br>\u00bfcu\u00e1nto de tu codebase es legible sin tu cerebro en medio?<\/p>\n\n\n\n<p>Porque en la era agentica, el valor ya no es solo ergonom\u00eda del desarrollador. Es legibilidad para una mezcla de humanos y sistemas que escriben c\u00f3digo en tu lugar.<\/p>\n\n\n\n<p>Y eso cambia completamente qu\u00e9 significa \u201cbuena arquitectura\u201d.<\/p>\n\n\n\n<p><\/p>\n","protected":false},"excerpt":{"rendered":"<p>Las convenciones, la inteligencia del compilador y los l\u00edmites del servidor no son detalles de ergonom\u00eda: son la nueva interfaz entre las codebases y los agentes de IA que trabajan dentro de ellas. Lo s\u00e9, lo s\u00e9\u2026 La pregunta, as\u00ed formulada, es realmente provocadora. Implica que existe un umbral a partir del cual los agentes&#8230; <a class=\"more-link\" href=\"https:\/\/www.codemotion.com\/magazine\/es\/lenguajes-de-programacion\/sobreviviran-los-frameworks-javascript-a-la-inteligencia-artificial\/\">Read more<\/a><\/p>\n","protected":false},"author":349,"featured_media":35849,"comment_status":"closed","ping_status":"closed","sticky":false,"template":"","format":"standard","meta":{"_editorskit_title_hidden":false,"_editorskit_reading_time":0,"_editorskit_is_block_options_detached":false,"_editorskit_block_options_position":"{}","_uag_custom_page_level_css":"","_genesis_hide_title":false,"_genesis_hide_breadcrumbs":false,"_genesis_hide_singular_image":false,"_genesis_hide_footer_widgets":false,"_genesis_custom_body_class":"","_genesis_custom_post_class":"","_genesis_layout":"","footnotes":""},"categories":[10648],"tags":[],"collections":[13012],"class_list":{"0":"post-35991","1":"post","2":"type-post","3":"status-publish","4":"format-standard","5":"has-post-thumbnail","7":"category-lenguajes-de-programacion","8":"collections-top-of-the-week-es","9":"entry"},"yoast_head":"<!-- This site is optimized with the Yoast SEO Premium plugin v26.9 (Yoast SEO v27.5) - https:\/\/yoast.com\/product\/yoast-seo-premium-wordpress\/ -->\n<title>\u00bfSobrevivir\u00e1n los frameworks JavaScript a la inteligencia artificial?<\/title>\n<meta name=\"description\" content=\"An\u00e1lisis de c\u00f3mo la IA est\u00e1 redefiniendo los frameworks frontend, priorizando la legibilidad para agentes y la convergencia hacia arquitecturas m\u00e1s estructuradas y machine-readable.\" \/>\n<meta name=\"robots\" content=\"index, follow, max-snippet:-1, max-image-preview:large, max-video-preview:-1\" \/>\n<link rel=\"canonical\" href=\"https:\/\/www.codemotion.com\/magazine\/es\/lenguajes-de-programacion\/sobreviviran-los-frameworks-javascript-a-la-inteligencia-artificial\/\" \/>\n<meta property=\"og:locale\" content=\"en_US\" \/>\n<meta property=\"og:type\" content=\"article\" \/>\n<meta property=\"og:title\" content=\"\u00bfLos frameworks de JS est\u00e1n quedando obsoletos o se est\u00e1n transformando para sobrevivir a la era de los agentes?\" \/>\n<meta property=\"og:description\" content=\"An\u00e1lisis de c\u00f3mo la IA est\u00e1 redefiniendo los frameworks frontend, priorizando la legibilidad para agentes y la convergencia hacia arquitecturas m\u00e1s estructuradas y machine-readable.\" \/>\n<meta property=\"og:url\" content=\"https:\/\/www.codemotion.com\/magazine\/es\/lenguajes-de-programacion\/sobreviviran-los-frameworks-javascript-a-la-inteligencia-artificial\/\" \/>\n<meta property=\"og:site_name\" content=\"Codemotion Magazine\" \/>\n<meta property=\"article:publisher\" content=\"https:\/\/www.facebook.com\/Codemotion.Italy\/\" \/>\n<meta property=\"article:published_time\" content=\"2026-06-15T09:18:54+00:00\" \/>\n<meta property=\"article:modified_time\" content=\"2026-06-15T09:18:55+00:00\" \/>\n<meta property=\"og:image\" content=\"https:\/\/www.codemotion.com\/magazine\/wp-content\/uploads\/2026\/05\/framework-obsoleti-1.png\" \/>\n\t<meta property=\"og:image:width\" content=\"1672\" \/>\n\t<meta property=\"og:image:height\" content=\"941\" \/>\n\t<meta property=\"og:image:type\" content=\"image\/png\" \/>\n<meta name=\"author\" content=\"Francesco Napoletano\" \/>\n<meta name=\"twitter:card\" content=\"summary_large_image\" \/>\n<meta name=\"twitter:creator\" content=\"@CodemotionIT\" \/>\n<meta name=\"twitter:site\" content=\"@CodemotionIT\" \/>\n<meta name=\"twitter:label1\" content=\"Written by\" \/>\n\t<meta name=\"twitter:data1\" content=\"Francesco Napoletano\" \/>\n\t<meta name=\"twitter:label2\" content=\"Est. reading time\" \/>\n\t<meta name=\"twitter:data2\" content=\"18 minutes\" \/>\n<script type=\"application\/ld+json\" class=\"yoast-schema-graph\">{\"@context\":\"https:\\\/\\\/schema.org\",\"@graph\":[{\"@type\":\"Article\",\"@id\":\"https:\\\/\\\/www.codemotion.com\\\/magazine\\\/es\\\/lenguajes-de-programacion\\\/sobreviviran-los-frameworks-javascript-a-la-inteligencia-artificial\\\/#article\",\"isPartOf\":{\"@id\":\"https:\\\/\\\/www.codemotion.com\\\/magazine\\\/es\\\/lenguajes-de-programacion\\\/sobreviviran-los-frameworks-javascript-a-la-inteligencia-artificial\\\/\"},\"author\":{\"name\":\"Francesco Napoletano\",\"@id\":\"https:\\\/\\\/www.codemotion.com\\\/magazine\\\/#\\\/schema\\\/person\\\/f27416284aa6defd4fb248cf2766dfaf\"},\"headline\":\"\u00bfLos frameworks de JS est\u00e1n quedando obsoletos o se est\u00e1n transformando para sobrevivir a la era de los agentes?\",\"datePublished\":\"2026-06-15T09:18:54+00:00\",\"dateModified\":\"2026-06-15T09:18:55+00:00\",\"mainEntityOfPage\":{\"@id\":\"https:\\\/\\\/www.codemotion.com\\\/magazine\\\/es\\\/lenguajes-de-programacion\\\/sobreviviran-los-frameworks-javascript-a-la-inteligencia-artificial\\\/\"},\"wordCount\":4325,\"publisher\":{\"@id\":\"https:\\\/\\\/www.codemotion.com\\\/magazine\\\/#organization\"},\"image\":{\"@id\":\"https:\\\/\\\/www.codemotion.com\\\/magazine\\\/es\\\/lenguajes-de-programacion\\\/sobreviviran-los-frameworks-javascript-a-la-inteligencia-artificial\\\/#primaryimage\"},\"thumbnailUrl\":\"https:\\\/\\\/www.codemotion.com\\\/magazine\\\/wp-content\\\/uploads\\\/2026\\\/05\\\/framework-obsoleti-1.png\",\"articleSection\":[\"Lenguajes de programaci\u00f3n\"],\"inLanguage\":\"en-US\"},{\"@type\":\"WebPage\",\"@id\":\"https:\\\/\\\/www.codemotion.com\\\/magazine\\\/es\\\/lenguajes-de-programacion\\\/sobreviviran-los-frameworks-javascript-a-la-inteligencia-artificial\\\/\",\"url\":\"https:\\\/\\\/www.codemotion.com\\\/magazine\\\/es\\\/lenguajes-de-programacion\\\/sobreviviran-los-frameworks-javascript-a-la-inteligencia-artificial\\\/\",\"name\":\"\u00bfSobrevivir\u00e1n los frameworks JavaScript a la inteligencia artificial?\",\"isPartOf\":{\"@id\":\"https:\\\/\\\/www.codemotion.com\\\/magazine\\\/#website\"},\"primaryImageOfPage\":{\"@id\":\"https:\\\/\\\/www.codemotion.com\\\/magazine\\\/es\\\/lenguajes-de-programacion\\\/sobreviviran-los-frameworks-javascript-a-la-inteligencia-artificial\\\/#primaryimage\"},\"image\":{\"@id\":\"https:\\\/\\\/www.codemotion.com\\\/magazine\\\/es\\\/lenguajes-de-programacion\\\/sobreviviran-los-frameworks-javascript-a-la-inteligencia-artificial\\\/#primaryimage\"},\"thumbnailUrl\":\"https:\\\/\\\/www.codemotion.com\\\/magazine\\\/wp-content\\\/uploads\\\/2026\\\/05\\\/framework-obsoleti-1.png\",\"datePublished\":\"2026-06-15T09:18:54+00:00\",\"dateModified\":\"2026-06-15T09:18:55+00:00\",\"description\":\"An\u00e1lisis de c\u00f3mo la IA est\u00e1 redefiniendo los frameworks frontend, priorizando la legibilidad para agentes y la convergencia hacia arquitecturas m\u00e1s estructuradas y machine-readable.\",\"breadcrumb\":{\"@id\":\"https:\\\/\\\/www.codemotion.com\\\/magazine\\\/es\\\/lenguajes-de-programacion\\\/sobreviviran-los-frameworks-javascript-a-la-inteligencia-artificial\\\/#breadcrumb\"},\"inLanguage\":\"en-US\",\"potentialAction\":[{\"@type\":\"ReadAction\",\"target\":[\"https:\\\/\\\/www.codemotion.com\\\/magazine\\\/es\\\/lenguajes-de-programacion\\\/sobreviviran-los-frameworks-javascript-a-la-inteligencia-artificial\\\/\"]}]},{\"@type\":\"ImageObject\",\"inLanguage\":\"en-US\",\"@id\":\"https:\\\/\\\/www.codemotion.com\\\/magazine\\\/es\\\/lenguajes-de-programacion\\\/sobreviviran-los-frameworks-javascript-a-la-inteligencia-artificial\\\/#primaryimage\",\"url\":\"https:\\\/\\\/www.codemotion.com\\\/magazine\\\/wp-content\\\/uploads\\\/2026\\\/05\\\/framework-obsoleti-1.png\",\"contentUrl\":\"https:\\\/\\\/www.codemotion.com\\\/magazine\\\/wp-content\\\/uploads\\\/2026\\\/05\\\/framework-obsoleti-1.png\",\"width\":1672,\"height\":941},{\"@type\":\"BreadcrumbList\",\"@id\":\"https:\\\/\\\/www.codemotion.com\\\/magazine\\\/es\\\/lenguajes-de-programacion\\\/sobreviviran-los-frameworks-javascript-a-la-inteligencia-artificial\\\/#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"Home\",\"item\":\"https:\\\/\\\/www.codemotion.com\\\/magazine\\\/\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"Lenguajes de programaci\u00f3n\",\"item\":\"https:\\\/\\\/www.codemotion.com\\\/magazine\\\/es\\\/lenguajes-de-programacion\\\/\"},{\"@type\":\"ListItem\",\"position\":3,\"name\":\"\u00bfLos frameworks de JS est\u00e1n quedando obsoletos o se est\u00e1n transformando para sobrevivir a la era de los agentes?\"}]},{\"@type\":\"WebSite\",\"@id\":\"https:\\\/\\\/www.codemotion.com\\\/magazine\\\/#website\",\"url\":\"https:\\\/\\\/www.codemotion.com\\\/magazine\\\/\",\"name\":\"Codemotion Magazine\",\"description\":\"We code the future. Together\",\"publisher\":{\"@id\":\"https:\\\/\\\/www.codemotion.com\\\/magazine\\\/#organization\"},\"potentialAction\":[{\"@type\":\"SearchAction\",\"target\":{\"@type\":\"EntryPoint\",\"urlTemplate\":\"https:\\\/\\\/www.codemotion.com\\\/magazine\\\/?s={search_term_string}\"},\"query-input\":{\"@type\":\"PropertyValueSpecification\",\"valueRequired\":true,\"valueName\":\"search_term_string\"}}],\"inLanguage\":\"en-US\"},{\"@type\":\"Organization\",\"@id\":\"https:\\\/\\\/www.codemotion.com\\\/magazine\\\/#organization\",\"name\":\"Codemotion\",\"url\":\"https:\\\/\\\/www.codemotion.com\\\/magazine\\\/\",\"logo\":{\"@type\":\"ImageObject\",\"inLanguage\":\"en-US\",\"@id\":\"https:\\\/\\\/www.codemotion.com\\\/magazine\\\/#\\\/schema\\\/logo\\\/image\\\/\",\"url\":\"https:\\\/\\\/www.codemotion.com\\\/magazine\\\/wp-content\\\/uploads\\\/2019\\\/11\\\/codemotionlogo.png\",\"contentUrl\":\"https:\\\/\\\/www.codemotion.com\\\/magazine\\\/wp-content\\\/uploads\\\/2019\\\/11\\\/codemotionlogo.png\",\"width\":225,\"height\":225,\"caption\":\"Codemotion\"},\"image\":{\"@id\":\"https:\\\/\\\/www.codemotion.com\\\/magazine\\\/#\\\/schema\\\/logo\\\/image\\\/\"},\"sameAs\":[\"https:\\\/\\\/www.facebook.com\\\/Codemotion.Italy\\\/\",\"https:\\\/\\\/x.com\\\/CodemotionIT\"]},{\"@type\":\"Person\",\"@id\":\"https:\\\/\\\/www.codemotion.com\\\/magazine\\\/#\\\/schema\\\/person\\\/f27416284aa6defd4fb248cf2766dfaf\",\"name\":\"Francesco Napoletano\",\"image\":{\"@type\":\"ImageObject\",\"inLanguage\":\"en-US\",\"@id\":\"https:\\\/\\\/secure.gravatar.com\\\/avatar\\\/be00812d69638a442c22193c6743ed3189a542aa1086fd87b3de0dd855de400a?s=96&d=mm&r=g\",\"url\":\"https:\\\/\\\/secure.gravatar.com\\\/avatar\\\/be00812d69638a442c22193c6743ed3189a542aa1086fd87b3de0dd855de400a?s=96&d=mm&r=g\",\"contentUrl\":\"https:\\\/\\\/secure.gravatar.com\\\/avatar\\\/be00812d69638a442c22193c6743ed3189a542aa1086fd87b3de0dd855de400a?s=96&d=mm&r=g\",\"caption\":\"Francesco Napoletano\"},\"url\":\"https:\\\/\\\/www.codemotion.com\\\/magazine\\\/author\\\/francesco-napoletano\\\/\"}]}<\/script>\n<!-- \/ Yoast SEO Premium plugin. -->","yoast_head_json":{"title":"\u00bfSobrevivir\u00e1n los frameworks JavaScript a la inteligencia artificial?","description":"An\u00e1lisis de c\u00f3mo la IA est\u00e1 redefiniendo los frameworks frontend, priorizando la legibilidad para agentes y la convergencia hacia arquitecturas m\u00e1s estructuradas y machine-readable.","robots":{"index":"index","follow":"follow","max-snippet":"max-snippet:-1","max-image-preview":"max-image-preview:large","max-video-preview":"max-video-preview:-1"},"canonical":"https:\/\/www.codemotion.com\/magazine\/es\/lenguajes-de-programacion\/sobreviviran-los-frameworks-javascript-a-la-inteligencia-artificial\/","og_locale":"en_US","og_type":"article","og_title":"\u00bfLos frameworks de JS est\u00e1n quedando obsoletos o se est\u00e1n transformando para sobrevivir a la era de los agentes?","og_description":"An\u00e1lisis de c\u00f3mo la IA est\u00e1 redefiniendo los frameworks frontend, priorizando la legibilidad para agentes y la convergencia hacia arquitecturas m\u00e1s estructuradas y machine-readable.","og_url":"https:\/\/www.codemotion.com\/magazine\/es\/lenguajes-de-programacion\/sobreviviran-los-frameworks-javascript-a-la-inteligencia-artificial\/","og_site_name":"Codemotion Magazine","article_publisher":"https:\/\/www.facebook.com\/Codemotion.Italy\/","article_published_time":"2026-06-15T09:18:54+00:00","article_modified_time":"2026-06-15T09:18:55+00:00","og_image":[{"width":1672,"height":941,"url":"https:\/\/www.codemotion.com\/magazine\/wp-content\/uploads\/2026\/05\/framework-obsoleti-1.png","type":"image\/png"}],"author":"Francesco Napoletano","twitter_card":"summary_large_image","twitter_creator":"@CodemotionIT","twitter_site":"@CodemotionIT","twitter_misc":{"Written by":"Francesco Napoletano","Est. reading time":"18 minutes"},"schema":{"@context":"https:\/\/schema.org","@graph":[{"@type":"Article","@id":"https:\/\/www.codemotion.com\/magazine\/es\/lenguajes-de-programacion\/sobreviviran-los-frameworks-javascript-a-la-inteligencia-artificial\/#article","isPartOf":{"@id":"https:\/\/www.codemotion.com\/magazine\/es\/lenguajes-de-programacion\/sobreviviran-los-frameworks-javascript-a-la-inteligencia-artificial\/"},"author":{"name":"Francesco Napoletano","@id":"https:\/\/www.codemotion.com\/magazine\/#\/schema\/person\/f27416284aa6defd4fb248cf2766dfaf"},"headline":"\u00bfLos frameworks de JS est\u00e1n quedando obsoletos o se est\u00e1n transformando para sobrevivir a la era de los agentes?","datePublished":"2026-06-15T09:18:54+00:00","dateModified":"2026-06-15T09:18:55+00:00","mainEntityOfPage":{"@id":"https:\/\/www.codemotion.com\/magazine\/es\/lenguajes-de-programacion\/sobreviviran-los-frameworks-javascript-a-la-inteligencia-artificial\/"},"wordCount":4325,"publisher":{"@id":"https:\/\/www.codemotion.com\/magazine\/#organization"},"image":{"@id":"https:\/\/www.codemotion.com\/magazine\/es\/lenguajes-de-programacion\/sobreviviran-los-frameworks-javascript-a-la-inteligencia-artificial\/#primaryimage"},"thumbnailUrl":"https:\/\/www.codemotion.com\/magazine\/wp-content\/uploads\/2026\/05\/framework-obsoleti-1.png","articleSection":["Lenguajes de programaci\u00f3n"],"inLanguage":"en-US"},{"@type":"WebPage","@id":"https:\/\/www.codemotion.com\/magazine\/es\/lenguajes-de-programacion\/sobreviviran-los-frameworks-javascript-a-la-inteligencia-artificial\/","url":"https:\/\/www.codemotion.com\/magazine\/es\/lenguajes-de-programacion\/sobreviviran-los-frameworks-javascript-a-la-inteligencia-artificial\/","name":"\u00bfSobrevivir\u00e1n los frameworks JavaScript a la inteligencia artificial?","isPartOf":{"@id":"https:\/\/www.codemotion.com\/magazine\/#website"},"primaryImageOfPage":{"@id":"https:\/\/www.codemotion.com\/magazine\/es\/lenguajes-de-programacion\/sobreviviran-los-frameworks-javascript-a-la-inteligencia-artificial\/#primaryimage"},"image":{"@id":"https:\/\/www.codemotion.com\/magazine\/es\/lenguajes-de-programacion\/sobreviviran-los-frameworks-javascript-a-la-inteligencia-artificial\/#primaryimage"},"thumbnailUrl":"https:\/\/www.codemotion.com\/magazine\/wp-content\/uploads\/2026\/05\/framework-obsoleti-1.png","datePublished":"2026-06-15T09:18:54+00:00","dateModified":"2026-06-15T09:18:55+00:00","description":"An\u00e1lisis de c\u00f3mo la IA est\u00e1 redefiniendo los frameworks frontend, priorizando la legibilidad para agentes y la convergencia hacia arquitecturas m\u00e1s estructuradas y machine-readable.","breadcrumb":{"@id":"https:\/\/www.codemotion.com\/magazine\/es\/lenguajes-de-programacion\/sobreviviran-los-frameworks-javascript-a-la-inteligencia-artificial\/#breadcrumb"},"inLanguage":"en-US","potentialAction":[{"@type":"ReadAction","target":["https:\/\/www.codemotion.com\/magazine\/es\/lenguajes-de-programacion\/sobreviviran-los-frameworks-javascript-a-la-inteligencia-artificial\/"]}]},{"@type":"ImageObject","inLanguage":"en-US","@id":"https:\/\/www.codemotion.com\/magazine\/es\/lenguajes-de-programacion\/sobreviviran-los-frameworks-javascript-a-la-inteligencia-artificial\/#primaryimage","url":"https:\/\/www.codemotion.com\/magazine\/wp-content\/uploads\/2026\/05\/framework-obsoleti-1.png","contentUrl":"https:\/\/www.codemotion.com\/magazine\/wp-content\/uploads\/2026\/05\/framework-obsoleti-1.png","width":1672,"height":941},{"@type":"BreadcrumbList","@id":"https:\/\/www.codemotion.com\/magazine\/es\/lenguajes-de-programacion\/sobreviviran-los-frameworks-javascript-a-la-inteligencia-artificial\/#breadcrumb","itemListElement":[{"@type":"ListItem","position":1,"name":"Home","item":"https:\/\/www.codemotion.com\/magazine\/"},{"@type":"ListItem","position":2,"name":"Lenguajes de programaci\u00f3n","item":"https:\/\/www.codemotion.com\/magazine\/es\/lenguajes-de-programacion\/"},{"@type":"ListItem","position":3,"name":"\u00bfLos frameworks de JS est\u00e1n quedando obsoletos o se est\u00e1n transformando para sobrevivir a la era de los agentes?"}]},{"@type":"WebSite","@id":"https:\/\/www.codemotion.com\/magazine\/#website","url":"https:\/\/www.codemotion.com\/magazine\/","name":"Codemotion Magazine","description":"We code the future. Together","publisher":{"@id":"https:\/\/www.codemotion.com\/magazine\/#organization"},"potentialAction":[{"@type":"SearchAction","target":{"@type":"EntryPoint","urlTemplate":"https:\/\/www.codemotion.com\/magazine\/?s={search_term_string}"},"query-input":{"@type":"PropertyValueSpecification","valueRequired":true,"valueName":"search_term_string"}}],"inLanguage":"en-US"},{"@type":"Organization","@id":"https:\/\/www.codemotion.com\/magazine\/#organization","name":"Codemotion","url":"https:\/\/www.codemotion.com\/magazine\/","logo":{"@type":"ImageObject","inLanguage":"en-US","@id":"https:\/\/www.codemotion.com\/magazine\/#\/schema\/logo\/image\/","url":"https:\/\/www.codemotion.com\/magazine\/wp-content\/uploads\/2019\/11\/codemotionlogo.png","contentUrl":"https:\/\/www.codemotion.com\/magazine\/wp-content\/uploads\/2019\/11\/codemotionlogo.png","width":225,"height":225,"caption":"Codemotion"},"image":{"@id":"https:\/\/www.codemotion.com\/magazine\/#\/schema\/logo\/image\/"},"sameAs":["https:\/\/www.facebook.com\/Codemotion.Italy\/","https:\/\/x.com\/CodemotionIT"]},{"@type":"Person","@id":"https:\/\/www.codemotion.com\/magazine\/#\/schema\/person\/f27416284aa6defd4fb248cf2766dfaf","name":"Francesco Napoletano","image":{"@type":"ImageObject","inLanguage":"en-US","@id":"https:\/\/secure.gravatar.com\/avatar\/be00812d69638a442c22193c6743ed3189a542aa1086fd87b3de0dd855de400a?s=96&d=mm&r=g","url":"https:\/\/secure.gravatar.com\/avatar\/be00812d69638a442c22193c6743ed3189a542aa1086fd87b3de0dd855de400a?s=96&d=mm&r=g","contentUrl":"https:\/\/secure.gravatar.com\/avatar\/be00812d69638a442c22193c6743ed3189a542aa1086fd87b3de0dd855de400a?s=96&d=mm&r=g","caption":"Francesco Napoletano"},"url":"https:\/\/www.codemotion.com\/magazine\/author\/francesco-napoletano\/"}]}},"featured_image_src":"https:\/\/www.codemotion.com\/magazine\/wp-content\/uploads\/2026\/05\/framework-obsoleti-1-600x400.png","featured_image_src_square":"https:\/\/www.codemotion.com\/magazine\/wp-content\/uploads\/2026\/05\/framework-obsoleti-1-600x600.png","author_info":{"display_name":"Francesco Napoletano","author_link":"https:\/\/www.codemotion.com\/magazine\/author\/francesco-napoletano\/"},"uagb_featured_image_src":{"full":["https:\/\/www.codemotion.com\/magazine\/wp-content\/uploads\/2026\/05\/framework-obsoleti-1.png",1672,941,false],"thumbnail":["https:\/\/www.codemotion.com\/magazine\/wp-content\/uploads\/2026\/05\/framework-obsoleti-1-150x150.png",150,150,true],"medium":["https:\/\/www.codemotion.com\/magazine\/wp-content\/uploads\/2026\/05\/framework-obsoleti-1-300x169.png",300,169,true],"medium_large":["https:\/\/www.codemotion.com\/magazine\/wp-content\/uploads\/2026\/05\/framework-obsoleti-1-768x432.png",768,432,true],"large":["https:\/\/www.codemotion.com\/magazine\/wp-content\/uploads\/2026\/05\/framework-obsoleti-1-1024x576.png",1024,576,true],"1536x1536":["https:\/\/www.codemotion.com\/magazine\/wp-content\/uploads\/2026\/05\/framework-obsoleti-1-1536x864.png",1536,864,true],"2048x2048":["https:\/\/www.codemotion.com\/magazine\/wp-content\/uploads\/2026\/05\/framework-obsoleti-1.png",1672,941,false],"small-home-featured":["https:\/\/www.codemotion.com\/magazine\/wp-content\/uploads\/2026\/05\/framework-obsoleti-1-100x100.png",100,100,true],"sidebar-featured":["https:\/\/www.codemotion.com\/magazine\/wp-content\/uploads\/2026\/05\/framework-obsoleti-1-180x128.png",180,128,true],"genesis-singular-images":["https:\/\/www.codemotion.com\/magazine\/wp-content\/uploads\/2026\/05\/framework-obsoleti-1-896x504.png",896,504,true],"archive-featured":["https:\/\/www.codemotion.com\/magazine\/wp-content\/uploads\/2026\/05\/framework-obsoleti-1-400x225.png",400,225,true],"gb-block-post-grid-landscape":["https:\/\/www.codemotion.com\/magazine\/wp-content\/uploads\/2026\/05\/framework-obsoleti-1-600x400.png",600,400,true],"gb-block-post-grid-square":["https:\/\/www.codemotion.com\/magazine\/wp-content\/uploads\/2026\/05\/framework-obsoleti-1-600x600.png",600,600,true]},"uagb_author_info":{"display_name":"Francesco Napoletano","author_link":"https:\/\/www.codemotion.com\/magazine\/author\/francesco-napoletano\/"},"uagb_comment_info":0,"uagb_excerpt":"Las convenciones, la inteligencia del compilador y los l\u00edmites del servidor no son detalles de ergonom\u00eda: son la nueva interfaz entre las codebases y los agentes de IA que trabajan dentro de ellas. Lo s\u00e9, lo s\u00e9\u2026 La pregunta, as\u00ed formulada, es realmente provocadora. Implica que existe un umbral a partir del cual los agentes&#8230;&hellip;","lang":"es","_links":{"self":[{"href":"https:\/\/www.codemotion.com\/magazine\/wp-json\/wp\/v2\/posts\/35991","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/www.codemotion.com\/magazine\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/www.codemotion.com\/magazine\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/www.codemotion.com\/magazine\/wp-json\/wp\/v2\/users\/349"}],"replies":[{"embeddable":true,"href":"https:\/\/www.codemotion.com\/magazine\/wp-json\/wp\/v2\/comments?post=35991"}],"version-history":[{"count":2,"href":"https:\/\/www.codemotion.com\/magazine\/wp-json\/wp\/v2\/posts\/35991\/revisions"}],"predecessor-version":[{"id":35995,"href":"https:\/\/www.codemotion.com\/magazine\/wp-json\/wp\/v2\/posts\/35991\/revisions\/35995"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/www.codemotion.com\/magazine\/wp-json\/wp\/v2\/media\/35849"}],"wp:attachment":[{"href":"https:\/\/www.codemotion.com\/magazine\/wp-json\/wp\/v2\/media?parent=35991"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/www.codemotion.com\/magazine\/wp-json\/wp\/v2\/categories?post=35991"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.codemotion.com\/magazine\/wp-json\/wp\/v2\/tags?post=35991"},{"taxonomy":"collections","embeddable":true,"href":"https:\/\/www.codemotion.com\/magazine\/wp-json\/wp\/v2\/collections?post=35991"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}