web-dev-qa-db-fra.com

Node - Importer la classe du module dans un autre paquet

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!

4
Zach Templeton

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.

4
evgeny.myasishchev

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.

0
jsur

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

https://nodejs.org/api/esm.html

0
Waqas Noor

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.

Démarrer avec Babel

En option,

Voici comment vous pouvez résoudre rapidement le problème et aller de l'avant:

const item = require('../my-module/items/item');
  • En savoir plus sur Babel ici .
  • À propos de l'importation ici .
0
Jack

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();
0
Denis Rohlinsky