web-dev-qa-db-fra.com

SyntaxError: impossible d'utiliser l'instruction d'importation en dehors d'un module

J'ai un projet ApolloServer qui me pose problème, alors j'ai pensé que je pourrais le mettre à jour et j'ai rencontré des problèmes lors de l'utilisation du dernier Babel. Mon "index.js" est:

require('dotenv').config()
import {startServer} from './server'
startServer()

Et lorsque je l'exécute, j'obtiens l'erreur "SyntaxError: Impossible d'utiliser l'instruction d'importation en dehors d'un module". J'ai d'abord essayé de faire des choses pour convaincre TPTB * qu'il s'agissait d'un module (sans succès). J'ai donc changé le "import" en "require" et cela a fonctionné.

Mais maintenant, j'ai environ deux douzaines d '"importations" dans d'autres fichiers, ce qui me donne la même erreur.

* Je suis sûr que la racine de mon problème est que je ne suis même pas sûr de ce qui se plaint du problème. J'ai en quelque sorte supposé que c'était Babel 7 (puisque je viens de Babel 6 et j'ai dû changer les préréglages) mais je ne suis pas sûr à 100%.

La plupart de ce que j'ai trouvé pour les solutions ne semble pas s'appliquer au nœud droit. Comme celui-ci ici:

Importation du module ES6 donnant "SyntaxError non capturée: identifiant inattendu"

Dit qu'il a été résolu en ajoutant "type = module" mais cela irait généralement dans le HTML, dont je n'ai aucun. J'ai également essayé d'utiliser les anciens préréglages de mon projet:

"presets": ["es2015", "stage-2"],
"plugins": []

Mais cela m'obtient une autre erreur: "Erreur: les fichiers Plugin/Preset ne sont pas autorisés à exporter des objets, seulement des fonctions."

MISE À JOUR: Voici les dépendances avec lesquelles j'ai commencé:

"dependencies": {
"@babel/polyfill": "^7.6.0",
"apollo-link-error": "^1.1.12",
"apollo-link-http": "^1.5.16",
"apollo-server": "^2.9.6",
"babel-preset-es2015": "^6.24.1",
44
user3810626

Mise à jour 2020 (noeud 13.2.0+)

Vérifiez que vous disposez de la dernière version de Node installé. L'indicateur --experimental-modules N'est plus nécessaire. Faites simplement l'une des opérations suivantes:

  • Ajoutez "type": "module" Au parent le plus proche package.json. Avec cela, tous les fichiers .js Et .mjs Sont interprétés comme des modules ES. Vous pouvez interpréter des fichiers individuels comme CommonJS en utilisant l'extension .cjs.

OU

  • Nommez explicitement les fichiers avec l'extension .mjs. Tous les autres fichiers, tels que .js Seront interprétés comme CommonJS, qui est la valeur par défaut si type n'est pas défini dans package.json.
27
jabacchetta

Selon le document officiel ( https://nodejs.org/api/esm.html#esm_code_import_code_statements ):

les instructions d'importation ne sont autorisées que dans les modules ES. Pour des fonctionnalités similaires dans CommonJS, voir import ().

Pour que Node traite votre fichier comme un module ES, vous devez ( https://nodejs.org/api/esm.html#esm_enabling ):

  • ajouter "type": "module" à package.json
  • ajouter l'indicateur "--experimental-modules" à l'appel du nœud
17
shmekor

J'ai eu le même problème et ce qui suit l'a corrigé (en utilisant le noeud 12.13.1):

  • Changer l'extension des fichiers .js en .mjs
  • Ajoutez l'indicateur --experimental-modules lors de l'exécution de votre application.
  • Facultatif: ajoutez "type": "module" dans votre package.json

plus d'informations: https://nodejs.org/api/esm.html

4
iseenoob