Запропонувати правкуПокращити цю статтюДопрацюйте відповідь до «Нативні модулі в Node.js». Ваші зміни проходять модерацію перед публікацією.Потрібне підтвердженняКонтентЩо ви змінюєте🇺🇸EN🇺🇦UAПереглядЗаголовок (UA)Коротка відповідь (UA)**Нативні модулі** - це модулі, написані на C або C++, які вбудовуються в Node.js через Node-API (N-API) і дають доступ до низькорівневих операцій та системних бібліотек, недоступних із чистого JavaScript. **Ключове:** для нових модулів рекомендується N-API, бо він гарантує сумісність між версіями Node.js.Показується над повною відповіддю для швидкого нагадування.Відповідь (UA)Зображення## 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()); ``` 2. Node.js через **bindings** викликає відповідну функцію, реалізовану на C++. 3. C++ код виконує роботу (наприклад, звертається до системного API). 4. Результат повертається назад у 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++ | | API | Node-API (N-API), Nan, V8 API | | Призначення | Розширює Node.js нативною функціональністю | | Приклад | `const addon = require('./build/Release/addon')` | | Використовується в | `bcrypt`, `sharp`, `sqlite3`, `canvas`, `node-sass` |Для рев’юераПримітка для модератора (необов’язково)Бачить лише модератор. Прискорює рев’ю.