Одним из самых критичных изменений стала полная переработка системы экспорта. В версии 1.x часто использовался импорт по умолчанию:
import dateFns from 'date-fns'
dateFns.addDays(new Date(), 1)
В 2.x такой подход удалён. Библиотека перешла к явным именованным импортам, что улучшило tree-shaking и уменьшило размер бандла.
import { addDays } from 'date-fns'
addDays(new Date(), 1)
Следствие перехода:
В 2.x библиотека перестроена вокруг ES Modules, даже если проект использует CommonJS.
const format = require('date-fns/format')
const { format } = require('date-fns')
или при ESM:
import { format } from 'date-fns'
Особенность:
date-fns/format) считаются
нежелательнымиЛокализация стала строго модульной. В 1.x локали могли подтягиваться более «свободно», что приводило к избыточному бандлу.
В 2.x каждая локаль импортируется явно:
import { format } from 'date-fns'
import { ru } from 'date-fns/locale'
format(new Date(), 'PPP', { locale: ru })
Ключевые изменения:
Вторая версия усилила предсказуемость API и убрала ряд неявных преобразований.
Некорректные строки теперь чаще приводят к
Invalid Date:
import { parse } from 'date-fns'
parse('2020-13-40', 'yyyy-MM-dd', new Date())
// Invalid Date
Ранее поведение могло быть менее детерминированным.
Функции стали более строгими в отношении аргументов:
import { addDays } from 'date-fns'
addDays('2020-01-01', 1)
// нежелательное поведение в v2
Ожидается передача Date-объекта:
addDays(new Date('2020-01-01'), 1)
Часть возможностей была вынесена в отдельные пакеты, чтобы ядро оставалось минимальным.
Пример:
date-fns-tzimport { format } from 'date-fns'
import { utcToZonedTime } from 'date-fns-tz'
Функция format осталась ключевой, но стала более
предсказуемой.
import { format } from 'date-fns'
format(new Date(2020, 0, 1), 'yyyy-MM-dd')
Особенности v2:
FP (functional programming) стиль был переработан.
В 1.x:
import addDays from 'date-fns/fp/addDays'
В 2.x структура стала более консистентной, но требует аккуратного использования каррирования:
import { addDays } from 'date-fns/fp'
const addOneDay = addDays(1)
addOneDay(new Date())
Изменения:
Переход на 2.x значительно повлиял на оптимизацию бандлов.
Причины:
Пример эффекта:
import { format, addDays } from 'date-fns'
Включает только используемые модули, без лишних зависимостей.
Функции стали более атомарными:
import { addMonths, subDays } from 'date-fns'
const date = addMonths(new Date(), 2)
const result = subDays(date, 10)
import dateFns from 'date-fns'
Решение:
import { format } from 'date-fns'
import ru from 'date-fns/locale/ru'
В v2:
import { ru } from 'date-fns/locale'
addDays('2021-01-01', 5)
Исправление:
addDays(new Date('2021-01-01'), 5)
Вторая версия улучшила поддержку типов:
any-зонПример:
import { format } from 'date-fns'
const result: string = format(new Date(), 'yyyy-MM-dd')
Функции сравнения стали более предсказуемыми:
import { isBefore } from 'date-fns'
isBefore(new Date(2020, 1, 1), new Date(2021, 1, 1))
Основной принцип:
DateСтруктурный подход к переходу:
Datedate-fns-tz при необходимости таймзонВерсия 2.x усилила несколько принципов:
Эта архитектура делает использование более строгим, но повышает стабильность поведения в крупных приложениях и сборках с оптимизацией.