У Node.js require
та import
використовуються для підключення модулів у вашому коді, але між ними є важливі відмінності щодо синтаксису, функціональності та використання:
1. Синтаксис
require
: Використовує синтаксис модулів CommonJS.const fs = require('fs');
import
: Використовує синтаксис модулів ECMAScript (ES6).import fs from 'fs';
2. Модульна система
require
:
- Є частиною системи модулів CommonJS.
- Синхронне завантаження модулів.
- Доступно у всіх версіях Node.js за замовчуванням.
- Модулі завантажуються та виконуються вперше, коли їх запитують, і результат кешується для подальших викликів.
import
:
- Є частиною системи модулів ES6.
- Асинхронне завантаження модулів, що дозволяє здійснювати оптимізації, як-от tree-shaking.
- Вимагає використання
type: "module"
у файліpackage.json
або розширення файлів.mjs
. - Більш сучасний і відповідає стандарту JavaScript.
3. Експорти за замовчуванням
require
:
- Імпортує значення з
module.exports
. - Приклад:
// У module.js module.exports = { foo: 'bar' }; // У main.js const myModule = require('./module'); console.log(myModule.foo); // Вивід: bar
import
:
- Імпортує експорт за замовчуванням або іменовані експорти.
- Приклад:
// У module.js export default { foo: 'bar' }; // У main.js import myModule from './module'; console.log(myModule.foo); // Вивід: bar
4. Іменовані експорти
require
:
- Іменовані експорти потрібно деструктурувати з імпортованого об'єкта.
- Приклад:
// У module.js exports.foo = 'bar'; // У main.js const { foo } = require('./module'); console.log(foo); // Вивід: bar
import
:
- Підтримує прямий імпорт іменованих експортів.
- Приклад:
// У module.js export const foo = 'bar'; // У main.js import { foo } from './module'; console.log(foo); // Вивід: bar
5. Взаємодія
require
:
- Може імпортувати як модулі CommonJS, так і ES модулі.
- При імпорті ES модуля може знадобитися доступ до властивості
.default
, щоб отримати експорт за замовчуванням.
import
:
- Може імпортувати тільки ES модулі нативно. Імпорт модулів CommonJS потребує додаткової обробки сумісності.
6. Варіанти використання
require
:
- Підходить для старих проєктів або при роботі з бібліотеками на основі CommonJS.
- Повністю підтримується у всіх середовищах Node.js.
import
:
- Бажано використовувати для сучасних JavaScript проєктів.
- Відповідає стандарту ES6 і є майбутньо-сумісним.
Що слід використовувати?
- Для старих проєктів або бібліотек, які використовують CommonJS, залишайтеся з
require
. - Для сучасних проєктів, особливо тих, що використовують ES6+ або пакувальники на зразок Webpack, надайте перевагу
import
за його чистий синтаксис і сучасні можливості.
Перекладено з: What is the difference between require and import in Node.js?