Основное различие между 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