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


53

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 "besoin" 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'en ai pas. 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",

1
Salut, ayant le même problème en ce moment. Pourriez-vous également partager vos dépendances? Peut-être même un diff avant et après votre mise à jour. Je pourrais vérifier contre le mien pour voir si nous pouvons trouver des paquets similaires qui pourraient causer des problèmes.
lynx

Je viens de remplacer toutes les "importations" par "nécessite" et tout va bien maintenant. Bête mais ça ne valait pas la peine de le comprendre maintenant. Je mettrai cependant à jour l'original avec les dépendances. Si vous obtenez des pistes, je les vérifierai par rapport à mon code d'origine.
user3810626

1
La syntaxe CommonJS (require et module.exports) était le format d'origine pour le noeud et le webpack le prend également en charge, mais la syntaxe du module ES6 (exportation, importation) est la manière la plus récente et maintenant le noeud et le webpack le prennent en charge. J'ai lu que le nœud prend en charge l'importation maintenant, mais tant de didacticiels montrent qu'il faut des éléments de nœud purs qu'il est probablement préférable d'utiliser cette syntaxe pour le nœud.
Ted Fitzpatrick

1
Enfin, pour moi, la voie à suivre semblait être la suivante: github.com/vuejs/vue-jest/issues/134#issuecomment-461755061 Définir le préréglage jest.config.jssur 'ts-jest/presets/js-with-ts'- a encore d'autres problèmes, mais cela a résolu le gros problème. ..... euh oui, mon problème était lié aux tests ... les versions normales étaient
lynx

Lynx, intéressant. Je n'utilise pas Jest, moi-même. Ted, intéressant. OK, je ne vais pas transpirer.
user3810626

Réponses:


52

Mise à jour 2020 (noeud 13.2.0+)

Vérifiez que la dernière version de Node est installée. Le --experimental-modulesdrapeau n'est plus nécessaire. Effectuez simplement l' une des opérations suivantes :

  • Ajouter "type": "module"au parent le plus proche package.json. Avec cela, tous les fichiers .jset .mjssont interprétés comme des modules ES. Vous pouvez interpréter des fichiers individuels comme CommonJS en utilisant l' .cjsextension.

OU

  • Nommez explicitement les fichiers avec l' .mjsextension. Tous les autres fichiers, tels que .jsseront interprétés comme CommonJS, qui est la valeur par défaut si typen'est pas défini dans package.json.

Si j'utilise ceci, puis changez le chemin pour inclure le "js" pour le fichier requis, puis changez le format des instructions d'exportation dans le fichier requis, puis prenez toutes les instructions "require" que j'ai changé de "import" —parce que maintenant "exiger" est inconnu - cela fonctionnera, donc j'accepterai cette réponse.
user3810626

2
Ce n'est pas vraiment une option si le problème est sous node_modules / right? Des idées sur la façon de résoudre ce problème?
Trent Bing


6

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


-1

J'ai eu ce problème dans un nouveau projet d'API Express.

Le code du serveur incriminé dans src/server/server.js:

import express from 'express';
import {initialDonationItems, initialExpenditureItems} from "./DemoData";

const server = express();

server.get('/api/expenditures', (req, res) => {
  res.type('json');
  res.send(initialExpenditureItems);
});

server.get('/api/donations', (req, res) => {
  res.type('json');
  res.send(initialDonationItems);
});

server.listen(4242, () => console.log('Server is running...'));

Voici mes dépendances:

{
  "name": "contributor-api",
  "version": "0.0.1",
  "description": "A Node backend to provide storage services",
  "scripts": {
    "dev-server": "nodemon --exec babel-node src/server/server.js --ignore dist/",
    "test": "jest tests"
  },
  "license": "ISC",
  "dependencies": {
    "@babel/core": "^7.9.6",
    "@babel/node": "^7.8.7",
    "babel-loader": "^8.1.0",
    "express": "^4.17.1",
    "mysql2": "^2.1.0",
    "sequelize": "^5.21.7",
    "sequelize-cli": "^5.5.1"
  },
  "devDependencies": {
    "jest": "^25.5.4",
    "nodemon": "^2.0.3"
  }
}

Et voici le coureur qui a jeté l'erreur:

nodemon --exec babel-node src/server/server.js --ignore dist

C'était frustrant, car j'avais un projet Express similaire qui fonctionnait bien.

La solution était tout d'abord d'ajouter cette dépendance:

npm install @babel/preset-env

Et puis pour le câbler en utilisant un babel.config.jsdans la racine du projet:

module.exports = {
  presets: ['@babel/preset-env'],
};

Je ne comprends pas vraiment pourquoi cela fonctionne, mais je l'ai copié à partir d' une source faisant autorité , donc je suis heureux de m'en tenir à cela.


Oui, mon problème était que le code avait un tas de préréglages et je ne pourrais jamais vraiment trouver le juste équilibre entre les choses que je voulais par rapport aux choses que je ne voulais pas / qui ont cassé des trucs.
user3810626

J'ai poussé à travers des plantages JS déroutants toute la journée @ user3810626 - Je soupçonne que mon problème est que je suis assez nouveau dans la langue et l'écosystème, et je dois mettre de côté l'apprentissage pour le moment pour que les choses fonctionnent. :-)
S'y rendre

1
Bonne chance! C'est une jungle là-bas! (Je veux dire, littéralement, l'écosystème JS est une jungle ...)
user3810626 Il y a

-2
  1. J'ai eu le même problème quand j'ai commencé à utiliser babel ... Mais plus tard, j'ai eu une solution ... Je n'ai plus eu le problème jusqu'à présent ... Actuellement, Node v12.14.1, "@ babel / node" : "^ 7.8.4", j'utilise babel-node et nodemon pour exécuter (node ​​est bien aussi ..)
  2. package.json: "start": "nodemon --exec babel-node server.js" debug ":" babel-node debug server.js "!! note: server.js est mon fichier d'entrée, vous pouvez utiliser le vôtre.
  3. launch.json Lorsque vous déboguez, vous devez également configurer votre fichier launch.json "runtimeExecutable": "$ {workspaceRoot} /node_modules/.bin/babel-node" !! note: plus runtimeExecutable dans la configuration.
  4. Bien sûr, avec babel-node, vous devez également normalement modifier et modifier un autre fichier, tel que le fichier babel.config.js / .babelrc

-2

Ma solution était d'inclure le chemin babel-node lors de l'exécution de nodemon comme suit:

nodemon node_modules/.bin/babel-node index.js

vous pouvez ajouter dans votre script package.json comme:

debug: nodemon node_modules/.bin/babel-node index.js

REMARQUE: mon fichier d'entrée est index.js, remplacez-le par votre fichier d'entrée (beaucoup ont app.js / server.js).

En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.