Właśnie zacząłem pracować nad małym projektem węzła, który będzie współpracował z MongoDB. Jednak wydaje mi się, że nie mogę poprawnie zaimportować odpowiednich modułów węzłów, mimo że zainstalowałem je poprawnie za pośrednictwem npm
.
Na przykład poniższy kod zgłasza błąd informujący mnie, że „ekspres nie ma domyślnego eksportu”:
import express from "express";
Jednak ten kod działa:
const express = require("express");
Moje pytanie brzmi więc, jaka jest różnica w działaniu metod import i zmienna / wymagająca? Chciałbym naprawić wszystko, co nęka mój import w projekcie, ponieważ wydaje się, że może powodować dodatkowe problemy w przyszłości.
node.js
typescript
import
require
austinthemassive
źródło
źródło
express
będzie typuany
. Możesz dołączyć definicje stąd npmjs.com/package/@types/expressOdpowiedzi:
Ten prosty diagram, który pomaga mi zrozumieć różnicę między
require
iimport
.Oprócz tego,
Nie możesz selektywnie ładować tylko tych elementów, których potrzebujesz,
require
aleimports
możesz selektywnie ładować tylko te elementy, których potrzebujesz. To może oszczędzić pamięć.Ładowanie jest synchroniczne (krok po kroku),
require
z drugiej stronyimport
może być asynchroniczne (bez czekania na poprzedni import), więc może działać trochę lepiej niżrequire
.źródło
module.exports
gdy kod inicjujący moduł zakończy działanie. Już sama ta różnica powoduje problemy ze zgodnością, gdy próbuje się sprawić, by pojedynczy moduł działał zarówno dla ESM, jak i CommonJS.Główna różnica między
require
iimport
, polega na tym, żerequire
automatycznie skanuje wnode_modules
celu znalezienia modułów, aleimport
wersja pochodząca z ES6 nie.Większość ludzi używa babel do kompilacji
import
iexport
, co sprawia, żeimport
działa tak samo jakrequire
.Przyszła wersja Node.js może obsługiwać się
import
sama (w rzeczywistości wersja eksperymentalna już to robi ) i sądząc po uwagach Node.js,import
nie będzie obsługiwaćnode_modules
, opiera się na ES6 i musi określać ścieżkę modułu.Więc sugerowałbym nie używać
import
z babel, ale ta funkcja nie jest jeszcze potwierdzona, może obsługiwaćnode_modules
w przyszłości, kto by wiedział?Dla odniesienia, poniżej znajduje się przykład, jak babel może konwertować
import
składnię ES6 na składnię CommonJSrequire
.Powiedzmy, że plik
app_es6.js
zawiera ten import:Jest to dyrektywa służąca do importowania funkcji formatu z pakietu węzła date-fns .
Powiązany
package.json
plik może zawierać coś takiego:Powiązany
.babelrc
plik może wyglądać mniej więcej tak:Ten
build-server-file
skrypt zdefiniowany wpackage.json
pliku jest dyrektywą dla babel do parsowaniaapp_es6.js
pliku i wyprowadzania plikuapp.js
.Po uruchomieniu
build-server-file
skryptu, jeśli otworzyszapp.js
i poszukaszdate-fns
importu, zobaczysz, że został on przekształcony w ten sposób:Większość tego pliku jest gobbledygook dla większości ludzi, jednak komputery to rozumieją.
Również w celach informacyjnych, jako przykład tego, jak moduł można utworzyć i zaimportować do projektu, jeśli zainstalujesz,
date-fns
a następnie otworzysznode_modules/date-fns/get_year/index.js
, możesz zobaczyć, że zawiera:Korzystając z powyższego procesu babel, twój
app_es6.js
plik może zawierać:Babel konwertuje import na:
I odpowiednio obsłuż wszystkie odwołania do funkcji.
źródło
require
tak czy inaczejimport won't support node_modules
Co masz przez to na myśli?Podam przykład dołączenia modułu ekspresowego z wymaganiem i importem
-wymagać
-import
Tak więc po użyciu którejkolwiek z powyższych instrukcji będziemy mieć u nas zmienną o nazwie „express”. Teraz możemy zdefiniować zmienną „app” jako:
Dlatego używamy „require” z „CommonJS” i „import” z „ES6”.
Aby uzyskać więcej informacji o „wymaganiu” i „imporcie”, przeczytaj poniższe linki.
require - Wymaganie modułów w Node.js: wszystko, co musisz wiedzieć
import - aktualizacja modułów ES6 w Node.js.
źródło
Brak odpowiedzi, a raczej komentarz, przepraszam, ale nie mogę komentować.
W węźle V10 możesz użyć flagi,
--experimental-modules
aby powiedzieć Nodejs, którego chcesz użyćimport
. Ale twój skrypt wejściowy powinien kończyć się na.mjs
.Należy pamiętać, że jest to nadal rzecz eksperymentalna i nie należy jej używać w produkcji.
Ref 1 - Nodejs Doc
Ref 2 - problem z githubem
źródło
nowy ES6:
`` import '' należy używać ze słowami kluczowymi `` eksport '', aby udostępniać zmienne / tablice / obiekty między plikami js:
stara szkoła:
„require” powinno być używane z „module.exports”
źródło