Skip to main content

Нативні модулі в Node.js

1. Що таке нативні модулі

Нативні модулі Node.js - це модулі, написані на C або C++, які вбудовуються в Node.js через спеціальний API (Node-API / N-API) і дозволяють:

  • виконувати низькорівневі операції швидше, ніж на чистому JavaScript;
  • взаємодіяти із системними бібліотеками чи зовнішніми C-бібліотеками;
  • розширювати Node.js функціональністю, недоступною з JS.

Приклади:

  • bcrypt (шифрування) - використовує C++ реалізацію під капотом;
  • canvas (відрисовка 2D-графіки) - використовує нативну бібліотеку Cairo;
  • sqlite3 - підключається до бібліотеки SQLite, написаної на C;
  • node-sass - використовує нативну бібліотеку LibSass.

2. Як це працює

Коли JS-код викликає функцію з нативного модуля, відбувається таке:

  1. JS звертається до функції з модуля:
javascript
const addon = require('./build/Release/addon'); console.log(addon.hello());
  1. Node.js через bindings викликає відповідну функцію, реалізовану на C++.
  2. C++ код виконує роботу (наприклад, звертається до системного API).
  3. Результат повертається назад у JavaScript через V8.

Тобто нативний модуль - це міст між JavaScript і C/C++.

3. Приклад простого нативного модуля

Файл addon.cc:

javascript
#include <napi.h> Napi::String Hello(const Napi::CallbackInfo& info) { return Napi::String::New(info.Env(), "Hello from C++!"); } Napi::Object Init(Napi::Env env, Napi::Object exports) { exports.Set("hello", Napi::Function::New(env, Hello)); return exports; } NODE_API_MODULE(addon, Init)

binding.gyp (інструкція для збірки):

javascript
{ "targets": [ { "target_name": "addon", "sources": ["addon.cc"] } ] }

Команди:

javascript
npm install -g node-gyp node-gyp configure node-gyp build

Після збірки з'явиться бінарний файл build/Release/addon.node.

Використання в JS:

javascript
const addon = require('./build/Release/addon'); console.log(addon.hello()); // → "Hello from C++!"

4. Що лежить в основі

Нативні модулі використовують один із C/C++ API Node.js:

APIПризначення
Node-API (N-API)Сучасний стабільний інтерфейс для написання нативних модулів. Не залежить від версії V8.
V8 APIНизькорівневий доступ до об'єктів JS усередині V8 (старий підхід). Вимагає ручної роботи з типами й пам'яттю.
Nan (Native Abstraction for Node.js)Прошарок, що спрощує сумісність між версіями Node.js і V8.

Зараз рекомендується використовувати N-API, оскільки він гарантує сумісність між версіями Node.js.

5. Переваги нативних модулів

ПеревагаОпис
Висока продуктивністьКод на C/C++ виконується швидше, ніж JS, особливо при важких обчисленнях.
Доступ до системних APIМожна напряму звертатися до функцій ОС, драйверів, бібліотек.
Розширюваність Node.jsДозволяє додавати нові можливості ядра Node.js без модифікації вихідників.
Перевикористання нативних бібліотекМожна обгорнути наявні C/C++ бібліотеки в JS-інтерфейс.

6. Недоліки й ризики

НедолікОпис
Складність розробкиПотрібно знати C++ і внутрішні структури V8/Node.js.
Компіляція під кожну платформуПотрібно збирати модуль під Windows, Linux, macOS (різні бінарники).
Несумісність версійСтарі модулі, що використовують V8 API напряму, можуть ламатися під час оновлення Node.js.
Проблеми з пам'яттюПомилки в C++ коді можуть призвести до витоків або падіння процесу.

7. Приклади популярних нативних модулів

МодульПризначення
bcryptХешування паролів (C++/OpenSSL)
node-sassКомпіляція SCSS у CSS (C++)
canvasРобота із зображеннями й графікою (C++)
sqlite3Робота з базою даних SQLite (C)
sharpОптимізація зображень (C++)
grpcШвидка серіалізація/десеріалізація для gRPC (C++)
ffi-napiВиклик нативних C-бібліотек прямо з JS

8. Важливо розрізняти:

ТермінЗначення
Core modulesВбудовані в Node.js (fs, http, os) - частина вихідників Node.js.
Native modulesНаписані на C/C++ і підключаються через require() як бінарники (.node).
JS-модуліЗвичайні модулі на JavaScript (.js), підключаються через require або import.

9. Візуалізація

javascript
┌──────────────────────────┐ JavaScript (V8)require('addon.node')└──────────┬───────────────┘ ┌──────────────────────────┐ Node.js C++ Bindings (N-API / Nan / V8 API)└──────────┬───────────────┘ ┌──────────────────────────┐ │ Нативна бібліотека C/C++ (OpenSSL, SQLite, Cairo)└──────────────────────────┘

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

ХарактеристикаОпис
Формат.node (скомпільований бінарний модуль)
Мова реалізаціїC / C++
APINode-API (N-API), Nan, V8 API
ПризначенняРозширює Node.js нативною функціональністю
Прикладconst addon = require('./build/Release/addon')
Використовується вbcrypt, sharp, sqlite3, canvas, node-sass

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

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

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