Je viens de commencer à travailler sur un petit projet de nœud qui s'interface avec un MongoDB. Cependant, je n'arrive pas à faire importer correctement les modules de nœuds concernés, même si je les ai installés correctement via npm
.
Par exemple, le code suivant génère une erreur, m'indiquant que "express n'a pas d'export 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 dans le fonctionnement des méthodes d'importation et de variable / require? Je voudrais résoudre ce qui affecte mes importations sur le projet, car cela semble susceptible de causer des problèmes supplémentaires sur la route.
node.js
typescript
import
require
austinthemassif
la source
la source
express
sera de typeany
. Vous pouvez inclure les définitions d'ici npmjs.com/package/@types/expressRéponses:
Ce schéma simple qui m'aide à comprendre la différence entre
require
etimport
.Mis à part cela,
Vous ne pouvez pas charger sélectivement uniquement les pièces dont vous avez besoin,
require
mais avecimports
, vous pouvez charger sélectivement uniquement les pièces dont vous avez besoin. Cela peut économiser de la mémoire.Le chargement est synchrone (étape par étape) car
require
par contreimport
peut être asynchrone (sans attendre l'importation précédente) donc il peut fonctionner un peu mieux querequire
.la source
module.exports
la fin de l'exécution du code d'initialisation du module. Cette seule différence crée des problèmes de compatibilité en essayant de faire fonctionner un seul module pour ESM et CommonJS.La principale différence entre
require
etimport
, est querequire
le scanne automatiquementnode_modules
pour trouver des modules, maisimport
, qui vient d'ES6, ne le fera pas.La plupart des gens utilisent babel pour compiler
import
etexport
, ce qui faitimport
agir de la même manière querequire
.La future version de Node.js pourrait prendre
import
en charge 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 chargenode_modules
, elle est basée sur ES6 et doit spécifier le chemin du module.Je vous suggère donc de ne pas l'utiliser
import
avec babel, mais cette fonctionnalité n'est pas encore confirmée, elle pourrait prendrenode_modules
en charge dans le futur, qui le saurait?Pour référence, vous trouverez ci-dessous un exemple de la façon dont babel peut convertir la
import
syntaxe d' ES6 en syntaxe de CommonJSrequire
.Disons que le fichier
app_es6.js
contient cette importation:Il s'agit d'une directive pour importer la fonction de format à partir du package de nœuds date-fns .
Le
package.json
fichier associé pourrait contenir quelque chose comme ceci:Le
.babelrc
fichier associé pourrait être quelque chose comme ceci:Ce
build-server-file
script défini dans lepackage.json
fichier est une directive permettant à babel d'analyser leapp_es6.js
fichier et de sortir le fichierapp.js
.Après avoir exécuté le
build-server-file
script, si vous ouvrezapp.js
et recherchez l'date-fns
importation, vous verrez qu'elle a été convertie en ceci:La plupart de ce fichier est englouti par la plupart des humains, mais les ordinateurs le comprennent.
Aussi pour référence, comme exemple de la façon dont un module peut être créé et importé dans votre projet, si vous installez
date-fns
puis ouvrez,node_modules/date-fns/get_year/index.js
vous pouvez voir qu'il contient:En utilisant le processus babel ci-dessus, votre
app_es6.js
fichier pourrait alors contenir:Et babel convertirait les importations en:
Et gérez toutes les références à la fonction en conséquence.
la source
require
toute façonimport won't support node_modules
Qu'est-ce que vous entendez par là?Permettez-moi de donner un exemple pour inclure le module express avec require & import
-exiger
-importer
Donc, après avoir utilisé l'une des instructions ci-dessus, nous aurons une variable appelée «express» avec nous. Maintenant, nous pouvons définir la variable 'app' comme suit:
Nous utilisons donc «require» avec «CommonJS» et «import» avec «ES6».
Pour plus d'informations sur «exiger» et «importer», lisez les liens ci-dessous.
require - Modules requis dans Node.js: tout ce que vous devez savoir
import - Une mise à jour sur les modules ES6 dans Node.js
la source
Pas une réponse ici et plutôt 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 utiliserimport
. Mais votre script d'entrée doit se terminer par.mjs
.Notez que ceci est encore une chose expérimentale et ne doit pas être utilisé en production.
Réf 1 - Nodejs Doc
Ref 2 - Problème Github
la source
nouveau ES6:
'import' doit être utilisé avec les mots clés 'export' pour partager des variables / tableaux / objets entre des fichiers js:
vieille école:
'require' doit être utilisé avec 'module.exports'
la source