Перейти к основному содержимому

Простые приложения на JavaScript

Разработчику Архитектору

Простые приложения на JavaScript

JavaScript — это язык программирования, который изначально создавался для работы в веб-браузерах. Сегодня он является универсальным инструментом, позволяющим создавать серверные приложения, утилиты командной строки и сложные системы автоматизации благодаря среде выполнения Node.js.

В этой главе рассматриваются базовые задачи, решаемые с помощью JavaScript. Каждый пример демонстрирует конкретный аспект языка — работу со строками, файловой системой, сетевыми протоколами или данными. Код приводится в виде модульных скриптов, готовых к запуску в среде Node.js.


Как запускать примеры из главы

  1. Сохраните код раздела в файл .js (имя — в Как запустить у примера).
  2. В терминале: cd в каталог с файлом.
  3. Запустите: node имя_файла.js.
node имя_файла.js

Проверка: node -v (рекомендуется Node.js 18+). Примеры рассчитаны на Node.js, не на браузер.


Генератор паролей

Генератор паролей демонстрирует манипуляции со строковыми типами данных, использование массивов символов и генерацию случайных значений.


Как запустить

  • Файл: password.js
  • Команда: node password.js
node password.js
  • Нужно: Node.js 18+, без npm install.
  • Результат: строка Сгенерированный пароль: ... в консоли.

Основные концепции

  • Массивы: Хранение наборов символов (буквы, цифры, спецсимволы).
  • Строки: Формирование итогового результата путем конкатенации.
  • Случайность: Использование встроенного объекта Math для выбора случайного индекса.
  • Функции: Инкапсуляция логики в переиспользуемый блок кода.

Пример кода

Код ITЗагрузка примера кода…

Разбор:

  • Функция generatePassword(length, useDigits, useSymbols) принимает настройки генерации и возвращает строку пароля.
  • Сначала создаются наборы символов (lowercaseChars, uppercaseChars, digitChars, symbolChars), затем собирается общий пул charPool.
  • Условия if (useDigits) и if (useSymbols) управляют составом пула и включением обязательных категорий символов.
  • Генерация выполняется через цикл for: на каждой итерации выбирается случайный индекс из charPool.
  • split('').sort(() => 0.5 - Math.random()).join('') перемешивает символы, чтобы "обязательные" символы не стояли в начале.
  • В конце пример вызова показывает практическое использование: создаётся 16-символьный пароль и выводится в консоль.

Разбор логики

Скрипт формирует строковый пул символов на основе выбранных параметров. Цикл for выбирает случайные индексы из этого пула и добавляет соответствующие символы в итоговую строку. Метод split, sort и join используется для перемешивания символов, что повышает криптографическую стойкость пароля по сравнению с простым последовательным добавлением.


Сортировщик текстового файла

Этот пример показывает работу с файловым вводом/выводом, обработку строк и алгоритмы сортировки списков.


Как запустить

  • Файл: sort_file.js
  • Подготовка: input.txt; вызовите sortTextFile('input.txt', 'output_sorted.txt').
  • Команда: node sort_file.js
node sort_file.js
  • Результат: output_sorted.txt, сообщение о числе строк.

Основные концепции

  • Модуль fs: Чтение и запись файлов в дисковой системе.
  • Обработка ошибок: Блоки try...catch для обработки ситуаций, когда файл отсутствует или недоступен.
  • Методы массивов: split, filter, sort для трансформации данных.
  • Асинхронность: Использование промисов (Promise) для неблокирующего чтения файлов.

Пример кода

Код ITЗагрузка примера кода…

Разбор:

  • Импорт require('fs').promises даёт асинхронные методы работы с файлами через await.
  • async function sortTextFile(...) оформляет весь сценарий в одну операцию — чтение, обработка, запись.
  • Цепочка split -> map -> filter очищает входные строки от пустых значений и лишних пробелов.
  • sort((a, b) => a.localeCompare(b)) сортирует текст корректнее, чем простое сравнение строк.
  • try/catch перехватывает ошибки доступа к файлам и выводит понятное сообщение вместо падения скрипта.
  • Такой шаблон легко расширить: например, добавить сортировку без учёта регистра или удаление дубликатов.

Разбор логики

Цепочка обработки файла:

const lines = (await fs.promises.readFile(path, 'utf8'))
.split('\n')
.map((line) => line.trim())
.filter(Boolean);
lines.sort((a, b) => a.localeCompare(b, 'ru'));
await fs.promises.writeFile(outPath, lines.join('\n'));

Консольный калькулятор

Калькулятор иллюстрирует работу с пользовательским вводом, условную логику и базовые математические операции.


Основные концепции

  • Парсинг ввода: Преобразование строковых данных пользователя в числовые значения.
  • Условные конструкции: Выбор действия в зависимости от оператора.
  • Обработка деления на ноль: Защита от критических ошибок вычислений.
  • Циклы: Многократное выполнение операций до команды выхода.

Пример кода

Код ITЗагрузка примера кода…

Разбор:

  • calculate(num1, num2, operator) инкапсулирует арифметику и выбирает операцию через switch.
  • Ветвь case '/' отдельно проверяет деление на ноль и выбрасывает Error, если операция невозможна.
  • runCalculator создаёт интерфейс ввода через readline и оборачивает question в Promise для await.
  • Цикл while (true) реализует многошаговый диалог до команды выхода exit.
  • parseFloat преобразует строки в числа, а проверка isNaN защищает от некорректного ввода.
  • try/catch вокруг вызова calculate отделяет бизнес-логику от обработки ошибок пользователя.

Разбор логики

Интерактивный ввод и разбор операции:

const rl = readline.createInterface({ input: process.stdin, output: process.stdout });
while (true) {
const op = await question(rl, 'Операция (+ - * / q): ');
if (op === 'q') break;
const a = parseFloat(await question(rl, 'a: '));
const b = parseFloat(await question(rl, 'b: '));
if (Number.isNaN(a) || Number.isNaN(b)) { console.log('Некорректное число'); continue; }
// switch (op) { ... }
}

Трекер задач в JSON

Трекер задач демонстрирует сериализацию объектов в формат JSON и десериализацию обратно, а также работу с файловой системой для сохранения состояния.


Основные концепции

  • JSON: Стандартный формат обмена данными между приложениями.
  • Сериализация: Преобразование объекта JavaScript в строку JSON.
  • Десериализация: Преобразование строки JSON обратно в объект.
  • Идентификаторы: Использование уникальных чисел для отслеживания задач.

Пример кода

Код ITЗагрузка примера кода…


Разбор логики

Класс TaskTracker инкапсулирует состояние и методы работы с данными. Метод load пытается прочитать файл, если файл отсутствует, создается пустой массив. Объекты задач содержат метаданные: уникальный идентификатор на основе текущего времени, описание и статус выполнения. Метод JSON.stringify превращает массив объектов в читаемую строку для хранения на диске.


Простой HTTP-сервер и клиент

Этот пример демонстрирует создание сетевого взаимодействия без использования внешних фреймворков, используя только встроенный модуль http.


Основные концепции

  • Сервер: Обработка входящих запросов и отправка ответов.
  • Клиент: Отправка запросов к серверу и получение данных.
  • Модуль http: Создание объектов Server и ClientRequest.
  • Обработчики событий: Реакция на события request, response, data, end.

Пример кода (Сервер)

Код ITЗагрузка примера кода…


Пример кода (Клиент)

Код ITЗагрузка примера кода…


Разбор логики

Потоковая сборка ответа на клиенте:

http.get('http://localhost:3000/api/data', (res) => {
let body = '';
res.on('data', (chunk) => { body += chunk; });
res.on('end', () => {
const json = JSON.parse(body);
console.log(json);
});
});

Отправитель HTTP-запросов (POST)

Расширенная версия клиента для отправки данных на сервер с использованием POST-метода.


Основные концепции

  • POST-запросы: Отправка данных на сервер для создания или обновления ресурсов.
  • Настройка заголовков: Указание типа контента (Content-Type).
  • Передача тела запроса: Отправка JSON-строки в теле сообщения.

Пример кода

Код ITЗагрузка примера кода…


Разбор логики

Объект options содержит параметры соединения, включая метод POST. Значение Content-Length рассчитывается автоматически для корректной обработки данных сервером. Метод req.write передает тело запроса, а req.end завершает отправку.


Утилита для сканирования директорий

Инструмент для обхода файловой структуры и сбора информации о файлах и подпапках.


Основные концепции

  • Рекурсивный обход: Глубокий проход по вложенным папкам.
  • Статистика: Подсчет количества файлов, размер директории.
  • Фильтрация: Поиск файлов по расширению или имени.

Пример кода

Код ITЗагрузка примера кода…


Разбор логики

Функция использует рекурсию: при обнаружении поддиректории она вызывает сама себя. Параметр withFileTypes: true позволяет сразу определить тип объекта без дополнительных вызовов stat. Фильтрация по расширениям происходит перед добавлением файла в список.


Скрипт для создания резервного копирования файлов

Автоматизация процесса дублирования файлов с добавлением временной метки.


Основные концепции

  • Копирование файлов: Использование fs.copyFile или ручного чтения/записи.
  • Генерация имен: Добавление даты и времени к имени файла.
  • Обработка путей: Корректная работа с путями разных операционных систем.

Пример кода

Код ITЗагрузка примера кода…


Разбор логики

Метод copyFile выполняет эффективное копирование на уровне ОС. Имя файла формируется путем объединения текущей временной метки и оригинального имени. Директория recursive: true гарантирует создание всех необходимых промежуточных папок.


Мониторинг дискового пространства

Скрипт для проверки свободного места на дисках и уведомления при достижении порога заполнения.


Основные концепции

  • Системные вызовы: Использование модуля os для получения информации о дисках.
  • Пороговые значения: Сравнение текущего использования с заданным лимитом.
  • Вывод статистики: Форматированная таблица данных.

Пример кода

Код ITЗагрузка примера кода…


Разбор логики

Модуль os даёт память и платформу; диски на Linux/macOS — через execSync (см. пример выше: df -h).


Парсер URL и проверка доступности ресурса

Инструмент для разбора компонентов ссылки и проверки HTTP-статуса целевой страницы.


Основные концепции

  • URL API: Встроенный класс URL для парсинга ссылок.
  • HTTP-проверка: Отправка HEAD-запроса для минимизации трафика.
  • Валидация: Проверка корректности формата ссылки.

Пример кода

Код ITЗагрузка примера кода…


Разбор логики

Конструктор URL автоматически проверяет структуру строки. Объект options динамически выбирает протокол (http или https) и стандартные порты. Использование метода HEAD возвращает только заголовки, что быстрее полного скачивания. Обработка таймаута предотвращает зависание скрипта при медленных ответах.


Конвертер форматов дат

Утилита для перевода дат между различными строковыми представлениями без использования внешних библиотек.


Основные концепции

  • Объект Date: Работа с внутренним представлением времени.
  • Форматирование: Извлечение отдельных частей даты (год, месяц, день).
  • Парсинг: Преобразование строки в объект даты.
  • Локализация: Учет различий в форматах записи.

Пример кода

Код ITЗагрузка примера кода…


Разбор логики

Функция formatDate заменяет плейсхолдеры в шаблоне на актуальные значения из объекта Date. Метод padStart обеспечивает двухзначное представление чисел (например, 05 вместо 5). Функция parseDate принимает строку и шаблон, разбивает строку разделителями и сопоставляет части с элементами шаблона.


Утилита для просмотра запущенных процессов

Инструмент для вывода списка активных процессов системы с их параметрами.


Основные концепции

  • Выполнение системных команд: Использование child_process для запуска утилит ОС.
  • Обработка вывода: Парсинг текста из терминальной команды.
  • Фильтрация: Поиск процессов по имени.

Пример кода

Код ITЗагрузка примера кода…


Разбор логики

Команды wmic (Windows) и ps (Unix-like) предоставляют детальную информацию о процессах. Скрипт определяет операционную систему и выбирает соответствующую команду. Вывод разбивается на строки, каждая строка анализируется для извлечения ключевых полей. Функция filterName позволяет сузить список до нужных процессов.


Характерный пример именно для JavaScript

Особенностью JavaScript является его способность работать в двух совершенно разных средах: браузере и сервере (Node.js). Ниже приведен пример кода, который демонстрирует эту универсальность. Этот скрипт может работать и в консоли браузера, и в терминале Node.js, так как использует стандартные глобальные объекты и функции, доступные в обоих окружениях.


Универсальный счетчик слов

Код ITЗагрузка примера кода…


Почему этот пример характерен

  1. Отсутствие зависимостей: Код не требует подключения внешних библиотек.
  2. Полиморфизм среды: Проверка typeof window === 'undefined' позволяет адаптировать поведение кода под среду выполнения.
  3. Работа с данными: Использует современные возможности ES6+ (Set, стрелочные функции, шаблонные строки).
  4. Читаемость: Синтаксис максимально приближен к естественному языку, что делает код понятным даже новичкам.

Этот подход позволяет создавать библиотеки, которые работают везде, где выполняется JavaScript, будь то мобильное устройство, сервер или браузер пользователя.


Основа по протоколу

Базовый разбор HTTP и HTTPS находится в отдельной статье — HTTP как основа веб-интеграций.

Содержание