Node.js — це відкритий, крос-платформовий середовище виконання, яке дозволяє розробникам запускати JavaScript-код поза браузером. Побудований на движку V8 від Chrome, Node.js став популярним вибором для створення масштабованих, високопродуктивних серверних додатків.
Ця стаття ознайомить вас з основами Node.js, його архітектурою, можливостями та простими прикладами, щоб допомогти вам почати.
Чому Node.js?
Ключові особливості:
- Асинхронність та подієво-орієнтована модель
Node.js використовує асинхронну, подієво-орієнтовану архітектуру, що робить його надзвичайно ефективним для обробки кількох запитів одночасно.
- Однопоточність з подієвим циклом
На відміну від традиційних багатопоточних архітектур, Node.js працює на одному потоці за допомогою подієвого циклу, оптимізуючи використання ресурсів.
- Швидке виконання
Node.js виконує JavaScript-код з неймовірною швидкістю завдяки движку V8.
- Багатий екосистеми (npm)
Node.js має величезний репозиторій пакетів через npm (Node Package Manager), що спрощує розробку.
- Крос-платформовість
Напишіть код один раз і запустіть його на кількох платформах без змін.
Налаштування Node.js
Інсталяція:
-
Завантажте останню версію Node.js з офіційного сайту Node.js.
-
Перевірте встановлення:
node -v
npm -v
Hello World в Node.js
Створіть простий сервер, щоб зрозуміти, як працює Node.js.
Приклад коду:
// hello.js
const http = require('http');
const server = http.createServer((req, res) => {
res.writeHead(200, { 'Content-Type': 'text/plain' });
res.end('Hello, World!');
});
server.listen(3000, () => {
console.log('Server is running on http://localhost:3000');
});
Запустіть код:
node hello.js
Виведення:
Відкрийте http://localhost:3000 у вашому браузері, щоб побачити "Hello, World!".
Модулі Node.js
Node.js використовує модульну архітектуру. Існує три типи модулів:
- Вбудовані модулі
Модулі, такі як fs, http, path тощо.
- Локальні модулі
Користувацькі модулі, створені розробниками.
- Модулі сторонніх розробників
Модулі, встановлені через npm.
Приклад: Використання вбудованих модулів
// file-writer.js
const fs = require('fs'); // Імпортуємо модуль File System
// Записуємо дані у файл
fs.writeFile('example.txt', 'Hello, Node.js!', (err) => {
if (err) {
console.error('Помилка при записі у файл:', err);
return;
}
console.log('Файл успішно створено!');
});
Запустіть файл
npm: Node Package Manager
npm — це менеджер пакетів для JavaScript. Ви можете використовувати його для встановлення бібліотек сторонніх розробників.
Інсталяція пакета:
npm install axios
Axios — це популярний HTTP-клієнт на основі промісів для асинхронних HTTP-запитів у JavaScript. Його можна використовувати як у браузері, так і в середовищі Node.js. Axios спрощує процес відправки HTTP-запитів, обробки відповідей і управління помилками.
Він широко використовується для таких задач, як отримання даних з API, надсилання форм та багато іншого.
Використання пакета:
// api-request.js
const axios = require('axios'); // Імпортуємо Axios
// Виконуємо GET запит до публічного API
axios.get('https://api.github.com/users/octocat')
.then((response) => {
console.log('Дані користувача:', response.data);
})
.catch((error) => {
console.error('Помилка при отриманні даних:', error.message);
});
Запустіть файл:
node api-request.js
Асинхронне програмування в Node.js
Node.js обробляє операції вводу-виводу асинхронно за допомогою зворотних викликів (callback), промісів (promises) або async/await.
Приклад зворотного виклику (Callback):
Зворотний виклик (callback) в Node.js — це функція, яка передається як аргумент до іншої функції і виконується, коли перша функція завершує свою задачу. У Node.js зворотні виклики часто використовуються для обробки асинхронних операцій, таких як читання файлів, здійснення HTTP запитів або запити до бази даних. Вони дозволяють Node.js обробляти кілька операцій одночасно без блокування основного потоку.
// file-reader.js
const fs = require('fs'); // Імпортуємо модуль File System
// Читаємо файл example.txt з кодуванням utf-8
fs.readFile('example.txt', 'utf8', (err, data) => {
if (err) {
// Обробка помилки, якщо файл не існує або його не можна прочитати
console.error('Помилка при читанні файлу:', err.message);
return;
}
// Виводимо вміст файлу в консоль
console.log('Вміст файлу:', data);
});
Запустіть файл:
node file-reader.js
Приклад з промісами (Promises):
Проміси (Promises) у JavaScript — це об'єкти, які представляють завершення (або невдачу) асинхронної операції та її результатуюче значення. Вони надають чистіший і більш структурований спосіб обробки асинхронного коду в порівнянні з зворотними викликами, що полегшує управління операціями, такими як API виклики, читання файлів або таймери.
const fs = require('fs').promises; // Імпортуємо API промісів з модуля File System
// Читаємо файл за допомогою промісів
fs.readFile('example.txt', 'utf8')
.then((data) => {
// Виводимо вміст файлу, якщо успішно
console.log('Вміст файлу:', data);
})
.catch((err) => {
// Виводимо помилку, якщо читання файлу не вдалося
console.error('Помилка при читанні файлу:', err.message);
});
Запустіть файл
Приклад з async/await:
Async функція:
async function exampleFunction() {
// Ця функція повертає Promise
return "Hello, World!";
}
exampleFunction().then(result => {
console.log(result); // Виводить "Hello, World!"
});
Запустіть код:
node file-reader-async.js
Використання await
Тут, exampleFunction() — асинхронна функція, яка неявно повертає проміс.
Метод .then() використовується для доступу до результату промісу.
async function fetchData() {
let result = await someAsyncTask(); // Чекає на вирішення промісу
console.log(result);
}
fetchData();
У наведеному вище прикладі await чекає на вирішення промісу someAsyncTask() перед тим, як продовжити виконання функції.
Приклад: Отримання даних з використанням async/await
const axios = require('axios'); // Імпортуємо Axios
// Визначаємо асинхронну функцію для отримання даних з API
async function getUserData() {
try {
const response = await axios.get('https://jsonplaceholder.typicode.com/users/1'); // Чекає на вирішення промісу
console.log(response.data); // Виводимо дані після отримання
} catch (error) {
console.error('Помилка при отриманні даних:', error.message); // Ловимо помилки
}
}
getUserData();
Запустіть код
Приклад: Отримання даних з використанням async/await та промісів
async/await побудовано на основі промісів. Давайте подивимося, як це спрощує роботу з асинхронним кодом, особливо з такими операціями, як читання файлів або отримання даних з API.
const fs = require('fs').promises; // Використовуємо версію з промісами з модуля fs
// Визначаємо асинхронну функцію для читання файлу
async function readFile() {
try {
const data = await fs.readFile('example.txt', 'utf8'); // Чекає на прочитання файлу
console.log(data); // Виводимо вміст файлу
} catch (err) {
console.error('Помилка при читанні файлу:', err.message); // Обробляємо помилки
}
}
readFile();
Створення простого API з Node.js
Створіть базовий REST API за допомогою Node.js.
Приклад коду:
api-server.js
const http = require('http');
const server = http.createServer((req, res) => {
if (req.url === '/api' && req.method === 'GET') {
res.writeHead(200, { 'Content-Type': 'application/json' });
res.end(JSON.stringify({ message: 'Ласкаво просимо до Node.js API' }));
} else {
res.writeHead(404, { 'Content-Type': 'text/plain' });
res.end('Не знайдено');
}
});
server.listen(3000, () => {
console.log('Сервер працює на http://localhost:3000');
});
Запустіть код
node api-server.js
Node.js — потужний інструмент для створення масштабованих, високопродуктивних додатків. Його неблокуюча, орієнтована на події архітектура робить його ідеальним для реального часу, API та мікросервісів. Освоївши ці основи, ви будете готові використовувати Node.js у своїх проектах.
Дайте знати, якщо хочете розширити певні теми, такі як Express.js, реальний час з WebSockets або розгортання Node.js додатків!
Перекладено з: Node.js Fundamentals: A Beginner’s Guide