Główna różnica między require
i import
, polega na tym, że require
automatycznie skanuje w node_modules
celu znalezienia modułów, ale import
wersja pochodząca z ES6 nie.
Większość ludzi używa babel do kompilacji import
i export
, co sprawia, że import
działa tak samo jak require
.
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ę CommonJS require
.
Powiedzmy, że plik app_es6.js
zawiera ten import:
import format from 'date-fns/format';
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:
"scripts": {
"start": "node app.js",
"build-server-file": "babel app_es6.js --out-file app.js",
"webpack": "webpack"
}
Powiązany .babelrc
plik może wyglądać mniej więcej tak:
{
"presets": [
[
"env",
{
"targets":
{
"node": "current"
}
}
]
]
}
Ten build-server-file
skrypt zdefiniowany w package.json
pliku jest dyrektywą dla babel do parsowania app_es6.js
pliku i wyprowadzania pliku app.js
.
Po uruchomieniu build-server-file
skryptu, jeśli otworzysz app.js
i poszukasz date-fns
importu, zobaczysz, że został on przekształcony w ten sposób:
var _format = require("date-fns/format");
var _format2 = _interopRequireDefault(_format);
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 otworzysz node_modules/date-fns/get_year/index.js
, możesz zobaczyć, że zawiera:
var parse = require('../parse/index.js')
function getYear (dirtyDate) {
var date = parse(dirtyDate)
var year = date.getFullYear()
return year
}
module.exports = getYear
Korzystając z powyższego procesu babel, twój app_es6.js
plik może zawierać:
import getYear from 'date-fns/get_year';
// Which year is 2 July 2014?
var result = getYear(new Date(2014, 6, 2))
//=> 2014
Babel konwertuje import na:
var _get_year = require("date-fns/get_year");
var _get_year2 = _interopRequireDefault(_get_year);
I odpowiednio obsłuż wszystkie odwołania do funkcji.
express
będzie typuany
. Możesz dołączyć definicje stąd npmjs.com/package/@types/express