Der Unterschied zwischen "require(x)" und importieren x
Ich habe gerade angefangen, einen kleinen Knoten Projekt aus, das interface mit einer MongoDB. Aber ich kann nicht scheinen, um die entsprechenden Knoten-Module korrekt importiert werden, obwohl ich Sie installiert richtig über npm
.
Beispielsweise der folgende code löst und Fehler, mir zu sagen, dass die "express-hat keine Standard-export":
import express from "express";
Jedoch, dieser code funktioniert:
const express = require("express");
Meine Frage ist also, was ist der Unterschied, wie der import und Variablen/Methoden erfordern-Funktion? Ich möchte, um zu beheben, was ist plagt mein Einfuhren auf das Projekt, wie es scheint verursachen zusätzliche Probleme die Straße hinunter.
- Es sei denn, Sie zählen die Eingabe von Definitionen für express, die erste form nicht sinnvoll - in dem Fall können Sie das zweite Formular, aber die variable
express
Typany
. Sie könnten auch die Definitionen von hier aus npmjs.com/package/@types/express - Mögliche Duplikate von Mit Node.js erfordern vs. ES6-import/ - export
Du musst angemeldet sein, um einen Kommentar abzugeben.
Die Antwort, die mir hilft, zu verstehen, den Unterschied zwischen
require
undimport
ist Mit Node.js erfordern vs. ES6-import/export, die enthält ein einfaches Diagramm:Den großen Unterschied zwischen
require
undimport
ist, dassrequire
wird automatisch Scannennode_modules
zu finden-Module, aberimport
stammt von ES6, nicht.Meisten Menschen verwenden babel zu kompilieren
import
undexport
, die machtimport
handeln die gleiche wierequire
.Der zukünftigen version von Node.js vielleicht unterstützen
import
selbst (eigentlich die experimentelle version schon funktioniert), und die Beurteilung durch Node.js' Notizenimport
nicht unterstützennode_modules
es Basis auf ES6, und müssen den Pfad angeben, von dem Modul.Also ich würde dir empfehlen nicht die Verwendung
import
mit babel, aber diese Funktion ist noch nicht bestätigt, es könnte zu unterstützennode_modules
in der Zukunft, wer würde es wissen?Referenz, unten ist ein Beispiel dafür, wie babel umwandeln kann ES6 ist
import
syntax, um CommonJS istrequire
syntax.Sagen, dass die Datei
app_es6.js
enthält diese importieren:Dies ist eine Richtlinie zu importieren, die format Funktion von den Knoten Paket Datum-fns.
Den zugehörigen
package.json
Datei enthalten könnte so etwas wie dieses:Den zugehörigen
.babelrc
- Datei könnte so etwas wie dieses:Diese
build-server-file
Skript definiert in derpackage.json
- Datei ist eine Richtlinie für babel, um eine Analyse derapp_es6.js
- Datei und Ausgabe-Dateiapp.js
.Nach dem ausführen des
build-server-file
Skript, wenn Sie öffnenapp.js
und suchen für diedate-fns
importieren, Sie werden sehen, es hat gewesen umgewandelt in diese:Meisten, dass die Datei ist ein Kauderwelsch zu den meisten Menschen, aber von Computern verstehen.
Auch als Referenz, als ein Beispiel, wie ein Modul erstellt und in das Projekt importiert, wenn Sie installieren
date-fns
und öffnen Sie dannnode_modules/date-fns/get_year/index.js
können Sie sehen, es enthält:Verwendung des babel-Prozess vor, Ihr
app_es6.js
Datei kann dann enthalten:Und babel umwandeln würden die Importe zu:
Und behandeln alle Hinweise auf die Funktion entsprechend.
require
sowiesoimport won't support node_modules
Was haben Sie damit gemeint?Lassen Sie mich ein Beispiel geben, Einschließlich express-Modul mit require & import
erfordern
-import
So, die nach der Verwendung der oben genannten Aussage, wir haben eine variable genannt 'express' mit uns. Nun können wir definieren, app ' variable als,
So verwenden wir 'verlangen' mit 'CommonJS' und 'import' mit 'ES6'.
Weitere Infos auf 'verlangen' & 'import', Lesen Sie sich durch die untenstehenden links.
erfordern - Erfordert die Module in Node.js: Alles, was Sie wissen müssen
import - Ein Update auf ES6-Modulen im Node.js
Nicht hier eine Antwort, und mehr wie einen Kommentar, sorry, aber ich kann nicht kommentieren.
In Knoten V10, können Sie die Flagge
--experimental-modules
zu sagen, Nodejs, die Sie verwenden möchtenimport
. Aber dein Eintrag script sollte am Ende mit.mjs
.Hinweis: dies ist immer noch eine experimentelle Sache und sollte nicht in der Produktion eingesetzt werden.
Ref 1 - Nodejs-Doc
Ref 2 - github issue
import verwendet wird in Typoskript(eckig).
erforderlich ist verwendet in ES6 (ExpressJs)