Основное различие между 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 в синтаксис require
CommonJS.
Скажем, fileapp_es6.js
содержит этот импорт:
import format from 'date-fns/format';
Это директива для импорта функции 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);
И обработайте все ссылки на функцию соответствующим образом.
person
A-yon Lee
schedule
11.10.2017
express
будет иметь типany
. Вы можете включить определения отсюда npmjs.com/package/@types/express - person fs_   schedule 11.10.2017import x = require('x')
- это не то же самое, чтоvar x = require('x')
. - person Tomasz Gawel   schedule 24.11.2020