Salida dual de paquetes ESM y CJS
Generar builds tanto de módulos ES como de CommonJS con la configuración correcta del campo exports de package.json
Salida dual de paquetes ESM y CJS es una lección gratuita de React Academy en CoddyKit. Esta es la lección 2 de 4. Puedes leer la lección completa abajo gratuitamente — luego la practicas en el navegador con un editor de código integrado y un tutor de IA 24/7. Forma parte de la ruta de aprendizaje de React Academy, y tu progreso se sincroniza en la web y la app de CoddyKit. El curso de React Academy incluye 4 lecciones en total.
¿Qué es ESM?
ESM (ECMAScript Modules) es el estándar oficial de módulos de JavaScript que utiliza la sintaxis import y export. ESM se puede analizar estáticamente: los empaquetadores pueden determinar en tiempo de compilación exactamente qué exportaciones se utilizan, lo que permite aplicar tree-shaking. Tanto los navegadores modernos como Node.js admiten ESM de forma nativa.
¿Qué es CJS?
CJS (CommonJS) utiliza la sintaxis require() y module.exports. Fue el sistema de módulos original de Node.js y todavía se necesita para mantener la compatibilidad con entornos antiguos de Node.js, con Jest (que históricamente utilizaba CJS) y con el código que usa require(). CJS se evalúa dinámicamente, lo que dificulta el tree-shaking.
Paquete dual: distribuir ambos formatos
Un paquete moderno de npm debería distribuir ESM y CJS para maximizar la compatibilidad. Los consumidores de ESM (Vite, Next.js y empaquetadores modernos) obtienen importaciones compatibles con tree-shaking. Los consumidores de CJS (scripts antiguos de Node.js y Jest sin configuración) obtienen compatibilidad con require(). El campo exports de package.json indica a Node y a los empaquetadores qué formato deben utilizar.
El campo exports
El campo exports de package.json es la forma moderna de definir puntos de entrada condicionales. Ejemplo: { '.': { 'import': './dist/esm/index.js', 'require': './dist/cjs/index.js', 'types': './dist/esm/index.d.ts' } }. Los empaquetadores y Node.js 12+ leen exports para seleccionar automáticamente el formato correcto.
Campos heredados main y module
Las herramientas antiguas no entienden el campo exports. Para mantener la compatibilidad, establezca también: main, apuntando a la salida CJS (respaldo heredado para require de Node), y module, apuntando a la salida ESM (una indicación para webpack/rollup, no estándar pero ampliamente compatible). Las herramientas modernas prefieren exports; las herramientas antiguas recurren a main/module.
Implicaciones de type: module
Establecer "type": "module" en package.json hace que todos los archivos .js del paquete se traten como ESM. Si distribuye ambos formatos, necesitará extensiones explícitas: use .mjs para los archivos ESM y .cjs para los archivos CJS cuando type sea module, o al contrario. tsup lo gestiona automáticamente.
Extensiones .mjs y .cjs
Usar las extensiones de archivo .mjs (ESM) y .cjs (CJS) marca explícitamente el formato, independientemente del campo type. Esto evita ambigüedades. tsup puede generar: index.js (ESM) y index.cjs (CJS) cuando format es ['esm', 'cjs'] y no se establece ningún campo type, siguiendo la convención más común.
El riesgo de los paquetes duales
Cuando un paquete proporciona los formatos ESM y CJS, el empaquetador del consumidor podría cargar ambas versiones en el mismo proceso; por ejemplo, la versión ESM para la aplicación principal y la versión CJS para una prueba de Jest. Si el paquete tiene estado a nivel de módulo, como un contexto de React, ambas instancias tendrán estados independientes. Este es el riesgo de los paquetes duales.
Mitigar el riesgo de los paquetes duales
Para mitigar este riesgo, mantenga el estado a nivel de módulo fuera de su biblioteca (no utilice patrones singleton), use las condiciones de exports con precisión para garantizar que solo se cargue un formato y documente que las pruebas deben configurar su empaquetador para usar ESM. Este riesgo afecta principalmente a las bibliotecas con singletons compartidos.
Probar la salida dual
Verifique que ambos formatos funcionen después de la compilación. Pruebe CJS: node -e "const lib = require('./dist/cjs/index.js'); console.log(lib)". Pruebe ESM: node --input-type=module --eval "import { Component } from './dist/esm/index.js'; console.log(Component)". Ambos deben resolverse sin errores antes de publicar.
exports para múltiples puntos de entrada
El campo exports admite múltiples puntos de entrada: { '.': { import: './dist/esm/index.js', require: './dist/cjs/index.js' }, './utils': { import: './dist/esm/utils.js', require: './dist/cjs/utils.js' } }. Los consumidores pueden importar desde 'your-lib' o 'your-lib/utils' y obtener el formato correcto.
Campo exports de package.json
¿Cuál es el objetivo principal del campo exports en el package.json de una biblioteca?
Repaso de la lección: salida de paquetes duales
ESM utiliza import/export y permite aplicar tree-shaking. CJS utiliza require() para mantener la compatibilidad con Node.js. Distribuya ambos mediante el campo exports de package.json, con las condiciones import/require. Respaldos heredados: main (CJS) y module (ESM). Use las extensiones .mjs/.cjs o type: module para marcar explícitamente el formato. Pruebe ambos formatos con la CLI de node después de compilar. Tenga cuidado con el riesgo de los paquetes duales cuando utilice estado de singleton.
Aprende React con un tutor de IA — gratis
Escribe y ejecuta código real en tu navegador, obtén ayuda instantánea de un tutor de IA disponible 24/7 y continúa donde lo dejaste en la web o en la aplicación.
- Cursos
- 88
- Lecciones
- 324
Preguntas frecuentes
¿La lección «Salida dual de paquetes ESM y CJS» es gratis?
Sí — el texto completo de «Salida dual de paquetes ESM y CJS» es gratis para leer aquí en la web. Para practicarla de forma interactiva (editor de código integrado y tutor de IA 24/7) y desbloquear el resto del curso de React Academy, actualiza a CoddyKit PRO. El curso de React Academy incluye 4 lecciones en total.
¿Qué aprenderé en «Salida dual de paquetes ESM y CJS»?
Generar builds tanto de módulos ES como de CommonJS con la configuración correcta del campo exports de package.json Practicas React Academy con código real que ejecutas directamente en el navegador, y un tutor de IA 24/7 responde tus preguntas mientras trabajas en la lección.
¿Necesito experiencia previa para empezar React Academy?
No se requiere experiencia previa. React Academy en CoddyKit está estructurado para principiantes hasta estudiantes avanzados, así que puedes empezar aquí o desde el inicio y avanzar a tu ritmo. Esta es la lección 2 de 4.
¿Cuánto tiempo toma la lección «Salida dual de paquetes ESM y CJS»?
La mayoría de las lecciones de CoddyKit toman alrededor de 5–10 minutos. Cada una es compacta e interactiva, así que avanzas constantemente y retomas exactamente por donde dejaste en la web y la app.
¿Puedo escribir y ejecutar código en esta lección de React Academy?
Sí. Cada lección de React Academy incluye un editor de código integrado, así que escribes y ejecutas código real directamente en tu navegador y obtienes retroalimentación instantánea de IA — sin configuración local necesaria.
Todas las lecciones de este curso
- Crear bundles con Rollup y tsup para bibliotecas
- Salida dual de paquetes ESM y CJS
- Dependencias peer y tree shaking
- Publicar en npm y versionado semántico