Cómo resolver el require() de los módulos ES no es compatible
Estoy tratando de usar la biblioteca “split-on-first” para un proyecto, pero no puedo importarla.
He convertido todo el proyecto a TypeScript y cambié esta línea para usar “import” en lugar de “require”.
import splitOnFirst from 'split-on-first';
Sin embargo, cuando intento ejecutar mis pruebas unitarias, todavía recibo este error:
Error [ERR_REQUIRE_ESM]: Debe usar "import" para cargar un Módulo ES: <project>/node_modules/split-on-first/index.js
La función require() no es compatible con los módulos ES.
El require() de <project>/node_modules/split-on-first/index.js desde <project>/helpers/fileReview.ts es un archivo de módulo ES, ya que es un archivo .js cuyo package.json padre más cercano contiene "type": "module", lo que define todos los archivos .js en ese alcance de paquete como módulos ES.
En su lugar, cambie el nombre de index.js para que termine en .cjs, cambie el código que lo requiere para usar import(), o elimine "type": "module" de <project>/node_modules/split-on-first/package.json.
Mi tsconfig.json:
{
"compilerOptions": {
"esModuleInterop": true,
"lib": [
"es2019"
],
"module": "CommonJS",
"skipLibCheck": true,
"target": "ES2017",
"noImplicitAny": true,
"preserveConstEnums": true,
"outDir": "./build",
"sourceMap": true,
"baseUrl": "./",
"strict": true
},
"include": ["./**/*"],
"exclude": ["**/*.spec.ts"]
}
Ejecuto las pruebas unitarias a través de package.json: nyc mocha './tests/**/*.test.ts'
¿Qué estoy haciendo mal? ¡Cualquier ayuda es muy apreciada!
davy.ai
El mensaje de error sugiere que la biblioteca
split-on-first
es un módulo de ECMAScript (ES) y no se puede importar usandorequire()
. Para usar un módulo de ES en un entorno de CommonJS (que es lo que utiliza Node.js), debes usar la declaraciónimport
en su lugar.Dado que ya has convertido el proyecto a TypeScript y cambiado la declaración de importación de
split-on-first
para usarimport
, es posible que el problema esté relacionado con la biblioteca misma en lugar de tu código.El error sugiere que el
package.json
padre más cercano de la biblioteca contiene"type": "module"
, lo que significa que todos los archivos.js
en ese paquete se consideran módulos de ES. Sin embargo, dado que Node.js empezó a admitir módulos de ES a partir de la versión 13, es posible que necesites utilizar una solución alternativa para cargar la biblioteca.Una solución alternativa es agregar
"type": "commonjs"
alpackage.json
de la biblioteca. Otra opción es utilizar la bandera--experimental-modules
al ejecutar Node.js, pero esto no se recomienda para uso en producción.Si ninguna de estas soluciones funciona, es posible que necesites buscar una biblioteca alternativa que funcione con CommonJS o verificar si la biblioteca proporciona instrucciones para su uso con TypeScript o CommonJS.