Библиотека js-joda разрабатывалась как кроссплатформенное решение для работы с датой и временем в экосистеме JavaScript. Архитектура библиотеки позволяет использовать единый API как в браузере, так и в серверной среде Node.js. Это особенно важно для приложений, где логика обработки времени должна одинаково работать на клиенте и сервере.
Поддержка различных платформ основана на нескольких принципах:
Date;Современные версии Node.js полностью поддерживают библиотеку без дополнительных настроек. Основное требование — наличие поддержки ES2015+.
Практически это означает:
| Версия Node.js | Поддержка |
|---|---|
| Node.js 18+ | Полная |
| Node.js 16 | Полная |
| Node.js 14 | Полная |
| Node.js 12 | Ограниченно |
| Node.js < 10 | Не рекомендуется |
Для актуальных проектов рекомендуется использовать LTS-версии Node.js.
npm install @js-joda/core
yarn add @js-joda/core
Для старых проектов Node.js применяется синтаксис CommonJS:
const { LocalDate } = require('@js-joda/core');
const date = LocalDate.now();
console.log(date.toString());
Такой формат часто используется в:
Современные приложения используют ESM-синтаксис:
import { LocalDate } from '@js-joda/core';
const date = LocalDate.now();
console.log(date.toString());
Для включения ESM в Node.js необходимо:
{
"type": "module"
}
в файле package.json.
Библиотека хорошо интегрируется с TypeScript.
Пример:
import { LocalDate } from '@js-joda/core';
const date: LocalDate = LocalDate.now();
console.log(date.year());
Преимущества использования TypeScript:
Библиотека работает практически во всех современных браузерах:
| Браузер | Поддержка |
|---|---|
| Chrome | Полная |
| Firefox | Полная |
| Safari | Полная |
| Edge | Полная |
| Opera | Полная |
Поддержка обеспечивается благодаря использованию стандартов ES2015.
Некоторые старые браузеры требуют полифиллы:
| Браузер | Особенности |
|---|---|
| Internet Explorer 11 | Требуются полифиллы |
| Старые Android WebView | Возможны ограничения |
| Safari 9 | Частичная поддержка |
Основные проблемы старых браузеров:
Symbol;Map;Set;Для совместимости со старыми браузерами применяется Babel.
Пример конфигурации:
npm install --save-dev @babel/core @babel/preset-env babel-loader
Конфигурация:
{
"presets": [
[
"@babel/preset-env",
{
"targets": {
"ie": "11"
}
}
]
]
}
Чаще всего используется библиотека core-js.
Установка:
npm install core-js
Подключение:
import 'core-js/stable';
Библиотеку можно подключать напрямую через
<script>:
<script src="https://unpkg.com/@js-joda/core/dist/js-joda.min.js"></script>
После подключения API становится доступным глобально:
<script>
const date = JSJoda.LocalDate.now();
console.log(date.toString());
</script>
Такой подход подходит для:
Пример установки:
npm install webpack webpack-cli --save-dev
Импорт:
import { ZonedDateTime } from '@js-joda/core';
Webpack корректно обрабатывает библиотеку без специальных loader-настроек.
Vite полностью совместим с js-joda.
Пример:
import { LocalTime } from '@js-joda/core';
console.log(LocalTime.now().toString());
Дополнительная конфигурация обычно не требуется.
Пример подключения:
import resolve from '@rollup/plugin-node-resolve';
export default {
input: 'src/main.js',
output: {
file: 'bundle.js',
format: 'esm'
},
plugins: [resolve()]
};
Архитектура библиотеки поддерживает tree shaking.
Это означает:
Пример:
import { LocalDate } from '@js-joda/core';
В bundle не будут включены:
ZonedDateTime;Period;Duration;Размер зависит от:
Примерная оценка:
| Модуль | Размер |
|---|---|
| @js-joda/core | Небольшой |
| @js-joda/timezone | Средний |
| locale-модули | Дополнительно |
Модуль временных зон значительно увеличивает размер сборки, поскольку содержит данные TZDB.
Пакет @js-joda/core не содержит полной базы временных
зон.
Для работы с timezone используется:
npm install @js-joda/timezone
import '@js-joda/timezone';
import { ZonedDateTime, ZoneId } from '@js-joda/core';
const zoned = ZonedDateTime.now(
ZoneId.of('Europe/Berlin')
);
console.log(zoned.toString());
В браузере требуется подключение timezone-модуля:
import '@js-joda/timezone';
Без этого:
ZoneId.of('Europe/Berlin');
может вызвать ошибку отсутствия данных временной зоны.
Библиотека может использовать возможности встроенного
Intl.
Поддержка зависит от среды:
| Среда | Intl |
|---|---|
| Современные браузеры | Да |
| Node.js 18+ | Да |
| Старые браузеры | Частично |
Библиотека хорошо подходит для SSR-фреймворков:
Причины:
Пример:
import { LocalDate } from '@js-joda/core';
function App() {
const today = LocalDate.now();
return <div>{today.toString()}</div>;
}
import { LocalDateTime } from '@js-joda/core';
export default {
setup() {
const now = LocalDateTime.now();
return { now };
}
};
import { Component } from '@angular/core';
import { LocalDate } from '@js-joda/core';
@Component({
selector: 'app-root',
template: `{{ date }}`
})
export class AppComponent {
date = LocalDate.now().toString();
}
Библиотека может работать и в Deno, однако поддержка зависит от способа импорта.
Пример:
import { LocalDate } from "npm:@js-joda/core";
console.log(LocalDate.now().toString());
Bun также поддерживает библиотеку:
import { Instant } from '@js-joda/core';
console.log(Instant.now().toString());
Частая проблема — смешивание API Date и js-joda:
const jsDate = new Date();
и:
const localDate = LocalDate.now();
имеют принципиально разные модели времени.
Некоторые различия могут возникать из-за:
Intl.Для корректной интернационализации иногда требуется full-icu.
Проверка:
console.log(Intl.DateTimeFormat.supportedLocalesOf(['ru']));
Запуск с full-icu:
node --icu-data-dir=node_modules/full-icu app.js
Многие проекты постепенно мигрируют с CommonJS на ESM. js-joda поддерживает оба формата, что облегчает миграцию.
Возможны сценарии:
| Формат проекта | Поддержка |
|---|---|
| CommonJS | Да |
| ES Modules | Да |
| Mixed mode | Ограниченно |
const module = await import('@js-joda/core');
const date = module.LocalDate.now();
console.log(date.toString());
Такой подход полезен для:
Библиотека работает внутри Web Workers без ограничений:
import { Instant } from '@js-joda/core';
postMessage(Instant.now().toString());
Electron полностью поддерживает js-joda как в:
Производительность зависит от:
Обычно наиболее высокая производительность наблюдается в:
| Среда | Производительность |
|---|---|
| Node.js (V8) | Высокая |
| Chrome | Высокая |
| Firefox | Средняя |
| Safari | Средняя |
Объекты js-joda удобно отображаются в DevTools:
console.log(LocalDate.now());
Вывод:
2026-05-24
Сериализация работает одинаково в браузере и Node.js:
const date = LocalDate.now();
JSON.stringify({
date: date.toString()
});
Результат:
{
"date": "2026-05-24"
}
app.get('/api/date', (req, res) => {
res.json({
now: Instant.now().toString()
});
});
fetch('/api/date')
.then(r => r.json())
.then(data => {
console.log(data.now);
});
Рекомендуемая конфигурация:
Необходимы:
Пример базовой проверки:
function supportsJsJoda() {
return (
typeof Map !== 'undefined' &&
typeof Set !== 'undefined' &&
typeof Symbol !== 'undefined'
);
}
js-joda особенно хорошо подходит для изоморфных приложений, где один и тот же код выполняется:
Пример общей модели:
export function createDate() {
return LocalDate.now();
}
Функция может одинаково использоваться: