Структура проєкту, експорт-імпорт, index.js як хаб

Створимо проєкт modules з такою структурою

modules
      ├── index.js
      └── greetings
                  ├── english.js
                  ├── japanese.js
                  ├── multilang.js
                  └── index.js

Cинтаксис написання функцій в Node.js такий само як і в JS.

function funcName() { };
const funcName = function () { };
const funcName = () => { };
const funcName = () => console.log("Hello world!");

Експорт-імпорт модулів

Дефолтний експорт

Створений модуль можемо експортувати за дефолтом використовуючи конструкцію module.exports.

modules/greetings/english.js
const eng = () => console.log("Hi, there!");
module.exports = eng;

Після цього можемо заімпортувати наш модуль в головному файлі index.js. При імпорті можна змінити назву модуля і дати нову. використовуємо функцію require.

modules/index.js
const english = require("./greetings/english");
english();

При цьому при імпорті розширення js вказувати не обов'язково. Після цього можна і викликати до виконання наш заімпортований модуль english().

Трохи більше про запуск модуля. А щоб виконати код в терміналі (якщо перебуваємо в кореневому каталозі проєкту modules) запускаємо його.

terminal
node index.js

Відповідно, якщо вкладеність скрипта більша, наприклад ми перебуваємо у дереві файлів на порядок вище, то звертаємось до файлу через слеш.

terminal
node modules/index.js

У цьому випадку файл index.js сприймається, як такий що має виконатися першим за замовчанням, якщо ми не вкажемо конкретне імʼя скрипта. Тобто достатньо вказати шлях до папки, а Node.js, якщо знайде в папці файл index.js, то виконає саме його.

terminal
node modules

Якщо Node.js не знайде файл index.js, то повернеться помилка.

Дефолтний експорт у програмуванні на Node.js ймовірніше виняток, ніж правило, тому розглянемо стандартний іменний експорт далі.

Експорт v2 (іменний експорт-імпорт)

Плюс такого підходу, що з одного файлу ми можемо експортувати одразу кілька функцій. Використовуємо синтаксис exports.НАЗВА_ФУНКЦІЇ

modules/greetings/multilang.js
exports.french = () => console.log("Bonjour");
exports.spanish = () => console.log("Buenos Días");

І одним рядком можемо заімпортувати наші функції в файл скрипта. Присвоївши їм якусь назву.

modules/index.js
const multi = require("./languages/multilang");
multi.french();
multi.spanish();

Можна при імпорті одразу провести деструктуризацію.

modules/index.js
const { french, spanish } = require("./languages/multilang");
french();
spanish();

Можна під час імпорту і деструктуризації навіть присвоїти нові імена функціям.

modules/index.js
const { french: fr, spanish: sp } = require("./languages/multilang");
fr();
sp();

index.js як хаб для експорту модулів

Щоб трохи більше прикладів було так само створимо й експортуємо ще оду функцію (модуль).

modules/greetings/japanese.js
exports.japanese = () => console.log("Kon'nichiwa");

А тепер у каталозі modules/greetings створимо свій внутрішній index.js. Його і будемо використовувати як своєрідний хаб для експорту.

Логіка така: Оскільки за замовчанням, якщо не вказувати імʼя файла, то Node.js обирає index.js. Тому логічно у ньому зібрати всі експортовані функції і експортувати як обʼєкт. А при імпорті в проєкті просто вказувати назву папки, і при цьому не вказуючи кожен файл окремо. Таким чином ми оптимізуємо основний код програми. Використаємо для цього module.exports.

modules/greetings/index.js
const english = require("./english");
const { french, spanish } = require("./multilang");
const { japanese } = require("./japanese");

module.exports = {
  english,
  french,
  spanish,
  japanese,
};

Тоді імпорт в головному index.js буде виглядати так:

modules/index.js
const { english, french, spanish, japanese } = require("./greetings");

english();
french();
spanish();
japanese();

У цьому прикладі ми одразу деструктуризуємо наші функції, хоча інколи зручно не робити цього. Принцип коду обираєте ви.

modules/index.js
const greetings = require("./greetings");

greetings.english();
greetings.french();
greetings.spanish();
greetings.japanese();

Last updated