Moment: Agregar soporte para paquetes compatibles con ESM

Creado en 12 nov. 2019  ·  3Comentarios  ·  Fuente: moment/moment

¡Hola!

¡Gracias por esta gran biblioteca!

Sin embargo, creo que el campo "module" en el manifiesto del paquete ( package.json archivo) debería apuntar al paquete ESM, por ejemplo, ./src/moment.js .

Los paquetes que admiten ESM (Webpack, Rollup y otros) deberían poder encontrar el paquete ESM utilizando el campo module para utilizar técnicas de optimización modernas (como sacudir árboles). En este momento, se usa el paquete ./moment.js UMD.

Esto hace que se cargue la biblioteca completa en proyectos habilitados para ESM, incluso si importa un solo símbolo de ella.

Por ejemplo, una importación como esta:

import { isMoment } from 'moment';

importará todo de la biblioteca, sin embargo, solo se solicitó una función.

Y no puede usar import { isMoment } from 'moment/src/moment'; como solución alternativa en proyectos de TypeScript porque romperá la mecanografía.

BuilRelease Help Wanted

Comentario más útil

Después de mirar el contenido de ./src/moment.js , estoy retractando mis palabras. El contenido no tiene ningún sentido desde el punto de vista de ESM. En lugar de importar y reexportar símbolos útiles como Moment , isMoment , etc., está construyendo un objeto y lo exporta. Creo que es un punto de entrada para el paquete UMD, ¿no?

Para que las herramientas modernas funcionen, necesitamos un paquete de ESM adecuado, que exportará todos los símbolos útiles de forma individual.

Me las arreglé para importar los símbolos que necesito (sin cargar el paquete completo de moment.js) de esta manera:

// @ts-ignore
import { isMoment, Moment } from 'moment/src/lib/moment/constructor';

Pero tuve que suprimir los errores de escritura con @ts-ignore , lo que permite la importación, pero rompe todas las mecanografías de los símbolos importados. Además, la ruta es fea y los usuarios finales no deben usarla (porque rompe la encapsulación).


Acabo de hacer un experimento. Creé un archivo llamado moment.esm.js en la raíz del paquete con el siguiente contenido:

export { isMoment, Moment } from './src/lib/moment/constructor';

Y agregó un campo module para señalarlo desde el manifiesto del paquete.

Luego lo importé en mi aplicación:

import { isMoment, Moment } from 'moment';

Se importó correctamente con las declaraciones de escritura funcionando como se esperaba y también funcionó correctamente durante las compilaciones de Webpack y Rollup. Solo se importaron los símbolos especificados sin cargar un paquete completo con todas las configuraciones regionales.

Creo que es un camino por recorrer y se puede ampliar para exportar otros símbolos, descritos en las declaraciones.

Todos 3 comentarios

Después de mirar el contenido de ./src/moment.js , estoy retractando mis palabras. El contenido no tiene ningún sentido desde el punto de vista de ESM. En lugar de importar y reexportar símbolos útiles como Moment , isMoment , etc., está construyendo un objeto y lo exporta. Creo que es un punto de entrada para el paquete UMD, ¿no?

Para que las herramientas modernas funcionen, necesitamos un paquete de ESM adecuado, que exportará todos los símbolos útiles de forma individual.

Me las arreglé para importar los símbolos que necesito (sin cargar el paquete completo de moment.js) de esta manera:

// @ts-ignore
import { isMoment, Moment } from 'moment/src/lib/moment/constructor';

Pero tuve que suprimir los errores de escritura con @ts-ignore , lo que permite la importación, pero rompe todas las mecanografías de los símbolos importados. Además, la ruta es fea y los usuarios finales no deben usarla (porque rompe la encapsulación).


Acabo de hacer un experimento. Creé un archivo llamado moment.esm.js en la raíz del paquete con el siguiente contenido:

export { isMoment, Moment } from './src/lib/moment/constructor';

Y agregó un campo module para señalarlo desde el manifiesto del paquete.

Luego lo importé en mi aplicación:

import { isMoment, Moment } from 'moment';

Se importó correctamente con las declaraciones de escritura funcionando como se esperaba y también funcionó correctamente durante las compilaciones de Webpack y Rollup. Solo se importaron los símbolos especificados sin cargar un paquete completo con todas las configuraciones regionales.

Creo que es un camino por recorrer y se puede ampliar para exportar otros símbolos, descritos en las declaraciones.

Yo apoyo esto.

Ver https://momentjs.com/docs/#/ -project-status /

¿Fue útil esta página
0 / 5 - 0 calificaciones