web-dev-qa-db-fra.com

Node.js - SyntaxError: Importation de jeton inattendue

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
357
SofDroid

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 .

393
Scimonster

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.

50
baranskistad

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;

30
supritshah1289

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"
    }
20
Nirali Acharya

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;
12
Alberto

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"
8
ASTOMUSIC

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
6
Jason Ashley

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 instructions import 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 _--print_, ou redirigées vers node via STDIN, 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 instructions import 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 _--print_, ou redirigées vers node via STDIN, avec l'indicateur _--input-type=commonjs_.

2
T.J. Crowder

Dans mon cas, il s’occupait du fichier .babelrc, et il devrait contenir quelque chose comme:

{
  "presets": ["es2015-node5", "stage-3"],
  "plugins": []
}
1
Ghita Tomoiaga