Структура проєкту, експорт-імпорт, 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.
const eng = () => console.log("Hi, there!");
module.exports = eng;
Після цього можемо заімпортувати наш модуль в головному файлі index.js. При імпорті можна змінити назву модуля і дати нову. використовуємо функцію require.
const english = require("./greetings/english");
english();
При цьому при імпорті розширення js вказувати не обов'язково. Після цього можна і викликати до виконання наш заімпортований модуль english().
Трохи більше про запуск модуля. А щоб виконати код в терміналі (якщо перебуваємо в кореневому каталозі проєкту modules) запускаємо його.
node index.js
Відповідно, якщо вкладеність скрипта більша, наприклад ми перебуваємо у дереві файлів на порядок вище, то звертаємось до файлу через слеш.
node modules/index.js
У цьому випадку файл index.js сприймається, як такий що має виконатися першим за замовчанням, якщо ми не вкажемо конкретне імʼя скрипта. Тобто достатньо вказати шлях до папки, а Node.js, якщо знайде в папці файл index.js, то виконає саме його.
node modules
Якщо Node.js не знайде файл index.js, то повернеться помилка.
Дефолтний експорт у програмуванні на Node.js ймовірніше виняток, ніж правило, тому розглянемо стандартний іменний експорт далі.
Експорт v2 (іменний експорт-імпорт)
Плюс такого підходу, що з одного файлу ми можемо експортувати одразу кілька функцій. Використовуємо синтаксис exports.НАЗВА_ФУНКЦІЇ
exports.french = () => console.log("Bonjour");
exports.spanish = () => console.log("Buenos Días");
І одним рядком можемо заімпортувати наші функції в файл скрипта. Присвоївши їм якусь назву.
const multi = require("./languages/multilang");
multi.french();
multi.spanish();
Можна при імпорті одразу провести деструктуризацію.
const { french, spanish } = require("./languages/multilang");
french();
spanish();
Можна під час імпорту і деструктуризації навіть присвоїти нові імена функціям.
const { french: fr, spanish: sp } = require("./languages/multilang");
fr();
sp();
index.js як хаб для експорту модулів
Щоб трохи більше прикладів було так само створимо й експортуємо ще оду функцію (модуль).
exports.japanese = () => console.log("Kon'nichiwa");
А тепер у каталозі modules/greetings створимо свій внутрішній index.js. Його і будемо використовувати як своєрідний хаб для експорту.
Логіка така: Оскільки за замовчанням, якщо не вказувати імʼя файла, то Node.js обирає index.js. Тому логічно у ньому зібрати всі експортовані функції і експортувати як обʼєкт. А при імпорті в проєкті просто вказувати назву папки, і при цьому не вказуючи кожен файл окремо. Таким чином ми оптимізуємо основний код програми. Використаємо для цього module.exports.
const english = require("./english");
const { french, spanish } = require("./multilang");
const { japanese } = require("./japanese");
module.exports = {
english,
french,
spanish,
japanese,
};
Тоді імпорт в головному index.js буде виглядати так:
const { english, french, spanish, japanese } = require("./greetings");
english();
french();
spanish();
japanese();
У цьому прикладі ми одразу деструктуризуємо наші функції, хоча інколи зручно не робити цього. Принцип коду обираєте ви.
const greetings = require("./greetings");
greetings.english();
greetings.french();
greetings.spanish();
greetings.japanese();
Last updated