J'écris une application en utilisant Node.js. Plus précisément, j'utilise Node v10.3.0. Cette application est située dans un répertoire situé à ./my-module-console/index.js
. Cette application possède un fichier package.json situé à ./my-module-console/package.json
. Cette application fait référence à une classe définie dans ./my-module/items/
. Il est à noter que my-module
représente son propre package. Ce paquet est défini dans ./my-module/package.json
. Le code dans index.js ressemble à ceci:
'use strict';
import { Item } from '../my-module/items/item.js';
async function entry() {
let item = await Item.FindById(1);
console.log(item);
}
entry();
Lorsque j'essaie de l'exécuter, j'obtiens le message d'erreur suivant:
import { Item } from '../my-module/items/item.js';
^
SyntaxError: Unexpected token {
Quel est le problème avec ma déclaration d'importation? Cela me semble correct. Est-ce que je comprends mal quelque chose?
item.js
class Item {
constructor() {}
async static FindById(id) {
console.log('finding item by id: ' + id);
}
};
module.exports = Item;
Merci!
Comme mentionné par @sur, les modules ES sont encore expérimentaux. Mais si vous voulez les utiliser, vous devez ajouter --experimental-modules
. Si vous voulez toujours utiliser ES Modules, vous devez renommer .js en .mjs et aussi item.js, son style courantJS doit maintenant être remplacé par ES Modules + petit autre correctif. De plus, vous n'avez pas vraiment besoin d'utiliser 'use strict', c'est strict par défaut. Donc finalement ça devrait ressembler à ça:
index.mjs
import { Item } from '../my-module/items/item';
async function entry() {
let item = await Item.FindById(1);
console.log(item);
}
entry();
item.mjs
export class Item {
constructor() {}
static async FindById(id) {
console.log('finding item by id: ' + id);
}
}
Alors maintenant, il suffit de node --experimental-modules index.mjs
et vous êtes prêt à partir.
import { Item } from '../my-module/items/item.js';
est la syntaxe ES6 pour importer des exportations à partir de modules Javascript. Le noeud ne supporte pas cela actuellement sans les drapeaux supplémentaires, vous devrez donc utiliser require
à la place:
const item = require('../my-module/items/item');
De cette façon, vous allez avoir besoin d'exporter la classe Item
dans item.js
.
Notez également que vous devez créer une instance de la classe que vous exportez pour utiliser ses fonctions dans index.js
.
l'importation est expérimentale actuellement. Selon la documentation
Le drapeau --experimental-modules peut être utilisé pour activer des fonctionnalités permettant de charger Des modules ESM.
Une fois que cela est défini, les fichiers se terminant par .mjs pourront être Chargés en tant que modules ES.
noeud --experimental-modules my-app.mjs
Import
n'est pas encore pris en charge, sauf si vous utilisez babel compiler pour compiler votre code ES6, puis l'exécutez.
Utiliser experimental-modules est utilisé pour les expériences dans l’environnement de développement. Et renommer en .mjs n’est pas une bonne idée car cela changera finalement.
Si vous souhaitez utiliser babel js: Écrivez du code dans ES6, compilez-le et exécutez-le.
En option,
Voici comment vous pouvez résoudre rapidement le problème et aller de l'avant:
const item = require('../my-module/items/item');
Premier:
class Item {
constructor() {}
async static FindById(id) {
console.log('finding item by id: ' + id);
}
};
module.exports.Item = Item; // change this line
Seccond:
'use strict';
// import { Item } from '../my-module/items/item.js'; // not sure if it work, it work in react, but in regular node.js can be wrong (look doc ES6)
const Item = require('../my-module/items/item.js');
var someitem = new Item();
async function entry() {
let item = await someitem.FindById(1);
console.log(item);
}
entry();