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
javascript
node.js
npm
ecmascript-6
SofDroid
la source
la source
Réponses:
Mise à jour 3: depuis le nœud 13 , vous pouvez utiliser l'extension .mjs ou définir "type": "module" dans votre package.json. Vous n'avez pas besoin d'utiliser le
--experimental-modules
drapeau.Mise à jour 2: depuis le nœud 12 , vous pouvez utiliser l'
.mjs
extension ou la définir"type": "module"
dans votre package.json. Et vous devez exécuter le nœud avec le--experimental-modules
drapeau.Mise à jour: dans le nœud 9 , il est activé derrière un indicateur et utilise l'
.mjs
extension.Bien qu'il
import
fasse en effet partie d'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 les navigateurs.Voir le tableau de compatibilité du navigateur sur MDN et ce problème de nœud .
Extrait de la mise à jour de James M Snell sur les modules ES6 dans Node.js (février 2017):
Jusqu'à ce que le support apparaisse nativement, vous devrez continuer à utiliser des
require
instructions classiques :Si vous voulez vraiment utiliser les nouvelles fonctionnalités ES6 / 7 dans NodeJS, vous pouvez le compiler en utilisant Babel. Voici un exemple de serveur .
la source
Malheureusement, Node.js ne prend pas encore en charge ES6
import
.Pour accomplir ce que vous essayez de faire (importer le module Express), ce code devrait suffire
Assurez-vous également que Express est installé en exécutant
Consultez la documentation Node.js pour plus d'informations sur l'apprentissage de Node.js.
source
import
n'est pas nécessairement une fonctionnalité de TypeScript. TypeScript est ES6 avec des typages. Donc, des choses comme l'importation sont natives ES6.node index.js
travaille pour moi, mais quand je cours,node dist/main.js
je reçois aussiUnexpected token import
.index.js
n'est pas parce que vousdist/main.js
passez que votre volonté passera aussi.Comme mentionné dans d'autres réponses, le nœud JS ne prend actuellement pas en charge les importations ES6.
(À partir de maintenant, lisez EDIT 2)
Activer les importations ES6 dans le nœud js fournit une solution à ce problème. J'ai essayé cela et cela a fonctionné pour moi.
Exécutez la commande:
Vous devez maintenant créer un nouveau fichier (config.js) et y ajouter le code suivant.
Vous pouvez maintenant écrire des instructions d'importation sans obtenir d'erreurs.
J'espère que cela t'aides.
ÉDITER:
Vous devez exécuter le nouveau fichier que vous avez créé avec le code ci-dessus. Dans mon cas, ça l'était
config.js
. Je dois donc courir:EDIT 2:
En expérimentant, j'ai trouvé une solution simple à ce problème.
Créez un
.babelrc
fichier à la racine de votre projet.Ajoutez les éléments suivants (et tous les autres préréglages babel dont vous avez besoin, peuvent être ajoutés dans ce fichier):
Installer à l'
babel-preset-env
aide de la commandenpm install babel-preset-env --save
, puis installer à l'babel-cli
aide de la commandenpm install babel-cli -g --save
Maintenant, allez dans le dossier où existe votre serveur ou fichier d'index et exécutez en utilisant: babel-node fileName.js
Ou vous pouvez exécuter en utilisant
npm start
en ajoutant le code suivant à votrepackage.json
fichier:la source
"start": "babel-node electron .",
mais pas de chanceErreur: SyntaxError: importation de jeton inattendue ou SyntaxError: exportation de jeton inattendue
Solution: changez toutes vos importations comme exemple
Et aussi changer votre
export default = foo;
àmodule.exports = foo;
la source
Je suis choqué
esm
n'a pas été mentionné. Ce petit mais puissant package vous permet d'utiliser soitimport
ourequire
.Installez esm dans votre projet
$ npm install --save esm
Mettez à jour votre script de démarrage de noeud pour utiliser esm
node -r esm app.js
esm
fonctionne juste. J'ai perdu une tonne de temps avec.mjs
et--experimental-modules
seulement pour découvrir qu'un.mjs
fichier ne peut pas importer un fichier qui utiliserequire
oumodule.exports
. C'était un énorme problème, alors qu'ilesm
vous permet de mélanger et assortir et il suffit de le comprendre ... çaesm
fonctionne.la source
Dans le cas où vous ne pouvez toujours pas utiliser "importer", voici comment je l'ai géré: il suffit de le traduire en un besoin convivial pour les nœuds. Exemple:
Est le même que:
la source
export
motexport
mot - clé, merci de toute façon pour votre note utile!babel 7 proposition pouvez-vous ajouter des dépendances dev
et ajoutez un .babelrc à la racine
et ajouter au fichier .js
ou si vous l'exécutez dans le cli, vous pouvez utiliser le hook requis comme -r @ babel / register, ex.
la source
si vous pouvez utiliser 'babel', essayez d'ajouter des scripts de construction dans package.json (- presets = es2015) comme ci-dessous. il permet de précompiler le code d'importation vers es2015
la source
npm start
abord faire la "build", ou d'abord faire le "start"? (Le départ est actuellement défini:"nodemon src/app.js --exec \"npm run lint && node\"",
À partir de Node.js v12 (et c'est probablement assez stable maintenant, mais toujours marqué "expérimental"), vous avez quelques options pour utiliser ESM ( E CMA S cript M odules) dans Node.js (pour les fichiers, il y a un troisième méthode pour évaluer les chaînes), voici ce que dit la documentation :
la source
Quand j'ai commencé avec express, j'ai toujours voulu une solution pour utiliser l'importation à la place
Beaucoup de temps passent par cette ligne: -
Unfortunately, Node.js doesn't support ES6's import yet.
Maintenant, pour aider les autres, je crée de nouvelles solutions ici
1) esm : -
Le chargeur de module ECMAScript brillamment simple, sans babel, sans bundle. faisons en sorte que ça marche
créez start.js ou utilisez votre espace de noms
Changement de votre
package.josn
chemin d'accèsstart.js
2) Babel js : -
Cela peut être divisé en 2 parties
a) Solution 1 grâce à timonweb.com
b) Solution 2
utiliser Babel 6 (ancienne version de babel-preset-stage-3 ^ 6.0 ) créer un
.babelrc
fichier dans votre dossier racineInstaller babel-preset-stage-3
Changement dans package.json
Démarrez votre serveur
Oooh non nous créons un nouveau problème
Cette erreur ne survient que lorsque vous utilisez async / wait dans votre code. Utilisez ensuite polyfill qui inclut un runtime de régénérateur personnalisé et core-js. ajouter par-dessus
index.js
Cela vous permet d'utiliser async / wait
utiliser Babel 7
Besoin de mettre à jour chaque élément de votre projet, commençons par babel 7 .babelrc
Quelques changements dans package.json
et utiliser
import "@babel/polyfill"
sur le point de départPensez-vous pourquoi
start:dev
Sérieusement. C'est une bonne question si vous êtes nouveau. Chaque changement que vous êtes sanglier avec le serveur de démarrage à chaque fois, puis utilisez
yarn start:dev
comme serveur de développement chaque changement de serveur de redémarrage automatiquement pour plus d'informations sur nodemonla source
Dans mon cas, il s'occupait du
.babelrc
fichier et il devrait contenir quelque chose comme ceci:la source