Основна відмінність між require
і import
, полягає в тому require
, що автоматично сканується, node_modules
щоб знайти модулі, але import
, що надходить від ES6, не буде.
Більшість людей використовують дівочих підборців для компіляції import
та export
, що змушує import
діяти так само, як require
.
Майбутня версія Node.js може підтримувати import
себе (насправді експериментальна версія вже є ), і, судячи з приміток Node.js, import
не підтримуватиме node_modules
, вона базується на ES6, і повинна вказати шлях модуля.
Тож я б запропонував вам не користуватися import
бабером, але ця функція ще не підтверджена, вона може підтримувати 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
І вавило перетворить імпорт на:
var _get_year = require("date-fns/get_year");
var _get_year2 = _interopRequireDefault(_get_year);
І відповідно обробляти всі посилання на функцію.
express
буде мати типany
. Ви можете включити визначення звідси npmjs.com/package/@types/express