Je viens de commencer à travailler sur un petit projet de nœud qui s'interface avec une MongoDB. Cependant, je ne parviens pas à importer correctement les modules de nœud appropriés, même si je les ai installés correctement via npm
.
Par exemple, le code suivant renvoie une erreur et m'indique que "Express n'a aucune exportation par défaut":
import express from "express";
Cependant, ce code fonctionne:
const express = require("express");
Ma question est donc la suivante: quelle est la différence de fonctionnement des méthodes d'importation et de méthode variable/require? Je voudrais réparer ce qui nuit à mes importations dans le projet, car cela risque de poser des problèmes supplémentaires en bas de la route.
La réponse qui m'aide à comprendre la différence entre require
et import
est tiliser Node.js require vs ES6 import/export , qui comprend un diagramme simple:
La principale différence entre require
et import
est que require
analysera automatiquement node_modules
pour trouver des modules, mais import
, qui provient de ES6, ne le fera pas. .
La plupart des gens utilisent babel pour compiler import
et export
, ce qui fait que import
agit de la même manière que require
.
La future version de Node.js pourrait prendre en charge import
elle-même (en fait, la version expérimentale le fait déjà ), et à en juger par les notes de Node.js, import
ne prend pas en charge node_modules
, il repose sur ES6 et doit spécifier le chemin du module.
Je vous suggère donc de ne pas utiliser import
avec Babel, mais cette fonctionnalité n'est pas encore confirmée, elle pourrait prendre en charge node_modules
à l'avenir, qui le saurait?
Pour référence, voici un exemple de la façon dont babel peut convertir la syntaxe import
de ES6 en syntaxe require
de CommonJS.
Dites le fileapp_es6.js
contient cette importation:
import format from 'date-fns/format';
Ceci est une directive pour importer la fonction format à partir du paquet de noeud date-fns .
Le fichier package.json
associé peut contenir quelque chose comme ceci:
"scripts": {
"start": "node app.js",
"build-server-file": "babel app_es6.js --out-file app.js",
"webpack": "webpack"
}
Le fichier .babelrc
associé pourrait ressembler à ceci:
{
"presets": [
[
"env",
{
"targets":
{
"node": "current"
}
}
]
]
}
Ce script build-server-file
défini dans le fichier package.json
est une directive permettant à Babel d’analyser le fichier app_es6.js
et d’en produire le fichier app.js
.
Après avoir exécuté le script build-server-file
, si vous ouvrez app.js
et recherchez l'importation date-fns
, vous verrez qu'il a été converti en ceci:
var _format = require("date-fns/format");
var _format2 = _interopRequireDefault(_format);
La plupart de ce fichier est fastidieux pour la plupart des humains, mais les ordinateurs le comprennent.
Également à titre de référence, à titre d'exemple de création et d'importation d'un module dans votre projet, si vous installez date-fns
puis ouvrez node_modules/date-fns/get_year/index.js
, vous pouvez voir qu'il contient:
var parse = require('../parse/index.js')
function getYear (dirtyDate) {
var date = parse(dirtyDate)
var year = date.getFullYear()
return year
}
module.exports = getYear
En utilisant le processus babel ci-dessus, votre fichier app_es6.js
pourrait alors contenir:
import getYear from 'date-fns/get_year';
// Which year is 2 July 2014?
var result = getYear(new Date(2014, 6, 2))
//=> 2014
Et Babel convertirait les importations en:
var _get_year = require("date-fns/get_year");
var _get_year2 = _interopRequireDefault(_get_year);
Et gérer toutes les références à la fonction en conséquence.
Laissez-moi vous donner un exemple pour inclure un module express avec require & import
-exiger
var express = require('express');
-importation
import * as express from 'express';
Ainsi, après avoir utilisé l’une des déclarations ci-dessus, nous aurons avec nous une variable appelée "express". Maintenant, nous pouvons définir la variable 'app' comme:
var app = express();
Nous utilisons donc 'require' avec 'CommonJS' et 'import' avec 'ES6'.
Pour plus d'informations sur les options "Requiert" et "Importer", lisez les liens ci-dessous.
require - Requiert des modules dans Node.js: tout ce que vous devez savoir
Pas une réponse ici et plus comme un commentaire, désolé mais je ne peux pas commenter.
Dans le nœud V10, vous pouvez utiliser l'indicateur --experimental-modules
pour indiquer à Nodejs que vous souhaitez utiliser import
. Mais votre script d'entrée doit se terminer par .mjs
.
Notez que ceci est encore une chose expérimentale et ne devrait pas être utilisé en production.
// main.mjs
import utils from './utils.js'
utils.print();
// utils.js
module.exports={
print:function(){console.log('print called')}
}