Ich habe gerade angefangen, an einem kleinen Knotenprojekt zu arbeiten, das mit einer MongoDB verbunden wird. Es scheint jedoch nicht möglich zu sein, die relevanten Knotenmodule korrekt zu importieren, obwohl ich sie über korrekt installiert habe npm
.
Der folgende Code gibt beispielsweise einen Fehler aus, der besagt, dass "Express keinen Standardexport hat":
import express from "express";
Dieser Code funktioniert jedoch:
const express = require("express");
Meine Frage ist also, was ist der Unterschied in der Funktionsweise der Methoden import und variable / require? Ich möchte das beheben, was meine Importe im Projekt plagt, da es wahrscheinlich später zusätzliche Probleme verursachen wird.
node.js
typescript
import
require
austinthemassive
quelle
quelle
express
ist jedoch vom Typany
. Sie könnten die Definitionen von hier einfügen npmjs.com/package/@types/expressAntworten:
Dieses einfache Diagramm hilft mir, den Unterschied zwischen
require
und zu verstehenimport
.Abgesehen davon,
Sie können nicht nur die benötigten Teile selektiv laden,
require
aber mitimports
können Sie nur die benötigten Teile selektiv laden. Das kann Speicherplatz sparen.Das Laden ist synchron (Schritt für Schritt), da es
require
andererseitsimport
asynchron sein kann (ohne auf den vorherigen Import zu warten), sodass es etwas besser als funktioniertrequire
.quelle
module.exports
wenn der Modulinitialisierungscode beendet ist. Dieser Unterschied allein verursacht Kompatibilitätsprobleme beim Versuch, ein einzelnes Modul sowohl für ESM als auch für CommonJS zum Laufen zu bringen.Der Hauptunterschied zwischen
require
und besteht darinimport
, dassrequire
automatischnode_modules
nach Modulenimport
gesucht wird, bei ES6 jedoch nicht.Die meisten Leute benutzen babel zum kompilieren
import
undexport
, wasimport
das gleiche macht wierequire
.Die zukünftige Version von Node.js unterstützt
import
sich möglicherweise selbst (tatsächlich tut dies die experimentelle Version bereits ), und nach den Notizen von Node.jsimport
wird dies nicht unterstütztnode_modules
, sie basiert auf ES6 und muss den Pfad des Moduls angeben.Ich würde also vorschlagen, dass Sie nicht
import
mit babel verwenden, aber diese Funktion ist noch nicht bestätigt. Sie wird möglicherweisenode_modules
in Zukunft unterstützt. Wer würde das wissen?Im Folgenden finden Sie ein Beispiel dafür, wie babel die ES6-
import
Syntax in die CommonJS-require
Syntax konvertieren kann .Angenommen, die Datei
app_es6.js
enthält diesen Import:Dies ist eine Anweisung zum Importieren der Formatierungsfunktion aus dem Knotenpaket date-fns .
Die zugehörige
package.json
Datei könnte Folgendes enthalten:Die zugehörige
.babelrc
Datei könnte ungefähr so aussehen:Dieses
build-server-file
in derpackage.json
Datei definierte Skript ist eine Anweisung für babel, dieapp_es6.js
Datei zu analysieren und die Datei auszugebenapp.js
.build-server-file
Wenn Sie nach dem Ausführen des Skriptsapp.js
dendate-fns
Import öffnen und suchen , sehen Sie, dass er in diesen konvertiert wurde:Der größte Teil dieser Datei ist für die meisten Menschen ein Gobbledy-Buch, aber Computer verstehen es.
Als Referenz dafür, wie ein Modul erstellt und in Ihr Projekt importiert werden kann, können Sie beim Installieren
date-fns
und anschließenden Öffnennode_modules/date-fns/get_year/index.js
Folgendes sehen:Mit dem oben beschriebenen Babel-Prozess
app_es6.js
könnte Ihre Datei dann Folgendes enthalten:Und babel würde die Importe umwandeln in:
Und behandeln Sie alle Verweise auf die Funktion entsprechend.
quelle
require
import won't support node_modules
Was wolltest du damit sagen?Lassen Sie mich ein Beispiel für das Einschließen eines Express-Moduls mit require & import geben
-benötigen
-importieren
Nachdem wir eine der obigen Anweisungen verwendet haben, haben wir eine Variable namens 'express' bei uns. Jetzt können wir die 'App'-Variable definieren als:
Also verwenden wir 'require' mit 'CommonJS' und 'import' mit 'ES6'.
Weitere Informationen zu "erfordern" und "importieren" finden Sie unter den folgenden Links.
require - Erforderliche Module in Node.js: Alles, was Sie wissen müssen
import - Ein Update zu ES6-Modulen in Node.js.
quelle
Keine Antwort hier und eher wie ein Kommentar, sorry, aber ich kann nicht kommentieren.
In Knoten V10 können Sie das Flag verwenden
--experimental-modules
, um Nodejs mitzuteilen, die Sie verwenden möchtenimport
. Ihr Eingabeskript sollte jedoch mit enden.mjs
.Beachten Sie, dass dies immer noch eine experimentelle Sache ist und nicht in der Produktion verwendet werden sollte.
Ref 1 - Nodejs Doc
Ref 2 - Github-Ausgabe
quelle
neuer ES6:
'import' sollte mit 'export'-Schlüsselwörtern verwendet werden, um Variablen / Arrays / Objekte zwischen js-Dateien zu teilen:
alte Schule:
'require' sollte mit 'module.exports' verwendet werden.
quelle