Що таке модулі Node.js?

JavaScript виявився потужною мовою з деякими унікальними функціями, які дозволяють ефективно та водночас легко супроводжувати програмування. Його шаблон замикання та поведінка, керована подіями, виявилися дуже корисними в реальних сценаріях, але, як і всі мови програмування, він не є ідеальним, і одним з його основних недоліків проектування є спільне використання єдиного глобального простору імен.

Щоб зрозуміти проблему, нам потрібно повернутися до витоків браузерного JavaScript. У браузері, коли ви завантажуєте скрипт на свою веб-сторінку, двигун вставляє його код в адресний простір, який використовується всіма іншими скриптами. Це означає, що коли ви призначаєте змінну в одному скрипті, можна випадково перезаписати іншу змінну, вже визначену в попередньому скрипті. Хоча це може спрацювати з невеликими базами коду, це може легко викликати конфлікти у великих додатках, оскільки помилки буде важко відстежити. Це могло стати серйозною загрозою розвитку Node.js як платформи, але, на щастя, рішення було знайдено в стандарті модулів CommonJS.

Модулі CommonJS

CommonJS – це проект, започаткований у 2009 році для стандартизації способу роботи з JavaScript поза браузером. Відтоді проект розвивався, щоб підтримувати різноманітні проблеми з JavaScript, у тому числі проблему глобального простору імен, яку було вирішено за допомогою простої специфікації того, як писати та включати ізольовані модулі JavaScript. Стандарти CommonJS визначають такі три ключові компоненти під час роботи з модулями:

require(): Цей метод використовується для завантаження модуля у ваш код. • exports: цей об’єкт міститься в кожному модулі та дозволяє вам показувати частини вашого коду під час завантаження модуля. • module: цей об’єкт спочатку використовувався для надання інформації метаданих про модуль. Він також містить вказівник на об’єкт exports як властивість. Однак популярна реалізація об’єкта exports як окремого об’єкта буквально змінила варіант використання об’єкта module.

У реалізації модуля Node CommonJS кожен модуль записаний в одному файлі JavaScript і має ізольовану область, яка містить власні змінні. Автор модуля може надати будь-яку функціональність через об’єкт exports. Щоб краще це зрозуміти, припустімо, що ми створили файл модуля під назвою hello.js, який містить наступний фрагмент коду:

1var message = 'Hello';
2exports.sayHello = function(){
3    console.log(message);
4    }

Також припустимо, що ми створили файл програми під назвою server.js, який містить такі рядки коду:

1var hello = require('./hello');
2hello.sayHello();

У попередньому прикладі у вас є модуль hello, який містить змінну з назвою message. Змінна message є самодостатньою в модулі hello, який відкриває лише метод sayHello(), визначаючи його як властивість об’єкта exports. Потім файл програми завантажує модуль hello за допомогою методу require(), що дозволяє йому викликати метод sayHello() модуля hello.

A different approach to creating modules is exposing a single function using the module.exports pointer. To understand this better, let’s revise the preceding example. A modified hello.js file should look as follows:

Іншим підходом до створення модулів є надання однієї функції за допомогою покажчика module.exports. Щоб краще це зрозуміти, переглянемо попередній приклад. Змінений файл hello.js має виглядати так:

1module.exports = function() {
2    var message = 'Hello';
3    console.log(message);
4    }

Потім модуль завантажується у файл server.js наступним чином:

1var hello = require('./hello');
2hello();

У попередньому прикладі файл програми використовує модуль hello безпосередньо як функцію замість використання методу sayHello() як властивості модуля hello.

Стандарт модуля CommonJS дозволяє нескінченно розширювати платформу Node.js, одночасно запобігаючи забрудненню ядра Node; без нього платформа Node.js стала б плутаниною конфліктів. Однак не всі модулі однакові, і під час розробки програми Node ви зіткнетеся з декількома типами модулів.