Turbopack

Turbopack es un empaquetador incremental optimizado para JavaScript y TypeScript, escrito en Rust e integrado en Next.js. Puedes usar Turbopack tanto con el Enrutador de Páginas como con el de Aplicaciones para una experiencia de desarrollo local mucho más rápida.

¿Por qué Turbopack?

Desarrollamos Turbopack para impulsar el rendimiento de Next.js, incluyendo:

  • Gráfico unificado: Next.js admite múltiples entornos de salida (por ejemplo, cliente y servidor). Gestionar múltiples compiladores y unir paquetes puede ser tedioso. Turbopack utiliza un gráfico único y unificado para todos los entornos.
  • Empaquetado vs ESM nativo: Algunas herramientas omiten el empaquetado en desarrollo y dependen del ESM nativo del navegador. Esto funciona bien para aplicaciones pequeñas pero puede ralentizar aplicaciones grandes debido a excesivas solicitudes de red. Turbopack empaqueta en desarrollo, pero de manera optimizada para mantener rápidas las aplicaciones grandes.
  • Cálculo incremental: Turbopack paraleliza el trabajo entre núcleos y almacena en caché los resultados hasta el nivel de función. Una vez que se completa una parte del trabajo, Turbopack no lo repetirá.
  • Empaquetado diferido: Turbopack solo empaqueta lo que realmente solicita el servidor de desarrollo. Este enfoque diferido puede reducir los tiempos de compilación inicial y el uso de memoria.

Comenzando

Para habilitar Turbopack en tu proyecto Next.js, agrega el flag --turbopack a los scripts dev y build en tu archivo package.json:

package.json
{
  "scripts": {
    "dev": "next dev --turbopack",
    "build": "next build --turbopack",
    "start": "next start"
  }
}

Actualmente, Turbopack para dev es estable, mientras que build está en fase alfa. Estamos trabajando activamente en el soporte para producción a medida que Turbopack se acerca a la estabilidad.

Características soportadas

Turbopack en Next.js tiene configuración cero para los casos de uso comunes. A continuación, se resume lo que está soportado de forma predeterminada, además de algunas referencias sobre cómo puedes configurar Turbopack más a fondo cuando sea necesario.

Características de lenguaje

CaracterísticaEstadoNotas
JavaScript & TypeScriptSoportadoUtiliza SWC internamente. La verificación de tipos no la realiza Turbopack (ejecuta tsc --watch o confía en tu IDE para las verificaciones de tipos).
ECMAScript (ESNext)SoportadoTurbopack soporta las últimas características de ECMAScript, coincidiendo con la cobertura de SWC.
CommonJSSoportadoLa sintaxis require() se maneja de forma predeterminada.
ESMSoportadoLos import estáticos y dinámicos están totalmente soportados.
BabelParcialmente no soportadoTurbopack no incluye Babel por defecto. Sin embargo, puedes configurar babel-loader mediante la configuración de Turbopack.

Características del framework y React

CaracterísticaEstadoNotas
JSX / TSXSoportadoSWC maneja la compilación de JSX/TSX.
Fast RefreshSoportadoNo se necesita configuración.
React Server Components (RSC)SoportadoPara el Enrutador de Aplicaciones de Next.js. Turbopack asegura el empaquetado correcto entre servidor/cliente.
Creación de diseño raízNo soportadoLa creación automática de un diseño raíz en el Enrutador de Aplicaciones no está soportada. Turbopack te indicará que lo crees manualmente.

CSS y estilos

CaracterísticaEstadoNotas
CSS GlobalSoportadoImporta archivos .css directamente en tu aplicación.
CSS ModulesSoportadoLos archivos .module.css funcionan de forma nativa (Lightning CSS).
CSS NestingSoportadoLightning CSS soporta anidamiento moderno de CSS.
Sintaxis @importSoportadoCombina múltiples archivos CSS.
PostCSSSoportadoProcesa automáticamente postcss.config.js en un grupo de trabajadores Node.js. Útil para Tailwind, Autoprefixer, etc.
Sass / SCSSSoportado (Next.js)Para Next.js, Sass está soportado de forma predeterminada. En el futuro, el uso independiente de Turbopack probablemente requerirá una configuración de loader.
LessPlaneado mediante pluginsAún no soportado por defecto. Probablemente requerirá una configuración de loader una vez que los loaders personalizados sean estables.
Lightning CSSEn usoManeja transformaciones CSS. Algunas características de CSS Modules de bajo uso (como :local/:global como pseudo-clases independientes) aún no están soportadas. Ver más detalles abajo.

Recursos

CaracterísticaEstadoNotas
Recursos estáticos (imágenes, fuentes)SoportadoImportar import img from './img.png' funciona de forma predeterminada. En Next.js, devuelve un objeto para el componente <Image />.
Importaciones JSONSoportadoLas importaciones nombradas o predeterminadas desde .json están soportadas.

Resolución de módulos

CaracterísticaEstadoNotas
Alias de rutasSoportadoLee paths y baseUrl de tsconfig.json, coincidiendo con el comportamiento de Next.js.
Alias manualesSoportadoConfigura resolveAlias en next.config.js (similar a webpack.resolve.alias).
Extensiones personalizadasSoportadoConfigura resolveExtensions en next.config.js.
AMDParcialmente soportadoLas transformaciones básicas funcionan; el uso avanzado de AMD es limitado.

Rendimiento y Fast Refresh

CaracterísticaEstadoNotas
Fast RefreshSoportadoActualiza JavaScript, TypeScript y CSS sin un refresco completo.
Empaquetado incrementalSoportadoTurbopack construye de forma diferida solo lo que solicita el servidor de desarrollo, acelerando aplicaciones grandes.

Características no soportadas y no planeadas

Algunas características aún no están implementadas o no están planeadas:

  • Características heredadas de CSS Modules
    • Pseudo-clases independientes :local y :global (solo se soporta la variante de función :global(...)).
    • La regla @value (sustituida por variables CSS).
    • Reglas ICSS :import y :export.
  • Configuración webpack() en next.config.js Turbopack reemplaza webpack, por lo que las configuraciones webpack() no son reconocidas. Usa la configuración turbopack en su lugar.
  • AMP No está planeado el soporte para Turbopack en Next.js.
  • Yarn PnP No está planeado el soporte para Turbopack en Next.js.
  • experimental.urlImports No está planeado para Turbopack.
  • experimental.esmExternals No está planeado. Turbopack no soporta la configuración heredada esmExternals en Next.js.
  • Algunas banderas experimentales de Next.js
    • experimental.typedRoutes
    • experimental.nextScriptWorkers
    • experimental.sri.algorithm
    • experimental.fallbackNodePolyfills Planeamos implementarlas en el futuro.

Para un desglose completo y detallado de cada bandera de característica y su estado, consulta la Referencia de API de Turbopack.

Configuración

Turbopack puede configurarse mediante next.config.js (o next.config.ts) bajo la clave turbopack. Las opciones de configuración incluyen:

  • rules Define loaders de webpack adicionales para transformaciones de archivos.
  • resolveAlias Crea alias manuales (como resolve.alias en webpack).
  • resolveExtensions Cambia o extiende las extensiones de archivo para la resolución de módulos.
  • moduleIds Establece cómo se generan los IDs de módulo ('named' vs 'deterministic').
  • treeShaking Habilita o deshabilita el tree shaking en desarrollo y futuras compilaciones de producción.
  • memoryLimit Establece un límite de memoria (en bytes) para Turbopack.
next.config.js
module.exports = {
  turbopack: {
    // Ejemplo: agregando un alias y una extensión de archivo personalizada
    resolveAlias: {
      underscore: 'lodash',
    },
    resolveExtensions: ['.mdx', '.tsx', '.ts', '.jsx', '.js', '.json'],
  },
}

Para ejemplos de configuración más detallados, consulta la documentación de configuración de Turbopack.

Generación de archivos de traza para depuración de rendimiento

Si encuentras problemas de rendimiento o memoria y deseas ayudar al equipo de Next.js a diagnosticarlos, puedes generar un archivo de traza agregando NEXT_TURBOPACK_TRACING=1 a tu comando de desarrollo:

NEXT_TURBOPACK_TRACING=1 next dev --turbopack

Esto producirá un archivo .next/trace-turbopack. Incluye ese archivo al crear un issue en GitHub en el repositorio de Next.js para ayudarnos a investigar.

Resumen

Turbopack es un empaquetador basado en Rust e incremental diseñado para hacer que el desarrollo local y las compilaciones sean rápidos, especialmente para aplicaciones grandes. Está integrado en Next.js, ofreciendo soporte sin configuración para CSS, React y TypeScript.

Mantente atento a más actualizaciones mientras continuamos mejorando Turbopack y agregando soporte para compilaciones de producción. Mientras tanto, pruébalo con next dev --turbopack y cuéntanos tus comentarios.

Cambios por versión

VersiónCambios
v15.3.0Soporte experimental para build
v15.0.0Turbopack para dev estable