Tengo un archivo .ts en la aplicación node js (última versión de node.js para el 10/07/19) con la importación del módulo de nodo sin exportación predeterminada. Puedo usar esta construcción: import { Class } from 'abc';
Cuando corro el código, tengo este error: Cannot use import statement outside a module
.
En la red veo muchas soluciones para este problema (para .js), pero no me ayuda, tal vez porque tengo un archivo de mecanografía. Aquí está mi código:
import { Class } from 'abc';
module.exports = { ...
execute(a : Class ,args : Array<string>){ ...
Aquí está mi tsconfig.json:
{
"compilerOptions": {
"target": "es6",
"module": "commonjs",
"strict": true
}
}
typescript
ecmascript-6
Zerumi
fuente
fuente
import
declaración la primera línea en su archivo?require
vsimport
) utiliza. Solo para darle una idea de lo complicado que es esto, Node tiene cierta documentación sobreimport
vsrequire
y cómo hacer que funcionen juntos.module.exports
sintaxis, probablemente no esté en un módulo ES6.execute(a : abc.Class...
Respuestas:
Agregar
“type”: “module”
a package.json le indicará a Node que está utilizando módulos ES2015, lo que debería eliminar el error, pero luego deberá indicar a Typecript que genere este tipo de módulo configurando en“module”: “es2015”
lugar de“commonjs”
tsconfig.json.Sin embargo, esto causa un problema con el código actual porque, aunque está utilizando una
import {}
instrucción ES6 , está exportando utilizando lamodule.exports = {}
sintaxis commonJS , y el cargador del módulo ES de Node tendrá un problema. Hay dos formas de lidiar con esto:module.exports
Nodo pero dígale a Node que interprete este archivo como commonJS dándole una extensión .cjs .export function execute(…)..
La primera opción podría ser un poco complicada porque el compilador generará archivos .js y tendrías que cambiarlo a .cjs todo el tiempo (que yo sepa). Con la segunda opción, debería poder ejecutar el archivo con Node (incluido el indicador --experimental-modules para las versiones <13.8).
Si absolutamente necesita usar commonJS, quizás sea mejor instalar las definiciones de tipo para Node: @ types / node y cambiar la importación al formato commonJS:
require('abc')
y mantener el resto de la configuración como está (aunque puede agregar "type" : "Commonjs" a package.json para ser explícito).fuente