Библиотека date-fns построена вокруг принципа модульности: каждая функция реализована в отдельном модуле и может импортироваться независимо. Это фундаментально влияет на архитектуру подключений и размер итогового бандла в приложениях.
Основной способ использования — точечный импорт функций:
import { format, addDays, parseISO } from 'date-fns'
Такой подход удобен, но имеет важное внутреннее поведение: в зависимости от сборщика он может подтягивать больше кода, чем требуется, если не настроена корректная оптимизация tree-shaking.
Более оптимальный вариант — импорт из конкретного модуля:
import format from 'date-fns/format'
import addDays from 'date-fns/addDays'
import parseISO from 'date-fns/parseISO'
Этот стиль гарантирует, что в сборку попадёт только необходимый код без дополнительных зависимостей.
date-fns построена как набор независимых функций, каждая из которых находится в собственном файле:
date-fns/
format/
addDays/
parseISO/
differenceInDays/
Каждый модуль:
Это делает библиотеку идеальной для tree-shaking в современных сборщиках.
Tree-shaking работает эффективно только при использовании ES Modules:
import { format } from 'date-fns'
или
import format from 'date-fns/format'
Сборщики анализируют граф зависимостей и удаляют неиспользуемые части.
import * as dateFns from 'date-fns'
dateFns.format(new Date(), 'yyyy-MM-dd')
Недостатки:
import format from 'date-fns/format'
format(new Date(), 'yyyy-MM-dd')
Преимущества:
Webpack поддерживает tree-shaking при production-сборке:
module.exports = {
mode: 'production'
}
Важно:
Vite использует ESBuild и Rollup на этапе сборки:
Rollup обеспечивает наиболее агрессивный tree-shaking:
export default {
input: 'src/index.js',
output: {
format: 'esm'
}
}
import * as df from 'date-fns'
Приводит к:
import { format } from 'date-fns'
Может быть оптимален, но в некоторых конфигурациях приводит к:
const format = require('date-fns/format')
Недостатки:
Наиболее предсказуемая стратегия:
import format from 'date-fns/format'
import addDays from 'date-fns/addDays'
import differenceInDays from 'date-fns/differenceInDays'
Причины:
date-fns поддерживает импорт из подмодулей:
date-fns/format
date-fns/addDays
Это позволяет:
Размер итоговой сборки напрямую зависит от способа импорта:
| Способ импорта | Влияние на бандл |
|---|---|
| import * as | высокий |
| named import | средний |
| direct import | минимальный |
Оптимизация особенно критична в:
Для ленивой загрузки:
const { format } = await import('date-fns/format')
format(new Date(), 'yyyy-MM-dd')
Применяется в случаях:
TypeScript корректно поддерживает оба подхода:
import format from 'date-fns/format'
import { addDays } from 'date-fns'
Важно:
При масштабировании кода часто вводится единый стиль:
import * as dateFnsТакая структура обеспечивает: