Obteniendo una exportación de token inesperada

Resuelto Jason asked hace 8 años • 0 respuestas

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");
  }
}
Jason avatar Jul 11 '16 04:07 Jason
Aceptado

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 ( exportsintaxis de palabras clave) y utilizan módulos CommonJS ( module.exportssintaxis 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-nodecon ts-node-devpaquetes npm (para transpilación instantánea en el momento del desarrollo) y escriba TypeScript en .tsarchivos
  • Transpile ESM a CommonJS usando esbuild ( esbuildpaquete en npm) configurado para transpilar su javascript ES6 a un destino CommonJS compatible con su entorno. ( Babel ya no es recomendable)
Phil Ricketts avatar Oct 13 '2016 13:10 Phil Ricketts

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 );
Wilt avatar May 04 '2018 12:05 Wilt

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');
Barnstokkr avatar Mar 10 '2020 09:03 Barnstokkr

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
Alvin Konda avatar Oct 05 '2019 10:10 Alvin Konda

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.jsy fuera funcionó imports/exports ahora, simplemente ejecútelo comonode index.js

Nota: si app.jsusa export default, esto se convierte require('./app.js').defaulten cuando se usa el archivo de punto de entrada.

Alex Cory avatar Jan 22 '2020 00:01 Alex Cory