Обзор на браузерные API, которые стали Widely available в декабре 2025. Раз в месяц я буду вам напоминать, что вы уже можете использовать в проде.
Каждый месяц выходят новые CSS-свойства, HTML-атрибуты, JavaScript-методы и WebAPI, но применять в проде мы их конечно же не будем. 2.5 года назад также каждый месяц выходили новые фичи в браузере, а вот их уже пора начинать применять.
Как мы понимаем, что уже можно использовать в проде?
У каждой компании, да что уж там компании, у каждой команды в компании своя методика принятия решения о внедрении той или иной фичи в проекте.
Общий же сценарий выглядит так:
- Посмотрели в пользовательские метрики. Поняли какими браузерами и их версиями в основном пользуются пользователи проекта;
- Заглянули в caniuse и поняли, какие фичи уже поддерживаются большинством браузеров;
- Приняли решение о внедрении той или иной фичи в проект.
Какие-то команды позволяют себе указывать правило "последние три версии браузеров". У других специфика проекта, что проект работает исключительно на iPad с Safari. Сами понимаете, все мы разные и требования разные, и у каждого свой подход.
Baseline - позволяет немного упростить процесс принятия решения о внедрении той или иной фичи в проект. Если фича Widely available значит фича уже как минимум есть во всех основных браузерах как минимум стабильно используются последние 2.5 года.
Какие фичи в вебе стали Widely available в декабре 2025?
calc() keywords
JavaScript modules in workers
window.print()
1. Математические константы в calc()
Теперь внутри функции calc() можно использовать зарезервированные ключевые слова: e, pi, infinity и NaN. Это избавляет от необходимости копировать длинные хвосты знаков после запятой или писать огромные числа «на глаз».
Пример: Вам нужно повернуть элемент ровно на полкруга, используя радианы. Вместо 3.14159rad теперь можно написать pi * 1rad.
Пример
.circle {
/* Поворот на 180 градусов (π радиан) */
transform: rotate(calc(pi * 1rad));
}
.button {
/* хорошее скругление без знания высоты элемента */
border-radius: calc(infinity * 1px);
}
Доступные ключевые слова:
pi— число Пи ($\pi \approx 3.14159$). Идеально для тригонометрии и расчетов, связанных с кругами.e— число Эйлера ($e \approx 2.71828$). Основание натурального логарифма, полезно для сложных анимаций с затуханием или ростом.infinity/-infinity— бесконечность. Позволяет задать «максимально возможное» значение.NaN— «Not a Number». Появляется при математических ошибках (например,0 / 0), помогает браузеру корректно обрабатывать исключения без поломки всего CSS.
Практика: гарантированный z-index
Раньше, чтобы элемент точно был поверх всех остальных, мы писали z-index: 999999. Теперь можно использовать «официальную» бесконечность:
.modal-overlay {
z-index: calc(infinity);
}
Примечание: Браузер вычислит это как максимально возможное целое число. В разных браузерах и в разных операционных системах значение фактическое значение может быть разным.
Практика: работа с углами и анимациями
Если вы строите сложные интерфейсы с анимацией по траектории, константы делают формулы понятнее:
.orbit-element {
/* Смещение по синусоиде */
left: calc(50% + 100px * sin(pi / 4));
}
Нюанс с регистром
Важно помнить, что e, pi и infinity можно писать в любом регистре (PI, InFiNiTy), но для NaN регистр строго зафиксирован спецификацией именно в таком виде.
2. JavaScript modules in workers
Теперь веб-воркеры (Web Workers) и сервис-воркеры (Service Workers) могут напрямую импортировать и использовать JavaScript-модули — то есть файлы с синтаксисом import/export.
Пример: Вы хотите вынести вычисления (например, обработку изображений или шифрование) в отдельный воркер, но при этом использовать общие утилиты, написанные как ES-модули.
// main.js
const worker = new Worker('./worker.js', { type: 'module' });
// worker.js
import { heavyComputation } from './utils/math.js';
self.onmessage = (event) => {
const result = heavyComputation(event.data);
self.postMessage(result);
};
Cинтаксис (import, export) — работает так же, как в основном потоке. Можно импортировать именованные экспорты, дефолтные экспорты, даже динамические импорты (import()).
Поддержка современных инструментов сборки — Vite, Webpack, Rollup и другие корректно обрабатывают модульные воркеры, если указан флаг { type: 'module' }.
Изоляция и производительность — модули загружаются один раз, кэшируются и не дублируются.
Практика: разделение логики между основным потоком и воркером
Вы можете писать бизнес-логику один раз и использовать её как в UI, так и в воркере:
// shared/crypto.js
export function sha256(buffer) {
return crypto.subtle.digest('SHA-256', buffer);
}
// main.js
import { sha256 } from './shared/crypto.js'; // используется в UI
// worker.js
import { sha256 } from './shared/crypto.js'; // используется в воркере
Практика: динамическая загрузка модулей в воркере
Если модуль нужен только при определённых условиях, можно использовать динамический импорт:
// worker.js
self.onmessage = async (event) => {
if (event.data.type === 'process-image') {
const { processImage } = await import('./image-processor.js');
const result = await processImage(event.data.image);
self.postMessage(result);
}
};
Примечание: Чтобы создать модульный воркер, обязательно указывайте { type: 'module' } в конструкторе:
// ❌ Не сработает как модуль
new Worker('worker.js');
// ✅ Правильно
new Worker('worker.js', { type: 'module' });
3. window.print()
Если вам странно видеть window.print() в Baseline, то вы не одиноки. Так как я в начале подумал, что это шутка, но пошёл узнавать, что там с window.print произошло.
Оказалось что метод заработал в Firefox для Andorid лишь в 144 версии, выпущенной в 06.06.2023. В остальных браузерах данная функциональность работает с первых версий браузеров.
Так как формат предполгает краткое описание фичи, я всё же это сделаю.
Метод window.print() позволяет программно инициировать диалог печати прямо из JavaScript — без участия пользователя.
Пример: Пользователь оформляет заказ в интернет-магазине и хочет сразу распечатать подтверждение. Вместо того чтобы просить его вручную нажимать Ctrl+P, вы вызываете window.print() — и браузер открывает стандартное окно печати с предварительным просмотром.
<button onclick="printReceipt()">Распечатать чек</button>
<script>
function printReceipt() {
// Можно предварительно подготовить страницу (скрыть ненужные элементы)
document.body.classList.add('print-mode');
// Запускаем печать
window.print();
// После печати (или отмены) убираем класс
document.body.classList.remove('print-mode');
}
</script>
<style>
/* Скрыть кнопку и рекламу при печати */
@media print {
.no-print, button {
display: none !important;
}
body.print-mode {
/* Дополнительные стили только во время подготовки к печати */
}
}
</style>
Следующий выпуск будет через месяц. До встречи!