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-modulesbandera.Actualización 2: desde el Nodo 12 , puede usar la
.mjsextensión o establecerla"type": "module"en su package.json. Y necesita ejecutar el nodo con la--experimental-modulesbandera.Actualización: en el Nodo 9 , se habilita detrás de una bandera y usa la
.mjsextensión.Si bien
importes 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
requiredeclaraciones 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
importno es necesariamente una característica de TypeScript. TypeScript es ES6 con tipings. Así que cosas como importar son nativas de ES6.node index.jsfunciona para mí, pero cuando corronode dist/main.jstambién me saleUnexpected token import.index.jsesté pasando no significa quedist/main.jstambié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
.babelrcarchivo 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-envusando el comandonpm install babel-preset-env --save, y luego instalarbabel-cliusando el comandonpm install babel-cli -g --saveAhora, 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 startagregando el siguiente código a supackage.jsonarchivo: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
esmno se haya mencionado. Este pequeño pero poderoso paquete te permite usar cualquieraimportorequire.Instala esm en tu proyecto
$ npm install --save esmActualice su script de inicio de nodo para usar esm
node -r esm app.jsesmsolo funciona Perdí una TONELADA de tiempo.mjsy--experimental-modulessolo para descubrir que un.mjsarchivo no puede importar un archivo que usarequireomodule.exports. Este fue un gran problema, mientrasesmque le permite mezclar y combinar y simplemente lo resuelve ...esmsimplemente 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
exportpalabra claveexportpalabra 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 starthacer 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.josncamino de paso destart.js2) 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
.babelrcarchivo 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.jsEsto 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:devSeriamente. Es buena pregunta si eres nuevo. Cada cambio que se hace con el servidor de inicio cada vez que se usa
yarn start:devcomo servidor de desarrollo, cada cambio reinicia el servidor automáticamente para obtener más información sobre nodemonfuente
En mi caso, estaba cuidando el
.babelrcarchivo, y debería contener algo como esto:fuente