Tengo una aplicación NodeJS con muchas rutas, funciones, etc. Tengo muchos archivos con const xxx = require('yyy') . Ahora quiero usar esto: https://www.npmjs.com/package/simple-ldap-search Pensé que mi viaje sería tan tranquilo como lo ha sido hasta ahora, pero no puedo usarlo, déjame explicarte : en lugar del require habitual, tengo que usar import , como se describe en la documentación:
import SimpleLDAP from 'simple-ldap-search'; Busqué en StackOverflow, y vi que podía poner "type": "module" en el archivo superior package.json , pero si lo hago, no puedo usar require ... Parece irresoluble.
¿Significa que tengo que elegir entre usar ES6 o CommonJS? Leí esta pregunta: Usar Node.js require vs. ES6 importar/exportar
import es más eficiente, ¿verdad?simple-ldap-search en mi aplicación de nodo actual sin hacer grandes cambios?require para import y viceversa?Gracias por tus respuestas.
Como indica este problema del proyecto , no es posible usar require en un proyecto que cambió a type: "module" en su paquete.json. Para estos casos de uso, se necesitaría usar un cargador como Babel, etc.
Vale la pena considerar cambiar a módulos ES, es decir, agregar type: "module" a su paquete de nivel superior.json. Todavía es posible importar un módulo CommonJS con import pero no funciona al revés.
Alternativamente, puede volver a cambiar a una versión 2.x de ese paquete, por lo que veo, hicieron el cambio a los módulos ES desde 3.0.0 en adelante.
Si bien no puede usar import en un archivo commonjs, puede usar import()
Esto hará que sea más molesto tener que lidiar con la carga asíncrona, pero probablemente sea más fácil que convertir todo su proyecto a ESModules.
const simpleLDAPLoader = import('simple-ldap-search'); // later async function () { const {default: SimpleLDAP} = await simpleLDAPLoader; const simpleLDAP = new SimpleLDAP(); }Y esto usará la versión en caché cada vez que espere la promesa existente
Fuente: https://nodejs.org/api/esm.html#esm_interoperability_with_commonjs
No se admite el uso de require para cargar un módulo ES porque los módulos ES tienen una ejecución asíncrona. En su lugar, use import() para cargar un módulo ES desde un módulo CommonJS.
No estoy seguro de si te ayudará en tu caso, pero he encontrado esta solución por mí mismo y puedo usar la importación de ES6 y "requerir" al mismo tiempo. En paquete.json:
"type": "module"Y en su expediente:
import { createRequire } from "module"; const require = createRequire(import.meta.url);¡Funciona para mis proyectos!