Je ne comprends pas ce qui ne va pas. Node v5.6.0 NPM v3.10.6
Le code:
function (exports, require, module, __filename, __dirname) {
import express from 'express'
};
L'erreur:
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
Mise à jour: Dans Noeud 9 , il est activé derrière un drapeau et utilise l'extension .mjs
.
node --experimental-modules my-app.mjs
Bien que import
fasse effectivement partie de ES6, il n’est malheureusement pas encore pris en charge par défaut dans NodeJS et n’a que très récemment pris en charge ce support dans les navigateurs.
Voir table des navigateurs compatibles sur MDN et ce Node numéro =.
De James M Snell's Mise à jour sur les modules ES6 dans Node.js (février 2017):
Les travaux sont en cours, mais cela va prendre du temps - nous en sommes actuellement à au moins un an.
Jusqu'à ce que le support apparaisse de manière native, vous devrez continuer à utiliser les instructions classiques require
:
const express = require("express");
Si vous voulez vraiment utiliser les nouvelles fonctionnalités de l'ES6/7 dans NodeJS, vous pouvez le compiler à l'aide de Babel. Voici un exemple de serveur .
Malheureusement, Node.js ne prend pas encore en charge le import
de ES6.
Pour accomplir ce que vous essayez de faire (importer le module Express), ce code devrait suffire
var express = require("express");
Assurez-vous également que Express est installé en exécutant
$ npm install express
Voir le Docs Node.js pour plus d'informations sur l'apprentissage de Node.js.
Erreur: SyntaxError: Jeton inattendu import ou SyntaxError: Jeton inattendu export
Solution: Modifiez toutes vos importations à titre d'exemple.
const express = require('express');
const webpack = require('webpack');
const path = require('path');
const config = require('../webpack.config.dev');
const open = require('open');
Et changez également votre export default = foo;
en module.exports = foo;
Comme indiqué dans d'autres réponses Node JS ne prend actuellement pas en charge les importations ES6.
(A partir de maintenant, lisez EDIT 2)
Activer les importations ES6 dans le noeud js fournit une solution à ce problème. J'ai fatigué cela et cela a fonctionné pour moi.
Exécutez la commande:
npm install babel-register babel-preset-env --save-dev
Maintenant, vous devez créer un nouveau fichier (config.js) et y ajouter le code suivant.
require('babel-register')({
presets: [ 'env' ]
})
// Import the rest of our application.
module.exports = require('./your_server_file.js')
Vous pouvez maintenant écrire des instructions d'importation sans commettre d'erreur.
J'espère que cela t'aides.
EDIT:
Vous devez exécuter le nouveau fichier que vous avez créé avec le code ci-dessus. Dans mon cas, c'était config.js
. Donc je dois courir:
node config.js
EDIT 2:
En expérimentant, j'ai trouvé une solution simple à ce problème.
Créez le fichier .babelrc
à la racine de votre projet.
Ajoutez ce qui suit (et tous les autres préréglages babel dont vous avez besoin peuvent être ajoutés dans ce fichier):
{
"presets": ["env"]
}
Installez babel-preset-env
à l'aide de la commande npm install babel-preset-env --save
, puis installez babel-cli
à l'aide de la commande npm install babel-cli -g --save
.
Maintenant, allez dans le dossier contenant votre serveur ou votre fichier d’index et exécutez-vous à l’aide de: babel-node nomFichier.js
Ou vous pouvez utiliser npm start
en ajoutant le code suivant à votre fichier package.json
:
"scripts": {
"start": "babel-node src/index.js"
}
Dans le cas où vous ne pouvez toujours pas utiliser "import", voici comment je l'ai géré: il suffit de le traduire en un nœud convivial. Exemple:
import { parse } from 'node-html-parser';
Est le même que:
const parse = require('node-html-parser').parse;
si vous pouvez utiliser 'babel', essayez d'ajouter des scripts de construction dans package.json (- presets = es2015) comme ci-dessous. il fait pour précompiler le code d'importation en es2015
"build": "babel server --out-dir build --presets=es2015 && webpack"
proposition de babel 7 pouvez-vous ajouter des dépendances de dev
npm i -D @babel/core @babel/preset-env @babel/register
et ajoutez un .babelrc à la racine
{
"presets": [
[
"@babel/preset-env",
{
"targets": {
"node": "current"
}
}
]
]
}
et ajouter au fichier .js
require("@babel/register")
ou si vous l'exécutez dans la cli, vous pouvez utiliser le crochet require comme -r @ babel/register, ex.
$node -r @babel/register executeMyFileWithESModules.js
Depuis Node.js v12 (et ceci est probablement assez stable maintenant, mais toujours marqué "expérimental"), vous avez deux options pour utiliser ESM (E CMA S cript M odules) dans Node.js (pour les fichiers, il existe une troisième méthode pour évaluer les chaînes), voici ce que la documentation dit:
L'indicateur _
--experimental-modules
_ peut être utilisé pour activer la prise en charge des modules ECMAScript (modules ES).Une fois activé, Node.js considérera les éléments suivants comme des modules ES lorsqu'ils sont passés à
node
comme entrée initiale ou lorsqu'ils sont référencés par les instructionsimport
dans le code du module ES:
Fichiers se terminant par _
.mjs
_.Fichiers se terminant par _
.js
_ ou fichiers sans extension lorsque le fichier parent le plus proche _package.json
_ contient un champ de niveau supérieur _"type"
_ avec la valeur _"module"
_.Les chaînes transmises en tant qu'argument à _
--eval
_ ou _node
viaSTDIN
, avec l'indicateur _--input-type=module
_.Node.js traitera comme CommonJS toutes les autres formes d'entrée, telles que les fichiers _
.js
_ dans lesquels le fichier parent le plus proche _package.json
_ ne contient pas de champ _"type"
_ de niveau supérieur, ou une chaîne d'entrée sans l'indicateur _--input-type
_. Ce comportement est de préserver la compatibilité ascendante. Cependant, maintenant que Node.js prend en charge les modules CommonJS et ES, il est préférable d’être explicite chaque fois que cela est possible. Node.js considérera les éléments suivants comme CommonJS lorsqu’ils sont passés ànode
comme entrée initiale ou lorsqu’ils sont référencés par les instructionsimport
dans le code du module ES:
Fichiers se terminant par _
.cjs
_.Fichiers se terminant par _
.js
_ ou fichiers sans extension lorsque le fichier parent le plus proche _package.json
_ contient un champ de niveau supérieur _"type"
_ avec la valeur _"commonjs"
_.Les chaînes transmises en tant qu'argument à _
--eval
_ ou _node
viaSTDIN
, avec l'indicateur _--input-type=commonjs
_.
Dans mon cas, il s’occupait du fichier .babelrc
, et il devrait contenir quelque chose comme:
{
"presets": ["es2015-node5", "stage-3"],
"plugins": []
}