Publicación de bibliotecas de TS para diversión y beneficio

Rate this content
Bookmark

Publicar bibliotecas en NPM es fácil: solo `tsc && npm publish` y listo, ¿verdad?

Ups, olvidaste la compatibilidad adecuada con ESM. Y un usuario está solicitando una compilación UMD. Y no funciona en Webpack 4. Y `moduleResolution: "node16"` no puede encontrar los tipos.

Publicar bibliotecas hoy en día es _complicado_. Analizaremos los muchos problemas y preguntas que debes considerar al publicar un paquete, y algunas posibles respuestas obtenidas con mucho esfuerzo a esas preguntas.

FAQ

Mark Erickson es un ingeniero senior de front-end en Replay, donde trabajan en el desarrollo de un depurador de viaje en el tiempo para JavaScript.

Al publicar paquetes, es importante considerar los formatos de archivo de los artefactos de compilación, si se deben empaquetar o mantener archivos JavaScript individuales, las exportaciones de paquetes, y cómo diferentes herramientas como Node y WebPack manejan estos paquetes.

El archivo UMD (Universal Module Definition) es un formato que puede utilizarse como un archivo AMD, CommonJS o una etiqueta de script global. Mark decidió eliminar los archivos UMD de sus paquetes debido a que consideró que se sentía obsoleto y probablemente ya no necesario.

ESM (ECMAScript Modules) es la sintaxis definida en ES2015 para importar y exportar módulos. Es relevante porque la mayoría de las bibliotecas se convierten a CommonJS antes de publicarse y ESM aún enfrenta problemas de interoperabilidad y soporte en diferentes entornos.

Agregar 'type module' y 'exports' fue un cambio importante que implicó modernizar la configuración de compilación y los scripts, lo que causó incompatibilidades, especialmente bajo Jest, debido a confusiones entre exportaciones predeterminadas y exportaciones con nombre.

La migración de CommonJS a ESM presenta desafíos como la compatibilidad con herramientas y empaquetadores existentes, la necesidad de cambiar extensiones de archivo y la falta de guías claras y documentación sobre cómo manejar esta transición efectivamente.

Mark menciona herramientas como ESBuild y tsup, que facilitan la generación de artefactos de compilación y archivos de definición de TypeScript, siendo útiles para mantener la configuración de paquetes correcta en el desarrollo local y en CI.

La tecnología de componentes de servidor de React ha complicado la compatibilidad y mantenimiento de bibliotecas como Redux, generando una constante recepción de informes de errores y aumentando la complejidad para los mantenedores de bibliotecas.

Mark Erikson
Mark Erikson
31 min
21 Sep, 2023

Comments

Sign in or register to post your comment.

Video Summary and Transcription

Mark Erickson analiza las complejidades de publicar bibliotecas de TypeScript, incluyendo consideraciones como formatos de archivos de artefactos de compilación, exportaciones de paquetes y diferentes entornos de usuario. Comparte sus experiencias con el soporte de ESM y la interoperabilidad con otros formatos de módulo, y los desafíos enfrentados al migrar Redux a TypeScript. Erickson destaca la importancia de comprender los formatos de archivos y los tipos de módulo, y las ideas obtenidas de las discusiones con el equipo de TypeScript. También enfatiza la necesidad de mejores herramientas y documentación en el ecosistema para publicar y mantener bibliotecas de TypeScript.

1. Introducción a la publicación de bibliotecas TypeScript

Short description:

Hola, mi nombre es Mark Erickson y hoy estoy muy emocionado de hablarles sobre la publicación de bibliotecas TypeScript para divertirse y obtener ganancias. Publicar paquetes no es tan simple como ejecutar TSC y npm publish. Hay muchas consideraciones a tener en cuenta, como los formatos de archivo de los artefactos de compilación, las exportaciones de paquetes, los diferentes entornos de usuario, las diferencias de comportamiento del empaquetador y más. Mantener Redux y otras bibliotecas me ha dado una idea de las complejidades del proceso, incluidos los desafíos del soporte de ESM y la interoperabilidad con otros formatos de módulo.

♪ Hola, mi nombre es Mark Erickson, y hoy estoy muy emocionado de hablarles sobre la publicación de bibliotecas TypeScript para divertirse y obtener ganancias. ¿Mayormente emocionado? ¿Algo emocionado? Bueno, miren, ha sido un año realmente difícil. No ha habido mucha diversión. Y en realidad, créanme, no ha habido ninguna ganancia en absoluto. Vamos a repasar los detalles.

Un par de cosas rápidas sobre mí. Soy un ingeniero senior de front-end en Replay, donde estamos construyendo un depurador de viaje en el tiempo para JavaScript. Por favor, échenle un vistazo. Responderé preguntas prácticamente en cualquier lugar donde haya un cuadro de texto en Internet. Recolecto todo tipo de enlaces interesantes. Escribo publicaciones de blog extremadamente largas. Soy un mantenedor de Redux, pero la mayoría de la gente me conoce como ese tipo con el avatar de los Simpsons.

Entonces, ¿publicar paquetes es realmente simple, verdad? Simplemente ejecutas TSC y npm publish, y listo. Gracias. Oh chico, wow, ojalá fuera tan fácil. Esta charla sería mucho más corta si lo fuera. A principios de este año me molesté un poco y publiqué un tweet donde enumeré algunas de las cosas que debes tener en cuenta al publicar paquetes. Formatos de archivo de los artefactos de compilación, si debes empaquetar o mantener archivos JavaScript individuales, exportaciones de paquetes, WebPack 4, resolución de módulos de TypeScript, diferentes entornos de usuario, diferencias de comportamiento del empaquetador, Node ESM versus CGS, si debes empaquetar tus tipos de TypeScript y el uso del cliente de React. No hay guías. Todos están tomando prestado de todos los demás, y es un milagro que este ecosistema funcione en absoluto.

Entonces, ¿cómo me involucré en este proceso? Bueno, he estado manteniendo Redux durante los últimos años, y desde principios de este año, he mantenido cinco bibliotecas diferentes. Redux core, React Redux, Redux Slunk, Reselect y Redux Toolkit. Cada una de estas tenía una configuración de compilación algo diferente, pero en general, había una mezcla de artefactos de compilación ESM, CommonJS y UMD. Todo usaba la extensión .js. Todo se compilaba a ES5 para ser compatible con IE11. La mayoría de los paquetes usaban rollup más babble, excepto Redux Toolkit, que usaba es-build. Ninguno de los paquetes definía el campo de exportaciones en package.json, y se usaban una variedad de carpetas diferentes para la salida de compilación.

Entonces, ¿qué significa realmente el soporte de ESM? El problema aquí es que la especificación del lenguaje ES2015 definió la sintaxis para importar y exportar, y algunos de los comportamientos esperados, pero no definió cómo los entornos de ejecución, como el navegador o Node, deben manejar la carga de estos, o cómo deben interoperar con otros formatos de módulo como CommonJS. La mayoría de nosotros hemos estado escribiendo sintaxis de ESM durante años, pero cuando publicas una biblioteca, normalmente la conviertes a CommonJS antes de publicarla. Y también sueles compilar tu sintaxis a ES5, para que funcione en IE11, desafortunadamente.

2. Comprendiendo los Formatos de Archivo y los Tipos de Módulo

Short description:

Entonces, el JSON empaquetado tiene diferentes campos que las herramientas buscan para encontrar el archivo correcto. Node tardó años en agregar soporte para módulos ES. Hay un nuevo campo llamado exports, pero es un cambio rompedor. Node entiende el tipo de archivo a través de la extensión del archivo o el campo de tipo de módulo. Decidimos modernizar los paquetes de Redux y encontramos problemas de importación en el entorno Node-ESM. Migramos Redux a TypeScript pero no lo lanzamos. Queríamos una salida de compilación moderna y tamaños de paquete más pequeños.

Entonces, el JSON empaquetado tiene varios campos diferentes que diferentes herramientas buscan para encontrar el archivo correcto. Node busca en el campo principal para archivos CommonJS, los empaquetadores a menudo buscan en el campo de módulo para ESM, las CDNs y herramientas como unpackage buscan diferentes claves, TypeScript busca sus tipos de TypeScript, y todas estas diferentes herramientas tienen diferentes expectativas. Además, a Node le llevó años agregar un soporte decente para módulos ES porque estaban tratando de averiguar cómo funcionaría con CommonJS.

Entonces, hay un campo relativamente nuevo llamado exports, y se supone que es el único lugar definitivo donde le dices a las herramientas cómo encontrar tus diferentes puntos de entrada y diferentes formatos de archivo. Entonces puedes encontrar una gran cantidad de puntos de entrada diferentes, puedes tener condiciones anidadas, como aquí es donde encontrar un archivo ESM versus un archivo CommonJS, puedes definir condiciones como desarrollo y producción. Pero el problema es que agregar exports es realmente un cambio rompedor para tu paquete, lo que significa que solo puedes hacerlo en una versión principal.

Entonces, ¿cómo entiende Node si un archivo dado es ESM o CommonJS? Hay dos formas diferentes. Una es que ahora te permite usar una extensión de archivo .mjs o .cjs para declarar qué tipo de módulo es, o puedes agregar el campo de tipo de módulo en el nivel superior, o tipo CommonJS, y cada archivo con una extensión .js se tratará como si fuera ese tipo de módulo. Entonces, a principios de año, decidimos modernizar todos los paquetes de Redux. Habíamos recibido algunos informes de errores de que no se podían importar correctamente en un entorno Node-ESM. En realidad, habíamos migrado el núcleo de Redux a TypeScript en 2019 y luego nunca lo lanzamos. La versión 4 funcionaba bien y teníamos preocupaciones sobre lanzar una nueva versión principal. Y queríamos modernizar toda la salida de compilación y enviar sintaxis JS moderna para tamaños de paquete más pequeños.

Check out more articles and videos

We constantly think of articles and videos that might spark Git people interest / skill us up or help building a stellar career

Elevando Monorepos con los Espacios de Trabajo de npm
DevOps.js Conf 2022DevOps.js Conf 2022
33 min
Elevando Monorepos con los Espacios de Trabajo de npm
Top Content
Aprenda más sobre cómo aprovechar las características predeterminadas de los espacios de trabajo de npm para ayudarlo a administrar su proyecto monorepo, mientras también explora algunas de las nuevas características de npm cli.
¿Webpack en 5 años?
JSNation 2022JSNation 2022
26 min
¿Webpack en 5 años?
Top Content
¿Qué podemos aprender de los últimos 10 años para los próximos 5 años? ¿Hay un futuro para Webpack? ¿Qué necesitamos hacer ahora?
Deja de Escribir tus Rutas
Vue.js London 2023Vue.js London 2023
30 min
Deja de Escribir tus Rutas
Cuanto más trabajas en una aplicación, más complicado se vuelve su enrutamiento y más fácil es cometer un error. "¿Se llamaba la ruta usuarios o usuario?", "¿Tenía un parámetro id o era userId?". Si solo TypeScript pudiera decirte cuáles son los nombres y parámetros posibles. Si solo no tuvieras que escribir una sola ruta más y dejar que un complemento lo haga por ti. En esta charla repasaremos lo que se necesitó para traer rutas automáticamente tipadas para Vue Router.
TypeScript y la Base de Datos: ¿Quién Posee los Tipos?
TypeScript Congress 2022TypeScript Congress 2022
27 min
TypeScript y la Base de Datos: ¿Quién Posee los Tipos?
Top Content
Todos amamos escribir tipos en TypeScript, pero a menudo nos encontramos teniendo que escribir tipos en otro lenguaje también: SQL. Esta charla presentará la historia de elige-tu-propia-aventura que enfrentas al combinar TypeScript y SQL y te guiará a través de los compromisos entre las diversas opciones. Combinados de manera deficiente, TypeScript y SQL pueden ser duplicativos y una fuente de dolores de cabeza, pero si se hacen bien, pueden complementarse entre sí al abordar las debilidades de cada uno.
Lecciones de Mantenimiento de Bibliotecas de TypeScript
TypeScript Congress 2022TypeScript Congress 2022
30 min
Lecciones de Mantenimiento de Bibliotecas de TypeScript
Mantener bibliotecas de JS ampliamente utilizadas ya es complicado, y TypeScript agrega un conjunto adicional de desafíos.

Únete al mantenedor de Redux, Mark Erikson, para conocer algunos de los problemas únicos a los que se enfrentan los mantenedores de bibliotecas de TS y cómo el equipo de Redux ha abordado esos problemas. Cubriremos:

- Compromisos de diferentes formas de definir tipos de TS para una biblioteca
- Cómo apuntar a diferentes versiones de TS y consideraciones para determinar el rango de versiones admitidas
- Migrar bibliotecas de JS existentes a TS
- Diferencias entre escribir tipos de "aplicación" y tipos de "biblioteca"
- Administrar y versionar APIs de tipos públicos
- Consejos y trucos utilizados por los tipos de las bibliotecas de Redux
- Limitaciones de TS y posibles mejoras a nivel de lenguaje
Rendimiento de TypeScript: Yendo más allá de la superficie
TypeScript Congress 2023TypeScript Congress 2023
34 min
Rendimiento de TypeScript: Yendo más allá de la superficie
¿Alguna vez te encuentras preguntándote cómo identificar y abordar problemas de rendimiento en TypeScript para maximizar la efectividad de tu código? Si es así, únete a nosotros para una charla sobre el rendimiento de TypeScript y las técnicas que puedes utilizar para sacar el máximo provecho de tu código. Profundizaremos en varias formas de depurar el rendimiento, exploraremos cómo aprovechar el poder del compilador de TypeScript para detectar posibles problemas de rendimiento y utilizaremos las herramientas de perfilado disponibles para rastrear los cuellos de botella subyacentes.

Workshops on related topic

Encontrar, Hackear y solucionar las vulnerabilidades de NodeJS con Snyk
JSNation 2022JSNation 2022
99 min
Encontrar, Hackear y solucionar las vulnerabilidades de NodeJS con Snyk
WorkshopFree
Matthew Salmon
Matthew Salmon
npm y seguridad, ¿cuánto sabes sobre tus dependencias?Hack-along, hacking en vivo de una aplicación Node vulnerable https://github.com/snyk-labs/nodejs-goof, Vulnerabilidades tanto de código abierto como de código escrito. Se anima a descargar la aplicación y hackear junto con nosotros.Corrigiendo los problemas y una introducción a Snyk con una demostración.Preguntas abiertas.
Construye aplicaciones Web3 con React
React Summit 2022React Summit 2022
51 min
Construye aplicaciones Web3 con React
WorkshopFree
Shain Dholakiya
Shain Dholakiya
El masterclass está diseñado para ayudar a los desarrolladores Web2 a comenzar a construir para Web3 utilizando el Hyperverse. El Hyperverse es un mercado abierto de módulos inteligentes construidos por la comunidad, auditados y fáciles de descubrir. Nuestro objetivo es hacer que sea fácil para los desarrolladores de React construir aplicaciones Web3 sin escribir una sola línea de código de contrato inteligente. Piensa en 'npm para contratos inteligentes'.
Aprende más sobre el Hyperverse aquí.
Repasaremos todos los conceptos básicos de blockchain/crypto que necesitas saber para comenzar a construir en el Hyperverse, por lo que no necesitas tener ningún conocimiento previo sobre el espacio Web3. Solo necesitas tener experiencia en React.