Obteniendo una exportación de token inesperada
Estoy intentando ejecutar código ES6 en mi proyecto, pero aparece un error de exportación de token inesperado.
export class MyClass {
constructor() {
console.log("es6");
}
}
Actualizado para 2022
Está utilizando la sintaxis del módulo EcmaScript (ESM o 'Módulos ES6') pero su entorno no la admite.
Las versiones de NodeJS anteriores a la v14.13.0 no admiten ESM ( export
sintaxis de palabras clave) y utilizan módulos CommonJS ( module.exports
sintaxis de propiedad). NodeJS v14.13.0 y versiones posteriores admiten ESM, pero primero debe habilitarse.
Soluciones:
- Si está utilizando NodeJS v14.13.0 o posterior (que sí admite ESM), puede habilitarlo configurándolo
"type":"module"
en su proyectopackage.json
- Refactor con la sintaxis del módulo CommonJS (para versiones anteriores de NodeJS)
- Considere usar TypeScript junto
ts-node
conts-node-dev
paquetes npm (para transpilación instantánea en el momento del desarrollo) y escriba TypeScript en.ts
archivos - Transpile ESM a CommonJS usando esbuild (
esbuild
paquete en npm) configurado para transpilar su javascript ES6 a un destino CommonJS compatible con su entorno. ( Babel ya no es recomendable)
En caso de que reciba este error, también podría estar relacionado con cómo incluyó el archivo JavaScript en su página html. Al cargar módulos, debe declarar explícitamente esos archivos como tales. He aquí un ejemplo:
//module.js:
function foo(){
return "foo";
}
var bar = "bar";
export { foo, bar };
Cuando incluyes el script como este:
<script src="module.js"></script>
Recibirás el error:
Error de sintaxis no detectado: exportación de token inesperada
Debe incluir el archivo con un atributo de tipo establecido en "módulo":
<script type="module" src="module.js"></script>
entonces debería funcionar como se esperaba y estará listo para importar su módulo en otro módulo:
import { foo, bar } from "./module.js";
console.log( foo() );
console.log( bar );
Mis dos centavos
Exportar
ES6
miClase.js
export class MyClass1 {
}
export class MyClass2 {
}
otro.js
import { MyClass1, MyClass2 } from './myClass';
Alternativa común a JS
miClase.js
class MyClass1 {
}
class MyClass2 {
}
module.exports = { MyClass1, MyClass2 }
// or
// exports = { MyClass1, MyClass2 };
otro.js
const { MyClass1, MyClass2 } = require('./myClass');
Exportar predeterminado
ES6
miClase.js
export default class MyClass {
}
otro.js
import MyClass from './myClass';
Alternativa común a JS
miClase.js
module.exports = class MyClass1 {
}
otro.js
const MyClass = require('./myClass');
No es necesario usar Babel en este momento (JS se ha vuelto muy poderoso) cuando simplemente puede usar las exportaciones del módulo JavaScript predeterminado. Consulta el tutorial completo
Mensaje.js
module.exports = 'Hello world';
aplicación.js
var msg = require('./Messages.js');
console.log(msg); // Hello World
Solucioné esto creando un archivo de punto de entrada como.
// index.js
require = require('esm')(module)
module.exports = require('./app.js')
y cualquier archivo que importé dentro app.js
y fuera funcionó imports/exports
ahora, simplemente ejecútelo comonode index.js
Nota: si app.js
usa export default
, esto se convierte require('./app.js').default
en cuando se usa el archivo de punto de entrada.