uncaught - unexpected token return javascript
Node.js-SyntaxError: importaciĆ³n de token inesperada (9)
A partir de Node.js v12 (y esto es probablemente bastante estable ahora, pero todavía marcado como "experimental"), tiene un par de opciones para usar ESM (Módulos de cripta E CMA S ) en Node.js (para archivos, hay un tercera forma de evaluar cadenas), esto es lo que dice la documentación :
El
--experimental-modules
se puede utilizar para habilitar la compatibilidad con los módulos ECMAScript (módulos ES).Una vez habilitado, Node.js tratará lo siguiente como módulos ES cuando se pasa al
node
como la entrada inicial, o cuando se hace referencia a él mediante declaraciones deimport
dentro del código del módulo ES:
Archivos que terminan en
.mjs
.Archivos que terminan en
.js
, o archivos sin extensión, cuando el archivo principalpackage.json
más cercano contiene un"type"
campo de nivel superior con un valor de"module"
.Las cadenas se pasan como argumento a
--eval
onode
través deSTDIN
, con el indicador--input-type=module
.Node.js tratará como CommonJS todas las demás formas de entrada, como archivos
.js
donde el archivopackage.json
padre más cercano no contiene un campo de"type"
nivel superior, o una entrada de cadena sin el indicador--input-type
. Este comportamiento es para preservar la compatibilidad con versiones anteriores. Sin embargo, ahora que Node.js admite los módulos CommonJS y ES, es mejor ser explícito siempre que sea posible. Node.js tratará lo siguiente como CommonJS cuando se pase alnode
como entrada inicial, o cuando se haga referencia a él mediante declaraciones deimport
dentro del código del módulo ES:
Archivos que terminan en
.cjs
.Archivos que terminan en
.js
, o archivos sin extensión, cuando el archivo principalpackage.json
más cercano contiene un"type"
campo de nivel superior con un valor de"commonjs"
.Las cadenas se pasan como argumento a
--eval
onode
través deSTDIN
, con el indicador--input-type=commonjs
.
No entiendo lo que está mal. Nodo v5.6.0 NPM v3.10.6
El código:
function (exports, require, module, __filename, __dirname) {
import express from ''express''
};
El error:
SyntaxError: Unexpected token import
at exports.runInThisContext (vm.js:53:16)
at Module._compile (module.js:387:25)
at Object.Module._extensions..js (module.js:422:10)
at Module.load (module.js:357:32)
at Function.Module._load (module.js:314:12)
at Function.Module.runMain (module.js:447:10)
at startup (node.js:140:18)
at node.js:1001:3
Como se menciona en otras respuestas, el nodo JS actualmente no admite importaciones ES6
(A partir de ahora, lea EDITAR 2)
Habilitar las importaciones de ES6 en el nodo js proporciona una solución a este problema. He cansado esto y funcionó para mí.
Ejecute el comando:
npm install babel-register babel-preset-env --save-dev
Ahora necesita crear un nuevo archivo (config.js) y agregarle el siguiente código.
require(''babel-register'')({
presets: [ ''env'' ]
})
// Import the rest of our application.
module.exports = require(''./your_server_file.js'')
Ahora puede escribir declaraciones de importación sin obtener ningún error.
Espero que esto ayude.
EDITAR:
Debe ejecutar el nuevo archivo que creó con el código anterior.
En mi caso fue
config.js
.
Entonces tengo que correr:
node config.js
EDITAR 2:
Mientras experimentaba, encontré una solución fácil para este problema.
Cree el archivo
.babelrc
en la raíz de su proyecto.
Agregue lo siguiente (y cualquier otro preajuste de babel que necesite, se puede agregar en este archivo):
{
"presets": ["env"]
}
Instale
babel-preset-env
usando el comando
npm install babel-preset-env --save
, y luego instale
babel-cli
usando el comando
npm install babel-cli -g --save
Ahora, vaya a la carpeta donde existe su servidor o archivo de índice y ejecútelo usando: babel-node fileName.js
O puede ejecutar usando
npm start
agregando el siguiente código a su archivo
package.json
:
"scripts": {
"start": "babel-node src/index.js"
}
Desafortunadamente, Node.js aún no admite la
import
de ES6.
Para lograr lo que está intentando hacer (importar el módulo Express), este código debería ser suficiente
var express = require("express");
Además, asegúrese de tener Express instalado ejecutando
$ npm install express
Consulte los documentos de Node.js para obtener más información sobre el aprendizaje de Node.js.
En caso de que aún no pueda usar "importar", así es como lo manejé: solo traduzca a un nodo amigable requerido. Ejemplo:
import { parse } from ''node-html-parser'';
Es lo mismo que:
const parse = require(''node-html-parser'').parse;
En mi caso, estaba
.babelrc
archivo
.babelrc
, y debería contener algo como esto:
{
"presets": ["es2015-node5", "stage-3"],
"plugins": []
}
si puede usar ''babel'', intente agregar scripts de compilación en package.json (- presets = es2015) como se muestra a continuación. hace precompilar el código de importación a es2015
"build": "babel server --out-dir build --presets=es2015 && webpack"
Actualización:
en el
Nodo 9
, se habilita detrás de una bandera y usa la extensión
.mjs
.
node --experimental-modules my-app.mjs
Si bien la
import
es parte de ES6, desafortunadamente todavía no se admite en NodeJS de forma predeterminada, y solo recientemente se ha admitido en los navegadores.
Consulte la tabla de compatibilidad del navegador en MDN y este problema de Nodo .
De la actualización de James M Snell sobre los módulos ES6 en Node.js (febrero de 2017):
El trabajo está en progreso, pero llevará algún tiempo. Actualmente estamos analizando alrededor de un año al menos.
Hasta que el soporte se muestre de forma nativa, deberá continuar utilizando las declaraciones de
require
clásicas:
const express = require("express");
Si realmente desea utilizar las nuevas funciones de ES6 / 7 en NodeJS, puede compilarlo con Babel. Aquí hay un servidor de ejemplo .
Error: SyntaxError: importación de token inesperada o SyntaxError: exportación de token inesperada
Solución: cambie todas sus importaciones como ejemplo
const express = require(''express'');
const webpack = require(''webpack'');
const path = require(''path'');
const config = require(''../webpack.config.dev'');
const open = require(''open'');
Y también cambia tu
export default = foo;
a
module.exports = foo;
La propuesta de Babel 7 puede agregar dependencias de desarrollo
npm i -D @babel/core @babel/preset-env @babel/register
y agregue un .babelrc en la raíz
{
"presets": [
[
"@babel/preset-env",
{
"targets": {
"node": "current"
}
}
]
]
}
y agregar al archivo .js
require("@babel/register")
o si lo ejecuta en el cli, puede usar el gancho require como -r @ babel / register, ej.
$node -r @babel/register executeMyFileWithESModules.js