Skip to main content

Іменований проти дефолтного експорту

1. Що таке "експорт" загалом

Експорт (export) - це механізм, що дозволяє "передати назовні" з модуля функції, змінні, класи тощо, щоб їх можна було імпортувати в інших файлах.

В ES Modules є два типи експорту:

  1. Іменований (named export)
  2. Дефолтний (default export)

2. Іменований експорт (Named Export)

Дозволяє експортувати кілька значень з модуля з їхніми іменами.

math.js

javascript
export const PI = 3.14; export function add(a, b) { return a + b; } export function sub(a, b) { return a - b; }

app.js

javascript
import { PI, add, sub } from './math.js'; console.log(PI); // 3.14 console.log(add(2, 3)); // 5

Можна експортувати кілька елементів з одного файлу. Імпорт має використовувати точно такі самі імена, як і експорт.

Альтернативна форма:

javascript
const PI = 3.14; function add(a, b) { return a + b; } function sub(a, b) { return a - b; } export { PI, add, sub };

Це еквівалентно попередньому прикладу - просто згрупований експорт.

3. Дефолтний експорт (Default Export)

Дозволяє експортувати лише одне значення як "головний вміст" модуля.

logger.js

javascript
export default function log(message) { console.log('LOG:', message); }

app.js

javascript
import log from './logger.js'; // без фігурних дужок! log('Привіт'); // LOG: Привіт

За default export:

  • у модуля може бути лише один експорт за замовчуванням;
  • під час імпорту можна назвати як завгодно.

Інший приклад:

javascript
export default class User { constructor(name) { this.name = name; } }

Імпорт:

javascript
import Person from './User.js'; // можна назвати як завгодно const user = new Person('Tim');

4. Ключові відмінності

КритерійІменований експортДефолтний експорт
КількістьМожна експортувати багато значеньТільки одне значення
ІмпортЧерез фігурні дужки {}Без фігурних дужок
Ім'я під час імпортуМає збігатися з оригіналомМожна будь-яке ім'я
Синтаксисexport const foo = ... / export { foo }export default ...
Імпорт усьогоimport * as lib from './file.js'Незастосовно напряму
СемантикаЕкспортує "багато різних частин" модуляЕкспортує "головну сутність" модуля
ПрикладиУтиліти, константи, функціїОсновний клас, функція, компонент

5. Можна комбінувати

Один модуль може містити й іменований, і дефолтний експорт:

math.js

javascript
export const PI = 3.14; export function add(a, b) { return a + b; } export default function multiply(a, b) { return a * b; }

app.js

javascript
import multiply, { PI, add } from './math.js'; console.log(multiply(2, 3)); // 6 console.log(PI); // 3.14 console.log(add(5, 5)); // 10

6. Імпорт "усього" модуля

Можна імпортувати весь вміст під одним іменем:

javascript
import * as math from './math.js'; console.log(math.PI); // 3.14 console.log(math.add(2, 3)); // 5 console.log(math.default(2, 3)); // 6 - доступ до default через .default

7. Часті помилки

ПомилкаПричинаРішення
SyntaxError: The requested module ... does not provide an export namedНеправильне ім'я під час імпорту іменованого експортуВикористовуй точні імена
default is not exportedНамагаєшся імпортувати default, коли його немаєПеревір, що експортуєш export default
Cannot use import statement outside a moduleФайл не ESMДодай "type": "module" у package.json чи використай .mjs

8. Коли що використовувати

СценарійТип експорту
Модуль з кількома утилітамиІменований
Один основний клас / компонентДефолтний
Бібліотека з APIКомбінований (default + named)

Приклади:

  • Reactexport default React; export { useState, useEffect }
  • Axiosexport default axios; export { AxiosError }

9. Концептуально

  • Іменовані експорти = "багато інструментів з набору" (усе явно, IDE підказує, автодоповнення працює).
  • Дефолтний експорт = "головна сутність модуля" (зручно, коли файл відповідає за один основний об'єкт).

Коротке резюме

ХарактеристикаІменований експортДефолтний експорт
КількістьКількаОдин
Імпортimport { x } fromimport x from
Ім'яОбов'язково збігаєтьсяМожна будь-яке
Підказки IDEПрацює відмінноІноді губляться
ЗастосуванняУтиліти, функції, константиГоловний клас чи компонент
КомбінуванняМожна разомМожна разом

Одним реченням

Іменовані експорти дозволяють експортувати кілька сутностей з їхніми іменами, а дефолтний експорт призначений для однієї "головної" сутності модуля, яку можна імпортувати під будь-яким іменем.

Коротка відповідь

Для співбесіди
Premium

Коротка відповідь допоможе вам впевнено відповідати на цю тему під час співбесіди.