Основное различие между require
и import
заключается в том, что он require
будет автоматически сканировать node_modules
для поиска модулей, но import
, исходя из ES6, не будет.
Большинство людей используют Babel для компиляции import
и export
, что делает так import
же, как require
.
Будущая версия Node.js может поддерживать import
себя (фактически, экспериментальная версия уже поддерживает ) и, судя по примечаниям Node.js, import
не будет поддерживать node_modules
, она основана на ES6 и должна указывать путь модуля.
Поэтому я бы посоветовал вам не использовать import
с babel, но эта функция еще не подтверждена, она может поддержать node_modules
в будущем, кто бы знал?
Для справки ниже приведен пример того, как babel может преобразовать import
синтаксис ES6 в синтаксис CommonJS require
.
Скажем, файл app_es6.js
содержит этот импорт:
import format from 'date-fns/format';
Это директива для импорта функции форматирования из пакета узла date-fns .
Связанный package.json
файл может содержать что-то вроде этого:
"scripts": {
"start": "node app.js",
"build-server-file": "babel app_es6.js --out-file app.js",
"webpack": "webpack"
}
Связанный .babelrc
файл может быть примерно таким:
{
"presets": [
[
"env",
{
"targets":
{
"node": "current"
}
}
]
]
}
Этот build-server-file
скрипт, определенный в package.json
файле, является для babel директивой для анализа app_es6.js
файла и вывода файла app.js
.
После запуска build-server-file
скрипта, если вы откроете app.js
и посмотрите на date-fns
импорт, вы увидите, что он был преобразован в это:
var _format = require("date-fns/format");
var _format2 = _interopRequireDefault(_format);
Большая часть этого файла запутана для большинства людей, однако компьютеры это понимают.
Также для справки, в качестве примера того, как модуль может быть создан и импортирован в ваш проект, если вы установите date-fns
и откроете его, node_modules/date-fns/get_year/index.js
вы увидите, что он содержит:
var parse = require('../parse/index.js')
function getYear (dirtyDate) {
var date = parse(dirtyDate)
var year = date.getFullYear()
return year
}
module.exports = getYear
Используя описанный выше процесс babel, ваш app_es6.js
файл может содержать:
import getYear from 'date-fns/get_year';
// Which year is 2 July 2014?
var result = getYear(new Date(2014, 6, 2))
//=> 2014
И Babel будет конвертировать импорт в:
var _get_year = require("date-fns/get_year");
var _get_year2 = _interopRequireDefault(_get_year);
И обрабатывать все ссылки на функцию соответственно.
express
будет иметь типany
. Вы можете включить определения отсюда npmjs.com/package/@types/express