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.

This talk has been presented at TypeScript Congress 2023, check out the latest edition of this JavaScript Conference.

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
NPM workspaces help manage multiple nested packages within a single top-level package, improving since the release of NPM CLI 7.0. You can easily add dependencies to workspaces and handle duplications. Running scripts and orchestration in a monorepo is made easier with NPM workspaces. The npm pkg command is useful for setting and retrieving keys and values from package.json files. NPM workspaces offer benefits compared to Lerna and future plans include better workspace linking and adding missing features.
¿Webpack en 5 años?
JSNation 2022JSNation 2022
26 min
¿Webpack en 5 años?
Top Content
In the last 10 years, Webpack has shaped the way we develop web applications by introducing code splitting, co-locating style sheets and assets with JavaScript modules, and enabling bundling for server-side processing. Webpack's flexibility and large plugin system have also contributed to innovation in the ecosystem. The initial configuration for Webpack can be overwhelming, but it is necessary due to the complexity of modern web applications. In larger scale applications, there are performance problems in Webpack due to issues with garbage collection, leveraging multiple CPUs, and architectural limitations. Fixing problems in Webpack has trade-offs, but a rewrite could optimize architecture and fix performance issues.
Deja de Escribir tus Rutas
Vue.js London 2023Vue.js London 2023
30 min
Deja de Escribir tus Rutas
Designing APIs is a challenge, and it's important to consider the language used and different versions of the API. API ergonomics focus on ease of use and trade-offs. Routing is a misunderstood aspect of API design, and file-based routing can simplify it. Unplugging View Router provides typed routes and eliminates the need to pass routes when creating the router. Data loading and handling can be improved with data loaders and predictable routes. Handling protected routes and index and ID files are also discussed.
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
The Talk discusses the use of TypeScript and SQL together in software development. It explores different approaches, such as using an ORM like TypeORM or a schema generator like pg2ts. Query builders like connects JS and tools like PGTyped are also discussed. The benefits and trade-offs of using TypeScript and SQL are highlighted, emphasizing the importance of finding a middle ground approach.
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
Top Content
Today's Talk provides an overview of TypeScript performance and tools to address performance issues. It covers the compiler process, including the parser, binder, checker, and transformers steps. The Talk emphasizes the importance of keeping TypeScript up to date for better performance. It also discusses strategies for optimizing TypeScript compilation and debugging, analyzing build performance using trace files, and improving performance by simplifying types and avoiding overloading union types.
Lecciones de Mantenimiento de Bibliotecas TypeScript
TypeScript Congress 2022TypeScript Congress 2022
30 min
Lecciones de Mantenimiento de Bibliotecas TypeScript
Top Content
Mark Erickson, a Senior Frontend Engineer at Replay, discusses JavaScript libraries and their support for TypeScript, including migration, versioning, and debugging. He also explores the challenges of supporting multiple TypeScript versions and designing APIs for use with TypeScript. Additionally, he shares advanced Redux type tricks and insights into maintaining a TypeScript library. The poll results reveal the widespread usage of TypeScript among developers, with many gradually migrating their codebases. Lastly, he provides tips for upgrading TypeScript and verifying functionality.

Workshops on related topic

Dominando conceptos avanzados en TypeScript
React Summit US 2023React Summit US 2023
132 min
Dominando conceptos avanzados en TypeScript
Top Content
Featured WorkshopFree
Jiri Lojda
Jiri Lojda
TypeScript no es solo tipos e interfaces. Únete a esta masterclass para dominar características más avanzadas de TypeScript que harán tu código a prueba de balas. Cubriremos tipos condicionales y notación de inferencia, cadenas de plantillas y cómo mapear sobre tipos de unión y propiedades de objetos/arrays. Cada tema se demostrará en una aplicación de muestra que se escribió con tipos básicos o sin tipos en absoluto y juntos mejoraremos el código para que te familiarices más con cada característica y puedas llevar este nuevo conocimiento directamente a tus proyectos.
Aprenderás:- - ¿Qué son los tipos condicionales y la notación de inferencia?- ¿Qué son las cadenas de plantillas?- Cómo mapear sobre tipos de unión y propiedades de objetos/arrays.
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.