Estoy tratando de ejecutar algún código ES6 en mi proyecto, pero recibo un error inesperado de exportación de token.
export class MyClass {
constructor() {
console.log("es6");
}
}
fuente
Estoy tratando de ejecutar algún código ES6 en mi proyecto, pero recibo un error inesperado de exportación de token.
export class MyClass {
constructor() {
console.log("es6");
}
}
Está utilizando la sintaxis del módulo ES6.
Esto significa que su entorno (por ejemplo, node.js) debe admitir la sintaxis del módulo ES6.
NodeJS usa la sintaxis del módulo CommonJS ( module.exports
) no la sintaxis del módulo ES6 ( export
palabra clave).
Solución:
babel
paquete npm para transpilar su ES6 a un commonjs
objetivoo
Ejemplos de sintaxis de CommonJS son (de flaviocopes.com/commonjs/ ):
exports.uppercase = str => str.toUpperCase()
exports.a = 1
import
forma nativa? Pensé que v10.0.0 lo tendría, pero aparentemente no.
En caso de que reciba este error, también podría estar relacionado con la forma en que incluyó el archivo javascript en su página html. Al cargar módulos, debe declarar explícitamente esos archivos como tales. Aquí un ejemplo:
//module.js:
function foo(){
return "foo";
}
var bar = "bar";
export { foo, bar };
Cuando incluye el script de esta manera:
<script src="module.js"></script>
Obtendrás el error:
SyntaxError no capturado: 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>
Y luego funcionará como se espera y estará listo para importar su módulo en otro módulo:
import { foo, bar } from "./module.js";
console.log( foo() );
console.log( bar );
type
se espera que sea un tipo mime válido (también conocido como tipo de medio), por lo que este fue un hallazgo inesperado. ¡Gracias!
<script type="module">import ...</script>
, cuando importas desde el módulo. Lo probé en una versión reciente de Chromium.
Mis dos centavos
ES6
myClass.js
export class MyClass1 {
}
export class MyClass2 {
}
other.js
import { MyClass1, MyClass2 } from './myClass';
Alternativa CommonJS
myClass.js
class MyClass1 {
}
class MyClass2 {
}
module.exports = { MyClass1, MyClass2 }
// or
// exports = { MyClass1, MyClass2 };
other.js
const { MyClass1, MyClass2 } = require('./myClass');
ES6
myClass.js
export default class MyClass {
}
other.js
import MyClass from './myClass';
Alternativa CommonJS
myClass.js
module.exports = class MyClass1 {
}
other.js
const MyClass = require('./myClass');
Espero que esto ayude
Para usar ES6 agregue babel-preset-env
y en tu .babelrc
:
{
"presets": ["@babel/preset-env"]
}
Respuesta actualizada gracias al comentario de @ghanbari para aplicar babel 7.
babel
por el autor. Si bien la respuesta de Phil Ricketts aclara el problema, lo cual es bueno, esta respuesta es una solución directa al problema del autor.
No hay necesidad de usar Babel en este momento (JS se ha vuelto muy poderoso) cuando simplemente puede usar las exportaciones predeterminadas del módulo JavaScript. Ver tutorial completo
Message.js
module.exports = 'Hello world';
app.js
var msg = require('./Messages.js');
console.log(msg); // Hello World
Instale los paquetes de babel @babel/core
y @babel/preset
que convertirá ES6 en un objetivo commonjs ya que el nodo js no entiende los objetivos ES6 directamente
npm install --save-dev @babel/core @babel/preset-env
Luego, debe crear un archivo de configuración con el nombre .babelrc
en el directorio raíz de su proyecto y agregar este código allí
{
"presets": ["@babel/preset-env"]
}
Lo arreglé haciendo 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 más allá funcionó imports/exports
ahora solo lo ejecuta comonode index.js
Nota: si se app.js
usa export default
, esto se hace require('./app.js').default
cuando se usa el archivo de punto de entrada.
El uso de la sintaxis ES6 no funciona en el nodo, desafortunadamente, aparentemente debe tener babel para que el compilador entienda la sintaxis como exportar o importar.
npm install babel-cli --save
Ahora necesitamos crear un archivo .babelrc, en el archivo babelrc, configuraremos a babel para que use el preajuste es2015 que instalamos como preajuste al compilar en ES5.
En la raíz de nuestra aplicación, crearemos un archivo .babelrc. $ npm install babel-preset-es2015 --save
En la raíz de nuestra aplicación, crearemos un archivo .babelrc.
{ "presets": ["es2015"] }
Espero que funcione ... :)
export
que solo está disponible en ES6, y esos módulos son los que proporcionan soporte para ES6.module.exports = MyClass
, noexport class MyClass