Vite y los Node.js modules al crear un NPM module
Thu Aug 29 2024
Recientemente trabajando con algunos módulos personales y otros organizacionales, había tenido complicaciones para poder hacer la construcción (o build
), ya que entre unas dependencias y otras no eran compatibles por el uso de CJS
y ESM
en conjunto, también porque; para evitar usar dependencias extra las estaba transpilando por medio de tsc
, el compilador de Typescript
. Pero opte por dejar de lado mis expectativas y agregar una herramienta que me ayude en el proceso de construcción y así evitarme los problemas.
Node.js
es el entorno de ejecución de Javascript del lado del servidor, es decir; es el que nos permite ejecutar archivos javascript sin necesidad del buscador.
Vite
es una herramienta de tooling para frontend utilizada para poder, entre otras cosas; transpilar y empaquetar proyectos Javascript, algo similar a herramientas como Webpack
, Snowpack
, TurboPack
, Rollup
y un largo etc…
La mejor alternativa para poder hacer el proceso de construcción, para que fuera rápido y eficiente era usar vite
, y principalmente porque en el contexto de desarrollo en el cual participo es más fácil que le puedan meter mano para el mantenimiento y se comprenda mejor el funcionamiento. Así que una vez instalado y configurado ya podría iniciar a trabajar con el.
Las configuraciones quedaron de la siguiente forma:

Y como quería generar tanto los archivos para CJS como para ESM agregué 2 archivos de configuración de typescript:

Finalmente el package.json quedó sencillo:

Y con esto al ejecutarse ya se generaban de forma correcta los archivos en el directorio dist
junto con sus tipos

Pero a la hora de la construcción…. Oh! sorpresa! 🤯
Que aparecen los warnings!!!

Bueno, solo son advertencias que no son graves pero si son bastante explicitas. ¿Y esto que significa?
Básicamente buscando un poco en la documentación de vite
se expone, lo siguiente:

Claramente nos dice:
“Cuando usas o haces uso de módulos de nodejs en el buscador, vite lanzará una advertencia. […] Esto es porque vite no hace el relleno de los módulos de nodejs […]“
Y tanto tiene razón, como suena lógico, no? Al ser una herramienta de tooling para Frontend pues nada de las APIs nativas de Node tienen acceso desde el buscador pues no van a funcionar.
Intente con la opción oficial que se muestra en la advertencia, así como con otra opción dentro de algunas issues de Github pero no funcionaron o quizá yo no entendí bien como poder realizar la implementación:
- rollup-plugin-polyfill-node
- rollup-plugin-node-builtins
Finalmente opté por regresar, en el proyecto principal que consumiría dichos módulos, a usar el compilador de typescript
y estas subdependencias ya en teoría no deberían fallar porque tendrían tanto su construcción en CJS
y ESM
pues sería relativamente sencillo poder realizar la tarea.
Y efectivamente, la configuración del build
en el proyecto principal quedo de la siguiente forma:

Eliminando a vite de este y como prueba finalmente solo tenia que enlazar el repo de forma local, ejecutar un comando y comprobar su funcionamiento.
Dado esto, resulta que investigando, desde vite
ya están trabajando en alguna característica interesante para soportar esta parte desde el lado del servidor o más bien para el modo library
, y justo lo mencionan en el siguiente issue:

Y dentro del mismo uno de los Core Team Members, Matias Capeletto A.k.a patak-dev, agrega un comentario al final del issue:

Y dentro de la documentación, se anuncia que justo ya se está trabajando renombrando la actual API Vite Runtime y que ahora será Environment API a partir de la versión 6

Y también buscando un poco, resulta que probablemente las implementaciones pude haberlas realizado mal o con deficiencias, ya que resulta que ambas dependencias ya están en desuso o bien solo las mantiene la comunidad, de acuerdo a lo que se comenta en este artículo de StackOverflow y su referencia a este otro artículo.

Pero de forma esporádica y tienen algunas deficiencias, que a juzgar por el contenido del issue y con lo breve que logré revisar de vistazo, resulta que estaban trabajando en unificar ambas dependencias, aun me falta hacer la revisión completa, pero aquí dejo el issue:

Al final de este artículo vienen los medios por los cuales puedes seguir lo que voy publicando. Espero te haya gustado esta pequeña experiencia y pato-aventura de un día en el desarrollo.
Happy coding 🖖
Referencias
- Environment API. (s/f). Vitejs. Recuperado el 29 de agosto de 2024, de https://deploy-preview-16471–vite-docs-main.netlify.app/guide/api-environment
- node-builtins plugin · Issue #2881 · rollup/rollup. (s/f).
- Npm: Rollup-plugin-node-builtins. (s/f). Npm. Recuperado el 29 de agosto de 2024, de https://www.npmjs.com/package/rollup-plugin-node-builtins
- Npm: Rollup-plugin-polyfill-node. (s/f). Npm. Recuperado el 29 de agosto de 2024, de https://www.npmjs.com/package/rollup-plugin-polyfill-node
- Polyfill node os module with vite/rollup.js. (s/f). Stack Overflow. Recuperado el 29 de agosto de 2024, de https://stackoverflow.com/questions/69286329/polyfill-node-os-module-with-vite-rollup-js
- Taioli, F. (2022, enero 11). Polyfill node.Js built-in modules with Vite. Medium. https://medium.com/@ftaioli/using-node-js-builtin-modules-with-vite-6194737c2cd2
- Troubleshooting. (s/f). Vitejs. Recuperado el 29 de agosto de 2024, de https://vitejs.dev/guide/troubleshooting.html
- Vite. (s/f).
- Vite · discussion #6198. (s/f).