Учите node.js, создав бэкэнд -структуру - Velocy

Вы можете получить доступ к текущей версии книги в каталоге глав или в формате PDF (доступны как световые, так и темные режимы), нажав здесь. Обратите внимание, что эта версия включает в себя текущий выпуск контента и не является окончательной версией.
Эта книга все еще находится на очень ранней стадии. Он содержит незначительную часть общего содержания, которую должна охватить книгу. Для нашей бэкэнд -структуры будет 0 зависимости, а также нашу библиотеку журнала. Все будет сделано с использованием vanilla node.js, жесткого пути (лучший способ учиться).
Примечание
Если вы не знакомы с JavaScript, вы также можете проверить мой другой репозиторий - изучить JavaScript - простой способ, который приведет вас в глубокое и веселое путешествие в JavaScript - от самых оснований до продвинутых концепций, которые вам когда -либо понадобятся, без погружения в слишком много теории. Только практические примеры кода.
Чтобы овладеть новой концепцией, часто лучше начать с нуля. Это не просто еще одно руководство Node.js; Это всеобъемлющий опыт, начисленный на код, предназначенный для создания реального продукта, который может использоваться тысячами разработчиков. Продукт, который мы собираемся построить, станет бэкэнд -рамкой, которая тоже с нуля.
Вы не узнаете, как работает node.js, но и почему он работает определенным образом. Руководство также включает в себя обсуждения соответствующих структур данных и шаблонов проектирования.
Книга также включает в себя широкий спектр упражнений, специально созданных для того, чтобы бросить вам вызов, которые могут потребовать приверженности и последовательных усилий с вашей стороны. Первые упражнения начинаются из главы 7
Это руководство выходит за рамки оснований. Мы сосредоточены на предоставлении модульной, оптимизированной бэкэнд-структуры, которая близка к готовой к производству. Будут покрыты такие темы, как оптимизация производительности, меры безопасности и различные подходы к тестированию, чтобы обеспечить надежную и расширяемую структуру.
Я настоятельно рекомендую активно кодировать вместе с этим руководством, а не просто читать его, для полного понимания node.js и его более сложных аспектов.
Репо для нашей бэкэнд-структуры- Velocy. (WIP)

Оглавление
- (Необязательно) node.js намного быстрее, чем вы думаете
- Претенденты на тест
- Элисия - Булочка
- Аксум - ржавчина
- Express - node.js
- Velocy - node.js
- Эталон
- Исходный код
- Элисия - Булочка
- Аксум - ржавчина
- Express - node.js
- Velocy - node.js
- Результаты - типичный эталон
- Результат: Elysia - Bun/Zig (149 047 Req/S)
- Результат: Axum - ржавчина (208 938 req/s)
- Результат: Express - node.js (28 923 req/s)
- Результат: Velocy - node.js (83 689)
- Графики
- Задержка
- Запросы/сек
- Холостое память
- Память под постоянной нагрузкой
- Вердикт - типичный эталон
- Настоящий эталон
- Обновление нашего кода
- Элисия
- Выражать
- Скорость
- Результаты-реальный вариант использования
- Результат: Express - Node (50,275 Req/Sec)
- Результат: Velocy - Узел (138 956 REQ/SEC)
- Задержка
- Задержка без
max latency - Запросы/сек
- Холостое память
- Память под постоянной нагрузкой
- Окончательный вердикт
- Что, черт возьми, это веб -сервер?
- Части веб -сервера:
- Навигация по миру протоколов: быстрый обзор
- Отношения между HTTP и TCP: обеспечение надежного веб -общения
- 1. Целостность и порядок данных
- 2. Механизм подтверждения
- 3. Сложные взаимодействия
- 4. Передача накладных расходов
- Запрашивая и получение: как веб -серверы отвечают на ваши запросы
- Ваша первая программа
node.js- Что такое узел или узлы?
- Ваша первая программа Node.js
- Как работает
console.log() в node.js? - Объект
process : - Свойство
stdout объекта process :
- Работа с файлами
- Что будет делать библиотека журналов
- Как вы в любом случае работаете с файлами?
- Вернемся к
files - Немного больше о дескрипторах файлов
- Создание нашего первого файла
-
path аргумент -
flag аргумент - Аргумент
mode - Чтение из файла
- Небольшой учебник
for..of и for await..of ... - Чтение файла
json - Буферы
-
logtar наша собственная библиотека журналов- Инициализация нового проекта
- Немного о
SemVer - Создание класса
LogLevel - Класс
Logger- Инкапсуляция с
private полями
- Класс
LogConfig - Дизайн -шаблоны
- Использование шаблона
builder с классом LogConfig - JSDOC Комментарии
- Класс
RollingConfig- Класс
RollingSizeOptions - Класс
RollingTimeOptions
- Завершение класса
RollingConfig - Добавление более полезных методов в классе
LogConfig - Рефакторирование кода
- Необходимость рефакторинга
- Создание отдельных файлов
- Файл
index.js - Файл
lib/logtar.js - Файл
lib/logger.js - Файл
lib/config/log-config.js - Файл
lib/config/rolling-config.js - Файл
lib/utils/log-level.js -
lib/utils/rolling-options.js class
- Написание журналов
- 1. Повторное использование ручки файла
- 2. Вращение журнала
- 3. Асинхронная регистрация
- 4. Получение информации об абоненте (модуль и номер строки)
- Тестирование нашего текущего API
- Реализация методов ведения журнала
- Сухо (не повторяйся)
- Метод
log - Учитывая переменную члена
log_level - Написание в файл
- Еще один Gotcha
- Конфигурация каталога журналов
- Объект
require - Добавление нового помощника для создания каталога журнала
- Обновление метода
init - Завершение метода
log
- Захват метаданных
- Что такое стек?
- Примеры стеков
- Стек вызовов
- Получение информации о стеке
- Получение имени
callee и номер строки - Более эргономичный способ
- Использование функции
get_caller_info
- Небольшое вступление в
async sync- Баланс между противоположностями
- Смешивание асинхронного и синхронного кода
- Быстрее ввода/вывода из коробки
- Блокирующий код
- Параллелизм
- Добавление поддержки Rolling File
- Особенности катания
- Метод
rolling_check() -
file_handle.stat() - Вызов метода
rolling_check - Большой готча!
- Стоки трассы между точками
await- Тестирование нового создания файла журнала
- Http глубокий погружение
- Небольшой веб -сервер
- Запуск нашего веб -сервера
- Тестирование нашего веб -сервера
- Тестирование с помощью
cURL
- Глаголы HTTP, управление версиями и преимущества
HTTP/1.1-
GET - получить данные -
POST - создать что -нибудь -
PUT - заменить или создать -
HEAD - получить метаданные -
DELETE - удалить из существования -
PATCH - частичные обновления - Небольшой резюме
-
/ Путь -
HTTP/0.9 -
HTTP/1.0 -
HTTP/1.1
- Пользовательские агенты
-
User-Agent может быть странным
- Тип MIME и
Content-Type- Понимание заголовка
Accept - Тип мима
- Анатомия типа мима
- Но почему подстановочный знак
*/* ? - Заголовок
Content-Type -
charset=UTF-8 : кодирование персонажа
- Заголовки
- Название заголовка
- Колон (
: - Значение заголовка
- Пробел
- Пользовательские заголовки на основе
X-
- Запросить заголовки
- Принимать
- Реферат
- Авторизация
- Печенье
- Хозяин
- Контент-тип (запрос)
- Заголовки ответов
- Контент-тип (ответ)
- Контроль кэша
- Set-Cookie
- Коды ответов и статуса
-
Connection: close в действии - Коды статуса
-
Velocy - наша бэкэнд -структура- Почему Velocy?
- Что такое бэкэнд -фреймворк/библиотека в любом случае?
- Основные особенности нашей бэкэнд -структуры
- Маршрутизация и обработка URL:
- Средние войны
- Создание нашей собственной базы данных
- Кэширование
- Ограничение скорости
- Некоторые другие функции, которые мы будем реализовать
- Основная реализация
Router- Игрушечный маршрутизатор
-
Transfer-Encoding: chunked - Куски, о нет!
- Указание
Content-Length - Код повторный использование
- Класс
Router- Использование
Router с HTTP -сервером
-
this не хорошо- Лексический контекст
- Функции стрел не бесплатны
- Почему мы должны заботиться о памяти?
- Тестирование обновленного кода
- Улучшение API
Router - Необходимость в
Trie - Бывший. Реализация
Trie- Корневой узел
- Конец слова
- Задача 1: Основная тройка с методом
insert - Задача 2: Реализация метода
search
- Бывший. Внедрение нашего
Router на основе TRIE- Задача 1: реализация метода
addRoute - Задача 2: реализация метода
findRoute
- Бывший. Добавление поддержки метода
HTTP- Требования
- Более подробная информация
- Пример
- Подсказки
- Решение
- Добавление методов HTTP на маршрутизатор
- Обновить класс
TrieRouter
- Бывший. Реализация динамической маршрутизации
- Почему динамическая маршрутизация?
- Анатомия динамического пути
- Задача: улучшить класс
TrieRouter для поддержки динамической маршрутизации - Визуализация нашей структуры
TrieRouter - Краткое содержание
- Запуск нашего сервера
- Рефакторирование класса
TrieRouter - Тип псевдонимов
- Функция
run
- Создание нашего первого веб-сервера
- Больше рефакторирования
- Ваш первый веб -сервер
- Бывший. Параметры запроса (продвинутый)
- Анатомия URL -адреса с параметрами запроса
- Задача 1: реализация базового анализа параметров запроса
- Нам нужно заняться большим количеством краев.
- Задача 2: Параметры запроса анализа вручную