Фото Габріеля Хайнцера на Unsplash
1. Історія та Передумови Node.js
1.1 Передумови
Наприкінці 90-х — на початку 2000-х років, розробка веб-технологій розвивалася дуже швидко. Однак традиційна архітектура бекенду мала кілька проблем, серед яких:
- Модель Blocking I/O:
- Мови, такі як PHP, Ruby і Python, використовують модель blocking I/O. Коли сервер обробляє один запит, він не може обробити інший до завершення першого.
- Аналогія: Уявіть ресторан, де є лише один кухар, і він може готувати лише одне замовлення за раз. Всі інші клієнти повинні чекати, поки не буде готове перше замовлення.
2. Складність Розробки:
- Розробникам веб-застосунків потрібно використовувати дві мови: JavaScript для клієнтської частини (frontend) і інші мови (наприклад, PHP або Python) для серверної частини (backend). Це створює складність, оскільки потрібно синхронізувати два стеки технологій.
3. Обмежена Продуктивність:
- Сервери з багатозадачністю (multi-threading) традиційно потребують великої кількості апаратних ресурсів, що робить їх менш ефективними для обробки великих обсягів запитів.
1.2 Народження Node.js
У 2009 році Раян Дал, американський розробник, створив Node.js як рішення для вищезгаданих проблем. Він застосував принципово інший підхід до традиційного бекенду:
- Non-blocking I/O: Node.js дозволяє серверу продовжувати обробку інших запитів, поки чекає завершення операцій.
- Програмування, орієнтоване на події (Event-Driven Programming): Сервер не чекає. Він лише реагує на запити, коли відбувається подія (наприклад, дані оброблено).
Чому Раян вибрав JavaScript?
- JavaScript вже став універсальною мовою для фронтенду. Зробивши його доступним для бекенду, розробники можуть використовувати одну мову для всього застосунку.
- Двигун Google V8 (який використовує Chrome) робить JavaScript дуже швидким, що робить його ідеальним для серверної частини.
1.3 Важливі етапи в історії Node.js
- 2009: Перший реліз Node.js, який підтримував вбудовані модулі, такі як HTTP та файлову систему (fs).
- 2010: Випуск NPM (Node Package Manager), що дозволив розробникам ділитися та використовувати бібліотеки, створені спільнотою.
- 2011: Великі компанії, такі як LinkedIn, почали використовувати Node.js для розробки своїх реальних додатків у реальному часі.
- 2015: Node.js став частиною Node.js Foundation, що зміцнило розвиток відкритого програмного забезпечення.
- 2019 і далі: Node.js став надзвичайно популярною технологією, яку використовують компанії, як-от Netflix, Uber, Walmart та NASA.
1.4 Node.js проти інших технологій
Ось порівняння між Node.js та іншими традиційними бекенд технологіями:
2. Основні концепції Node.js
2.1 Non-blocking I/O
Node.js використовує модель non-blocking input/output. Це означає, що сервер не чекає завершення операцій для того, щоб продовжити виконання інших завдань.
- Приклад Blocking I/O (PHP/Python):
$file = file_get_contents("data.txt");
echo $file;
- У цьому коді сервер повинен чекати, поки файл “data.txt” буде прочитаний, перш ніж продовжити виконання інших завдань.
- Приклад Non-blocking I/O (Node.js):
const fs = require('fs');
fs.readFile('data.txt', (err, data) => {
if (err) throw err;
console.log(data.toString());
});
console.log("Інші запити продовжують виконуватись!");
- У цьому коді сервер може обробляти інші запити без очікування завершення операції читання файлу.
2.2 Програмування на основі подій
Node.js працює на основі подій. Коли відбувається якась подія (наприклад, файл завершив читання або клієнт надіслав запит), Node.js активує callback function для обробки цієї події.
- Event Loop: Event loop (цикл подій) — це серце Node.js.
Ini adalah mekanisme yang memungkinkan Node.js menangani banyak permintaan secara simultan meskipun hanya menggunakan satu thread.
2.3 Single-Threaded
Node.js hanya menggunakan satu thread untuk menangani semua permintaan. Namun, dengan model asynchronous, Node.js mampu menangani ribuan permintaan sekaligus tanpa memblokir thread utama.
Analogi: Bayangkan sebuah koki di restoran yang sangat efisien. Koki ini tidak memasak semua pesanan sendiri, tetapi hanya mengatur proses dan memberi tahu staf kapan pesanan selesai.
3. Ekosistem Node.js
3.1 Кроки встановлення
- Встановлення Node.js:
- Перейдіть на офіційний сайт Node.js: https://nodejs.org.
- Завантажте версію LTS (стабільну).
- Встановіть на свій комп'ютер.
2. Перевірка встановлення:
- Відкрийте термінал або командний рядок і введіть наступну команду:
node -v
- Якщо Node.js встановлено успішно, ви побачите версію Node.js, наприклад:
v18.16.0
.
3.2 Вбудовані модулі Node.js
Node.js надає вбудовані модулі для виконання різних важливих функцій:
- fs (File System): Управління файлами, такими як читання, запис і видалення файлів.
- http: Створення HTTP-серверів для обробки запитів від клієнтів.
- path: Управління шляхами файлів і директорій.
- os: Надання інформації про операційну систему.
3.3 Читання та запис файлів
- Створіть файл з назвою
file-ops.js
:
// Імпортуємо модуль 'fs' (файлова система)
const fs = require('fs');
// Записуємо дані в файл 'data.txt'
fs.writeFile('data.txt', 'Привіт, світ з Node.js!', (err) => {
if (err) throw err;
console.log('Файл успішно записано.');
// Читаємо вміст файлу 'data.txt'
fs.readFile('data.txt', 'utf8', (err, data) => {
if (err) throw err;
console.log(`Вміст файлу: ${data}`);
});
});
- Запустіть файл:
node file-ops.js
- Перевірте файл
data.txt
, який щойно створено, і ви побачите вміст:
Привіт, світ з Node.js!
3.4 NPM (Node Package Manager)
NPM є однією з найпотужніших функцій Node.js. З більше ніж 1 мільйоном пакетів, NPM дозволяє розробникам використовувати бібліотеки, готові до використання, такі як:
- Express.js: Фреймворк для створення веб-додатків.
- Mongoose: Бібліотека для підключення Node.js до MongoDB.
- Socket.io: Для реального часу комунікації.
Приклад використання NPM:
- Встановіть пакет Express:
npm install express
- Створіть файл
server.js
:
const express = require('express');
const app = express();
app.get('/', (req, res) => {
res.send('Привіт, Express!');
});app.listen(3000, () => {
console.log('Сервер працює на http://localhost:3000');
});
4. Створення першого HTTP-сервера
- Створіть файл
server.js
:
// Імпортуємо вбудований модуль 'http'
const http = require('http');
// Створюємо HTTP-сервер
const server = http.createServer((req, res) => {
// Надсилаємо просту відповідь клієнту
res.writeHead(200, { 'Content-Type': 'text/plain' });
res.end('Привіт, це ваш перший сервер Node.js!');
});// Запускаємо сервер на порту 3000
server.listen(3000, () => {
console.log('Сервер працює на http://localhost:3000');
});
- Запустіть сервер:
node server.js
- Відкрийте браузер і перейдіть за адресою
http://localhost:3000
.
5. Реальні приклади використання
Приклади використання Node.js у реальному житті
- Netflix:
- Node.js використовується для покращення швидкості запуску їхніх додатків.
2. Uber:
- Node.js обробляє мільйони запитів API щосекунди.
3. PayPal:
- Перехід від Java до Node.js значно прискорив їхній процес розробки.
6. Завдання
Теоретичні завдання
- Поясніть різницю між blocking I/O та non-blocking I/O.
- Які переваги має Node.js порівняно з PHP для додатків у реальному часі?
Практичні завдання
- Створіть простий HTTP-сервер, який:
- Відображатиме повідомлення “Ласкаво просимо в Node.js” на маршруті
/
. - Відображатиме повідомлення “Про сторінку Node.js” на маршруті
/about
.
Створіть файл JavaScript, який записує дані вашого імені та віку в файлprofil.txt
, а потім читає і виводить ці дані.
6. Рефлексія та дискусія
Питання для рефлексії
- Які труднощі ви зустріли, коли вперше використовували Node.js?
- Як би ви порівняли Node.js з іншими технологіями для бекенду, такими як Python чи PHP?
Дискусія
- Які додатки, на вашу думку, підходять для використання Node.js? Чому?
- Як концепція event loop (цикл подій) робить Node.js ефективнішим при обробці запитів?
Висновки
У цьому модулі ми розглянули:
- Історія та передумови Node.js, зокрема причини, чому був створений Node.js.
- Основні концепції Node.js, такі як non-blocking I/O та event-driven programming (програмування на основі подій).
- Практичні навички, починаючи від простих програм до створення HTTP-серверів і читання/запису файлів.
Перекладено з: Node.js 1: Pendahuluan