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
javascript
node.js
npm
ecmascript-6
SofDroid
fuente
fuente
Respuestas:
Actualización 3: desde el Nodo 13 , puede usar la extensión .mjs o establecer "type": "module" en su package.json. Usted no necesita utilizar la
--experimental-modules
bandera.Actualización 2: desde el Nodo 12 , puede usar la
.mjs
extensión o establecerla"type": "module"
en su package.json. Y necesita ejecutar el nodo con la--experimental-modules
bandera.Actualización: en el Nodo 9 , se habilita detrás de una bandera y usa la
.mjs
extensión.Si bien
import
es parte de ES6, desafortunadamente aún no es compatible con NodeJS de manera predeterminada, y solo recientemente ha sido compatible con 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):
Hasta que el soporte se muestre de forma nativa, deberá continuar utilizando
require
declaraciones clásicas :Si realmente desea utilizar las nuevas funciones de ES6 / 7 en NodeJS, puede compilarlo con Babel. Aquí hay un servidor de ejemplo .
fuente
Desafortunadamente, Node.js aún no es compatible con ES6
import
.Para lograr lo que intenta hacer (importar el módulo Express), este código debería ser suficiente
Además, asegúrese de tener Express instalado ejecutando
Consulte los documentos de Node.js para obtener más información sobre el aprendizaje de Node.js.
fuente
import
no es necesariamente una característica de TypeScript. TypeScript es ES6 con tipings. Así que cosas como importar son nativas de ES6.node index.js
funciona para mí, pero cuando corronode dist/main.js
también me saleUnexpected token import
.index.js
esté pasando no significa quedist/main.js
también pasará.Como se mencionó en otras respuestas, el nodo JS actualmente no es compatible con las 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 intentado esto y funcionó para mí.
Ejecute el comando:
Ahora necesita crear un nuevo archivo (config.js) y agregarle el siguiente código.
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 lo fue
config.js
. Entonces tengo que correr:EDITAR 2:
Mientras experimentaba, encontré una solución fácil para este problema.
Cree un
.babelrc
archivo en la raíz de su proyecto.Agregue lo siguiente (y cualquier otro preajuste de babel que necesite, se puede agregar en este archivo):
Instalar
babel-preset-env
usando el comandonpm install babel-preset-env --save
, y luego instalarbabel-cli
usando el comandonpm 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 supackage.json
archivo:fuente
"start": "babel-node electron .",
pero no hubo suerteError: SyntaxError: importación de token inesperada o SyntaxError: exportación de token inesperada
Solución: cambie todas sus importaciones como ejemplo
Y también cambia tu
export default = foo;
amodule.exports = foo;
fuente
Estoy sorprendido de que
esm
no se haya mencionado. Este pequeño pero poderoso paquete te permite usar cualquieraimport
orequire
.Instala esm en tu proyecto
$ npm install --save esm
Actualice su script de inicio de nodo para usar esm
node -r esm app.js
esm
solo funciona Perdí una TONELADA de tiempo.mjs
y--experimental-modules
solo para descubrir que un.mjs
archivo no puede importar un archivo que usarequire
omodule.exports
. Este fue un gran problema, mientrasesm
que le permite mezclar y combinar y simplemente lo resuelve ...esm
simplemente funciona.fuente
En caso de que todavía no pueda usar "importar", así es como lo manejé: solo traduzca a un nodo amigable requerido. Ejemplo:
Es lo mismo que:
fuente
export
palabra claveexport
palabra clave, de todos modos, ¡gracias por tu útil nota!La propuesta de Babel 7 puede agregar dependencias de desarrollo
y agregue un .babelrc en la raíz
y agregar al archivo .js
o si lo ejecuta en el cli, puede usar el gancho require como -r @ babel / register, ej.
fuente
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
fuente
npm start
hacer primero la "compilación", o primero al "inicio"? (El inicio está definido actualmente:"nodemon src/app.js --exec \"npm run lint && node\"",
A partir de Node.js v12 (y esto es probablemente bastante estable, pero todavía marcado como "experimental"), que tiene un par de opciones para el uso de ESM ( E CMA S cripta M odules) en Node.js (para archivos, hay una tercera forma de evaluar cadenas), esto es lo que dice la documentación :
fuente
Cuando comencé con express siempre quise una solución para usar import en lugar de requerir
Muchas veces pasan por esta línea: -
Unfortunately, Node.js doesn't support ES6's import yet.
Ahora para ayudar a otros, creo dos nuevas soluciones aquí
1) esm : -
El cargador de módulos ECMAScript brillantemente simple, sin babel y sin paquete. hagámoslo funcionar
crea start.js o usa tu espacio de nombres
Cambio en su
package.josn
camino de paso destart.js
2) Babel js : -
Esto se puede dividir en 2 partes
a) Solución 1 gracias a timonweb.com
si) Solución 2
use Babel 6 (versión anterior de babel-preset-stage-3 ^ 6.0 ) cree el
.babelrc
archivo en su carpeta raízInstalar babel-preset-stage-3
Cambio en package.json
Inicia tu servidor
Oooh no, creamos un nuevo problema
Este error solo se produce cuando usa async / await en su código. Luego use polyfill que incluye un tiempo de ejecución de regenerador personalizado y core-js. agregar encima de
index.js
Esto le permite usar async / await
usar Babel 7
Necesita actualizar cada cosa en su proyecto, comencemos con babel 7 .babelrc
Algún cambio en package.json
y usar
import "@babel/polyfill"
en el punto de inicio¿Estás pensando por qué?
start:dev
Seriamente. Es buena pregunta si eres nuevo. Cada cambio que se hace con el servidor de inicio cada vez que se usa
yarn start:dev
como servidor de desarrollo, cada cambio reinicia el servidor automáticamente para obtener más información sobre nodemonfuente
En mi caso, estaba cuidando el
.babelrc
archivo, y debería contener algo como esto:fuente