Inicio / Artículos / Las API del navegador nativo están reemplazando a los populares paquetes npm en 2026

Las API del navegador nativo están reemplazando a los populares paquetes npm en 2026

Explica cómo las características nativas de JavaScript y CSS, como Signals, el operador pipeline, Temporal y el posicionamiento por anclaje, están reemplazando a los paquetes comunes de npm.

1770 palabras

Vale la pena examinar por un momento su propio package.json: ¿cuántas de esas entradas existen únicamente para simular una funcionalidad que el navegador ya ha aprendido a realizar por sí mismo?

Durante la mayor parte de los últimos diez años, la respuesta habitual ante casi cualquier problema en el frontend era “usa un paquete”. ¿Necesitas gestión de estado? Usa Redux, Zustand o MobX. ¿Necesitas funciones para trabajar con fechas? Moment o dayjs. ¿Necesitas herramientas auxiliares? lodash. ¿Necesitas animaciones? GSAP o Framer Motion. Cada framework acumuló su propio conjunto de código adicional para solucionar las deficiencias de la plataforma.

Para el año 2026, ese patrón está cambiando más rápido de lo que la mayoría de los equipos se dan cuenta. TC39 y los principales fabricantes de navegadores han dedicado los últimos años a crear de forma constante equivalentes nativos para categorías completas de herramientas de terceros. A continuación se presentan cinco paquetes que realmente puede considerar eliminar de sus dependencias ahora mismo, además de otros dos que solo están a mitad de camino para volverse obsoletos.

1. Bibliotecas de gestión de estado: los Signals nativos acaban de llegar

Sustituyen a: Redux, Zustand, MobX, Recoil, Jotai y la reactividad nativa de los frameworks, como las referencias reactivas propias de Vue

Sustituidos por: las primitivas estandarizadas Signal (State, Computed y la ayuda de suscripción sub)

Pocos problemas han dividido tanto el desarrollo frontend como la elección de una forma para gestionar el estado. El ecosistema de React pasó por Redux, luego Zustand, después Jotai y finalmente Recoil. Vue desarrolló sus propias primitivas de reactividad y más tarde añadió Pinia encima. Mientras tanto, Solid y Svelte se construyeron desde el principio alrededor de señales. Cada framework inventó su propia versión de la primitiva reactiva, lo que significaba que reutilizar la lógica de estado entre frameworks era casi imposible.

Esa restricción se alivió en 2026 cuando la propuesta de señales nativas del TC39 llegó a su implementación. La primitiva reactiva ahora reside directamente dentro del motor de JavaScript:

// No library. This runs in the browser as-is.
const counter = new Signal.State(0);
const doubled = new Signal.Computed(() => counter.get() * 2);

Signal.sub(() => {
  console.log(`count: ${counter.get()}, doubled: ${doubled.get()}`);
});

counter.set(1); // triggers the subscription automatically

Esto es lo que realmente te aporta este cambio:

  • Tu lógica de estado puede ser creada una vez y reutilizada en todas partes — React, Vue, Solid y Svelte pueden leer desde la misma primitiva subyacente
  • La “biblioteca de gestión de estado” está perdiendo importancia como categoría de producto independiente
  • Puedes eliminar de inmediato decenas o incluso cientos de kilobytes de tu paquete
  • Algunos ingenieros han considerado esto como el fin de un conflicto que duró una década entre los frameworks front-end. Una vez que el núcleo reactivo se comparta entre diferentes ecosistemas, las diferencias restantes entre los frameworks se reducen a la sintaxis de las plantillas y la estructura de los componentes, no a la forma en que se propagan las actualizaciones de estado.

    2. lodash: el operador de pipeline pone fin al “primo del infierno de callbacks”

    Sustituye: lodash, ramda y la mayoría de los usos de _.chain()

    Sustituido por: el operador de pipeline, |>

    Es probable que hayas escrito algo similar antes:

    const result = fn3(fn2(fn1(data)));
    

    Ese tipo de llamadas a funciones anidadas, en las que hay que leer desde adentro hacia afuera solo para determinar el orden real de ejecución, ha sido durante mucho tiempo uno de los mayores problemas de legibilidad en JavaScript. _.chain() de lodash solía ocultar este problema, pero eso significaba tener que incluir toda la biblioteca solo para obtener un orden de llamadas más claro.

    A partir de 2026, **el operador de pipeline ha avanzado a la Etapa 4 en ES2026**. Ahora la misma expresión se lee de forma natural de arriba hacia abajo:

    const result = data
      |> fn1
      |> fn2
      |> fn3;
    

    Junto con el soporte nativo para await, los pipelines asíncronos terminan leyéndose casi como scripts shell:

    const user = userId
      |> fetchUser
      |> await
      |> extractProfile
      |> await
      |> formatOutput;
    

    El operador de tubería resuelve un problema de legibilidad, mientras que lodash solucionaba principalmente el problema anterior de que el lenguaje carecía por completo de utilidades funcionales. Ahora que la funcionalidad de tubería está integrada, los métodos de Array.prototype se han desarrollado más y structuredClone está disponible en todos los navegadores, lo que ha reducido considerablemente la justificación para seguir utilizando lodash. Si aún está incluido en tus dependencias en 2026, eliminarlo probablemente sea la forma más sencilla de reducir el tamaño del paquete.

    3. dayjs y moment — La API Temporal alcanza un 98% de cobertura en navegadores

    Sustituye a: moment.js, dayjs y date-fns en la mayoría de los casos de uso

    Sustituido por: la API Temporal

    Esta entrada es la menos controvertida de la lista. moment.js ha estado en modo de mantenimiento durante años, y incluso el “ligero” dayjs sigue añadiendo más de 2 KB a tu paquete. Mientras tanto, la API Temporal ya cuenta con un 98% de cobertura en navegadores.

    // dayjs
    const d = dayjs('2026-09-11').add(1, 'month').format('YYYY-MM-DD');
    
    // Temporal
    const d = Temporal.PlainDate.from('2026-09-11').add({ months: 1 }).toString();
    

    Temporal no se trata solo de una sintaxis más ordenada: elimina errores reales con los que las bibliotecas de fechas han luchado durante años:

    • El manejo de zonas horarias es nativo, por lo que no se necesita un plugin separado para zonas horarias
    • El soporte para sistemas de calendario es nativo, incluyendo calendarios no gregorianos
    • Las instancias son inmutables, evitando la trampa típica de moment.js de modificar accidentalmente un objeto que se creía intacto
    • El tamaño del paquete disminuye entre 10 y 50 KB

    Para proyectos con una gran audiencia móvil, esa reducción de 10–50 KB no es solo algo conveniente: se traduce directamente en una mejor puntuación LCP.

    4. Popper.js y Floating UI: el posicionamiento de anclajes ahora es CSS nativo

    Sustituye a: Popper.js, Floating UI, Tippy.js

    Sustituido por: Posicionamiento de anclajes en CSS

    Si alguna vez has creado una herramienta de ayuda, conoces el procedimiento. Necesitas un menú desplegable que aparezca justo debajo de un botón. El enfoque tradicional es usar position: absolute, calcular manualmente los valores de top y left, y luego configurar los listeners de scroll y resize para que el elemento no se desplace. O bien recurrís a Popper.js o Floating UI, lo que añade otros doce kilobytes más solo para gestionar el posicionamiento.

    Para 2026, el posicionamiento de anclaje en CSS se encarga de esto a nivel de plataforma:

    /* Step 1: name the anchor element */
    .button {
      anchor-name: --my-trigger;
    }
    
    /* Step 2: pin the floating element to it */
    .tooltip {
      position: anchor(--my-trigger);
      inset-area: bottom; /* below the anchor */
    }
    

    Esto es todo: la solución completa. Sin JavaScript, sin cálculos manuales de posicionamiento absoluto, sin bibliotecas externas. Imagina el posicionamiento de anclaje como un sistema de localización GPS para elementos de interfaz flotantes: úsalo en el botón desencadenante y permanecerá fijo sin importar cómo se despliegue la página o cambie el tamaño de la ventana.

    5. Sass y PostCSS: anidamiento nativo, @layer y @scope

    Sustituye a: Sass, Less, PostCSS y su ecosistema de plugins

    Sustituido por: anidamiento nativo de CSS, @layer y @scope

    Hubo un tiempo en que Sass y Less parecían indispensables. Variables, anidamiento, mixins, funciones reutilizables: el CSS puro simplemente no ofrecía nada de eso. Pero en 2026 ya no es así.

    Anidamiento nativo:

    .card {
      background: white;
      & .title { font-weight: 600; }
      &:hover { box-shadow: 0 4px 12px rgba(0,0,0,0.1); }
    }
    

    @layer para controlar el orden de cascada:

    @layer reset, base, components, utilities;
    

    @scope para un aislamiento de estilos ligero:

    @scope (.card) to (.card__content) {
      :scope { border-radius: 8px; }
    }
    

    OKLCH se ha convertido en el formato de color estándar:

    :root {
      --color-primary: oklch(0.65 0.2 250);
      --color-hover: oklch(from var(--color-primary) calc(l - 0.1) c h);
    }
    

    Con las consultas de contenedor, la alineación precisa de texto mediante text-box, el posicionamiento basado en hermanos a través de sibling-index() y las animaciones controladas por desplazamiento —todos ellos estables en todos los navegadores para 2026—, Sass ha pasado de ser un requisito obligatorio a una herramienta opcional para la mayoría de los proyectos. Si aún se añade automáticamente a tu stack, vale la pena verificar cuántas de las funcionalidades para las que lo utilizas ahora se manejan de forma nativa.

    Dos paquetes que solo están parcialmente reemplazados

    No todos los elementos de esta lista cuentan aún con un reemplazo nativo completo. Dos están cerca, pero la plataforma aún no ha alcanzado ese nivel de integración total.

    Bibliotecas de animación: GSAP y Framer Motion frente a las transiciones nativas de vista. La API View Transitions se volvió estable con React 19.3, y su componente <ViewTransition> puede animar automáticamente los elementos a medida que entran, salen, se mueven o cambian de tamaño. La animación controlada por el desplazamiento, mediante animation-timeline: scroll(), permite obtener indicadores de progreso, efectos de paralaje y transiciones suaves sin necesidad de JavaScript alguno. No obstante, para secuencias de animación complejas y coreografiadas manualmente —el tipo en el que se especializa GSAP—, las herramientas nativas aún no constituyen un sustituto completo.

    Inferencia de IA: ONNX Runtime Web frente a WebNN. Para la inferencia de modelos en el navegador, la API WebNN puede acceder directamente a la aceleración NPU a nivel de sistema, evitando así la necesidad de cargar decenas de megabytes de código del entorno de ejecución ONNX.

    const context = await navigator.ml.createContext();
    const builder = new MLGraphBuilder(context);
    // build the inference graph...
    const output = await context.compute(graph, inputs);
    

    La limitación: WebNN aún no cuenta con soporte completo en los navegadores, por lo que ONNX Runtime Web sigue siendo la opción más fiable por el momento.

    Eliminar estas cinco categorías de una base de código frontend de tamaño medio puede reducir entre 100 y 300 KB el tamaño de sus dependencias. En una conexión móvil lenta, esa reducción puede significar de 1 a 2 segundos menos para que se muestre la página por primera vez.

    Conclusión

    El desarrollo frontend en 2026 está experimentando un resurgimiento de las plataformas nativas. TC39 y los motores de navegador están asumiendo funciones que antes pertenecían exclusivamente al ecosistema npm: gestión de estado, ayudantes funcionales, manejo de fechas, posicionamiento de elementos flotantes y preprocesamiento de CSS. Los problemas que antes requerían la instalación de paquetes ahora tienen soluciones integradas directamente en el navegador.

    JavaScript está comenzando a parecerse a un lenguaje de plataforma verdaderamente autosuficiente. La habilidad que vale la pena desarrollar no es un conocimiento profundo de algún framework o biblioteca en particular, sino el juicio para determinar cuándo la plataforma es suficiente y cuándo una dependencia sigue siendo necesaria.

    Así que eche un vistazo a su package.json: ¿cuántas líneas podría eliminar hoy?

    Lecturas relacionadas

  • Desarrollador frontend en 2026: Un plan realista para conseguir un empleo — Un análisis práctico de lo que realmente hacen los desarrolladores frontend, cuánto ganan y qué habilidades diferencian a los candidatos contratados de aquellos que pasan desapercibidos en 2026.
  • Por qué las micro-optimizaciones no resuelven el problema del rendimiento real de JavaScript — Explica por qué buscar métricas medibles como el tamaño del paquete y las actualizaciones repetidas a menudo pasa por alto las causas reales de una experiencia de usuario lenta en las aplicaciones JavaScript.
  • React Native, Flutter y más: Mobile multiplataforma en 2026 — Un análisis comparativo de React Native, Flutter, Kotlin Multiplatform, Ionic, NativeScript y PWA en cuanto a rendimiento, experiencia del desarrollador y madurez del ecosistema.
  • Seis características nativas de HTML que reemplazan a las bibliotecas UI comunes de JavaScript — Aprenda cómo popover, exclusive details, dialog, Declarative Shadow DOM, fetchpriority y datalist sustituyen al JavaScript personalizado, además de los límites que cada uno sigue teniendo.
  • Propiedades personalizadas de CSS en tiempo de ejecución: Theming, puentes JavaScript y @property — Aprenda cómo las propiedades personalizadas de CSS difieren de las variables Sass y úselas para theming, efectos controlados por JavaScript, tipo fluido, variantes de componentes y animaciones tipadas.
  • Timer de cuenta regresiva sin desviaciones en React: De setTimeout a CSS puro — Compare setTimeout, requestAnimationFrame y una técnica de CSS sin JavaScript para timers de cuenta regresiva en React, incluyendo el truco del retraso único que mantiene los dígitos sincronizados.