Сервис развивается: тестируем формат, собираем идеи, улучшаем сервис. Есть идеи? Написать
Дайджесты новостей
Схема работы нативных механизмов ограничения вызовов в Node.js 26.10: подавление дребезга debounce и равномерное тактирование событий throttle

Node.js 26.10.0: нативные util.debounce и util.throttle, интеграция SQLite и ускорение криптографии

Выпуск Node.js 26.10.0 в текущей ветке Current продолжает стратегическую линию платформы на постепенное устранение мелких утилитных зависимостей из повседневного стека веб-разработки. Исторически разработчики добавляли в package.json объемные пакеты вроде Lodash или специализированные микробиблиотеки только ради пары функций ограничения частоты вызовов при обработке поискового ввода или сетевых запросов. Сентябрьский релиз закрывает этот пробел на уровне встроенного модуля node:util, параллельно устраняя давние шероховатости в работе с базами данных и межпроцессными коммуникациями.

Нативные util.debounce и util.throttle в стандартной библиотеке

Ключевым новшеством релиза стало включение нативных реализаций util.debounce и util.throttle, подготовленных контрибьютором Джеймсом Снеллом. В отличие от легковесных любительских функций, нативные реализации полностью поддерживают параметры задержки, настройку срабатывания по переднему и заднему фронту интервала (leading и trailing edges), а также предоставляют явные методы отмены и немедленного сброса таймеров:

import { debounce, throttle } from 'node:util';

// Подавление дребезга: запрос отправляется только после паузы в 300 мс
const handleSearchInput = debounce((query) => {
  console.log(`Поиск данных по запросу: ${query}`);
}, 300);

// Ограничение частоты: выполнение не чаще одного раза в 500 мс
const syncMetrics = throttle((metric) => {
  console.log(`Сброс телеметрии в хранилище: ${metric}`);
}, 500, { leading: true, trailing: false });

// Вызовы утилитных функций
handleSearchInput('node');
handleSearchInput('nodejs release'); // Предыдущий таймер сброшен

// Явная отмена запланированного вызова при демонтаже компонента
handleSearchInput.cancel();

Встроенные функции избавляют команды от необходимости следить за безопасностью внешних транзитивных зависимостей и снижают накладные расходы сборщиков при подготовке серверных бандлов.

Прозрачное связывание undefined со значением NULL в node:sqlite

Второй важный практический шаг касается встроенного движка SQLite, появившегося в экспериментальном виде в недавних версиях Node.js. Ранее попытка передать объект с полями, имеющими значение undefined, в параметризованный SQL-запрос приводила к аварийному завершению с ошибкой TypeError. Разработчикам приходилось вручную санировать входные объекты, превращая undefined в явные null.

В версии 26.10.0 поведение приведено к стандарту: движок автоматически транслирует JavaScript-значение undefined в SQL-значение NULL:

import { DatabaseSync } from 'node:sqlite';

const db = new DatabaseSync(':memory:');

db.exec(`
  CREATE TABLE users (
    id INTEGER PRIMARY KEY,
    name TEXT NOT NULL,
    middle_name TEXT
  )
`);

// Подготовленное выражение
const insertUser = db.prepare(`
  INSERT INTO users (name, middle_name) VALUES (?, ?)
`);

// Ранее передача undefined вызывала TypeError, теперь вставляется NULL
const userData = { name: 'Алексей', middleName: undefined };
insertUser.run(userData.name, userData.middleName);

const user = db.prepare('SELECT * FROM users WHERE name = ?').get('Алексей');
console.log(user); // { id: 1, name: 'Алексей', middle_name: null }

Это изменение существенно упрощает написание лаконичного кода сервисного слоя, когда необязательные свойства DTO-объектов передаются в базу напрямую без промежуточных трансформаций.

Расширение криптографии и сетевые сокеты

Релиз 26.10.0 также включает ряд системных оптимизаций, ориентированных на высоконагруженные серверные сценарии:

  • Парсинг контейнеров PKCS#12: В модуль node:crypto добавлен нативный метод crypto.parsePKCS12(). Он позволяет разбирать связки сертификатов, закрытых ключей и цепочек доверия из форматов .p12 и .pfx напрямую в оперативной памяти без внешних парсеров.
  • Передача связанных сокетов: Сетевая подсистема получила поддержку отправки дескрипторов net.BoundSocket между рабочими потоками (worker threads) и дочерними процессами через стандартный механизм IPC. Это позволяет организовать прозрачную балансировку входящих TCP-соединений между воркерами без повторного открытия системных портов.
  • Оптимизация производительности: В модуль perf_hooks включен класс SlidingWindowHistogram, обеспечивающий сбор квантилей задержек в скользящем временном окне с минимальным влиянием на событийный цикл (event loop).

Для проектов, использующих современные версии платформы, релиз 26.10.0 предлагает быстрый способ уменьшить число внешних пакетов и стандартизировать работу с базовыми механизмами рантайма.