Простые приложения на JavaScript
Простые приложения на JavaScript
JavaScript — это язык программирования, который изначально создавался для работы в веб-браузерах. Сегодня он является универсальным инструментом, позволяющим создавать серверные приложения, утилиты командной строки и сложные системы автоматизации благодаря среде выполнения Node.js.
В этой главе рассматриваются базовые задачи, решаемые с помощью JavaScript. Каждый пример демонстрирует конкретный аспект языка — работу со строками, файловой системой, сетевыми протоколами или данными. Код приводится в виде модульных скриптов, готовых к запуску в среде Node.js.
Как запускать примеры из главы
- Сохраните код раздела в файл
.js(имя — в Как запустить у примера). - В терминале:
cdв каталог с файлом. - Запустите:
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Загрузка примера кода…
Почему этот пример характерен
- Отсутствие зависимостей: Код не требует подключения внешних библиотек.
- Полиморфизм среды: Проверка
typeof window === 'undefined'позволяет адаптировать поведение кода под среду выполнения. - Работа с данными: Использует современные возможности ES6+ (
Set, стрелочные функции, шаблонные строки). - Читаемость: Синтаксис максимально приближен к естественному языку, что делает код понятным даже новичкам.
Этот подход позволяет создавать библиотеки, которые работают везде, где выполняется JavaScript, будь то мобильное устройство, сервер или браузер пользователя.
Базовый разбор HTTP и HTTPS находится в отдельной статье — HTTP как основа веб-интеграций.