Pull to refresh

Comments 18

Ну и как тут не вспомнить что есть еще и вторая по популярности библиотека – date-fns.org

Отличается от moment и luxon тем, что в ней используются не объекты-обертки, а чистые функции, работающие с нативным Date.

Не вижу ничего непонятного в этом имени. И в Moment, и в нативном Intl.DateTimeFormat тоже есть метод format.


Более того, с date-fns вы получаете просто набор функций, которые можно переименовать при импорте по своему желанию.


import {format as formatDateByPattern} from 'date-fns';

formatDateByPattern(new Date(2014, 1, 11), 'MM/DD/YYYY');
А главное — не настолько жирная, как momentjs.
moment.min.js = 53КБ (2.24.0)
date_fns.min.js = 70КБ (1.30.1)

Речь не про абсолютный размер, а про то что momentjs – это монолит, у вас всегда будет 50Кб, даже если вы используете только 10% API.


Date-fns модульный, берем только отдельные фукнции. Например, мы можем взять startOfWeek, и в бандл попадет только она (600 байт кода). А при использовании startOf('week') из moment, в бандле окажутся все те же 53 Кб целиком.

Авторы молодцы. Не стали дожидаться пока люди сделают библиотеку-конкурента и взяли быка за рога.

Да 4 года назад уже сделали.


  • Имеет всё те же преимущества, что и Luxon. Даже больше: offset является объектом duration, а не просто числом; интервалы могут задаваться не только двумя датами, но и одной из дат + продолжительность, и всё это правильно сериализуется в ISO, а не в какой-то свой формат с открытыми интервалами; везде, где ожидается момент/интервал/продолжительность может передаваться как объект, так и json с компонентами, так и iso8601 представление.
  • Разработана за два месяца одним разработчиком, а не два года шестью.
  • Весит 20кб в неминифицированном виде, а не 60 в минифицированном.
  • По скорости на порядок быстрее Moment, сомневаюсь, что Luxon сильно быстрее.

Но кому это всё надо? Никому, там же всего полторы сотни звёздочек.

API Luxon намного больше той части, что приведена в статье.

  • Для создания интервалов есть несколько разных методов в том числе Interval.after и Interval.before, которые принимают два параметра: дату и продолжительность
  • Сериализовать интервал в ISO можно выполнив один метод interval.toISO()
  • У Luxon есть методы, которые так же могут принимать разные типы данных — вот, к примеру, описание метода Interval.after:
    Interval.after(start: DateTime | Date | Object, duration: Duration | Object | number): Interval

В документации много еще всего есть, если, конечно, интересно.
API Luxon намного больше

А API $mol_time намного меньше, при той же выразительности.


Для создания интервалов есть несколько разных методов

Которые сразу же забывают про переданную продолжительность.


интервал в ISO можно

Только вот это уже будет не тот интервал, что мы создавали. В ISO их 3 вида. И это именно разные сущности с разной семантикой, а не просто 3 способа задать одну сущность. Разница ощущается, когда начинается арифметика, где внезапно оказывается, что месяц — это не всегда 30 дней и тп.


start: DateTime | Date | Object

Как обычно статическая типизация сделана для галочки. Вот так это должно выглядеть:


start : number | Date | string | {
    year? : number
    month? : number
    day? : number
    hour? : number
    minute? : number
    second? : number
    offset? : $mol_time_duration_config
}
Интересно было бы увидеть сравнение luxon и js-joda.

Размер luxon стоит сравнивать не только с moment+locales, но с moment+locales+moment-timezone
И вот там выигрыши получается настолько большой, что выбор очевиден. (В основном потому что в moment-timezone необходимо грузить БД с таймзонами, а в luxon используется intl API)

В moment.js до сих пор не запилили tree shaking? Как с этим дела у Luxon и date-fns?

Как я понимаю, какие то доработки по tree shaking стоят в планах для версии Luxon 2.0.

В Luxon получше чем у moment, потому что теперь есть 3 отдельные импорты DateTime, Duration, Interval, вместо одного супер-объекта moment.


У date-fns c этим дела обстоят лучше всех, потому что там экспортируются отдельные функции, как в lodash

date-fns из коробки модульный, у него всё хорошо с этим. А вот про luxon не уверен. Фича «цепочки вызовов» по-моему не совместима с tree-shaking концептуально.
Sign up to leave a comment.

Articles