Как стать автором
Обновить

Комментарии 32

На замену moment автор написал luxon. moment имеет свойство мутировать объекта там где этого совсем не ждёшь

Если потратить 15 минут на чтение документации, поведение сразу становится ожидаемым и мутирует он именно там где это описано https://momentjs.com/docs/

Но никакое чтение документации не упростит использование библиотеки там, где требуются неизменяемые объекты. А это Knockout, React, Mobx, Svelte, возможно даже Angular, даже $mol...

Упростит, если вы прочитаете про метод clone и будете его использовать там, где необходима иммутабельность при вызове изменяющих объект методов
momentjscom.readthedocs.io/en/latest/moment/01-parsing/12-moment-clone

В том-то и дело, что при работе с moment в перечисленных мною фреймворках и библиотеках писать clone приходится каждый раз, и если забыть это сделать — будет трудноуловимая ошибка. А в luxon получается на один clone меньше.

Не благодарите

const mutableMethods = ['startOf', 'endOf', 'add', 'subtract'] 
const immutableMethods = ['clone']
   
const ignore = Symbol('ignore')
const immutableAPI = [
  ...mutableMethods.map(name => 
    [name, function (...args) {
       this[name + '_ORIGINAL_'](...args)
       return this.clone()
    }]
  ),
  
  ...immutableMethods.map(name => 
    [name, function (...args) { 
       return immuteMe(this[name + '_ORIGINAL_'](...args))
    }]
  ),
]

const immuteMe = object => {
   for (const [name, fn] of immutableAPI) {
     object[name + '_ORIGINAL_'] = object[name]
     object[name] = fn.bind(object)   
   }
   return object
}

// Вызываем вместо moment
export const immutableMoment = param => immuteMe(moment(param))  

// Тесты
let today = moment()
console.log('normal: ', today === today.startOf('day')) // true

today = immutableMoment()
console.log('immutable: ', today === today.startOf('day')) // false

И в итоге получаем нечто, что работает не так как написано в документации, зато медленно? Не проще ли luxon взять?

Ну естественно копирование объектов будет работать медленнее, чем мутабельные объекты. Это же просто априори.

Ну мне например не проще взять luxon, поскольку к методам moment я привык, мне проще было написать несколько строк кода. Но я почитаю про luxon, спасибо.

Тут проблема не в самом копировании, а в том как вы переопределяете у объекта все методы. Хоть бы прототип подменяли! (хотя эта операция тоже не самая быстрая)

То есть вы считаете, что подмена нескольких методов дороже по производительности чем копирование всего объекта? Интересный и очень оригинальный взгляд на вещи. Я вас удивлю: код где мы создаем объект и вызываем startOf будет работать примерно в два раза дольше (что по правде говоря не критично, на 100 000 вызовов это полсекунды на каком нибудь среднем компьютере). Из них 30% увеличения будет на совести копирования методов и 70% на совести иммутабельности.

Прототипом у создаваемого через moment() объекта является класс, используемый moment-ом, подмена в нем методов крайне не рекомендуется методологически. По хорошему можно унаследовать класс и делать на нем, но если проигрыш во времени копеечный (2 десятых секунды на 100 000 созданий и вызовов метода) — можно и так оставить.

"Весь объект" — это всего-то 11 приватных свойств. А подменить вам надо около 30 методов. Плюс вы зачем-то сохраняете оригинальные методы в объекте, а не в замыкании, отсюда ещё двухкратное увеличение их числа. 60 значительно больше 11, так что да — затраты на подмену методов, по моей оценке, превосходят затраты на клонирование объекта.


Кстати, в luxon используется всего 6 приватных свойств.

Тем более если копирование написано неоптимально, значит его можно переписать так, чтобы потеря производительности была еще незаметней. Про подмену 30 методов я не очень понял. Зачем вам мутабельность при каждом методе? Понимаю те 4 что я упомянул плюс clone, остальные то зачем подменять? Окей, спасибо за беседу.

Ну а что ещё делать с setXXX-методами? Оставлять как есть что ли? Запрещать использовать?

moment().hours(20).minutes(0).seconds(0)


Возможен же такой код? Если при вызове каждого метода объект будет копироваться, это будет странно. Я бы подменил только сам set, но это все дело вкуса. Смысл был показать, что приспособить moment под иммутабельность недолго и не критичные потери производительности. 100% полагаю для программирования ничто.
Тогда я бы рекомендовал date-fns
Лично я считаю что экспортирование отдельных функций вместо полноценных классов это не удачный дизайн для большинства библиотек и соответственно date-fns не рекомендую.

В погоне за уменьшением размеров бандла библиотека с набором отдельных функций выглядит привлекательней монолитного класса. Особенно, когда в проекте просто необходимо форматнуть пару дат, пришедших с бэкенда. Именно размер заставил меня отвернуться от moment в сторону date-fns

date-fns — это функциональный подход. Классы не наше всё.
Скриншоты, конечно, супер-информативны. Впрочем, как и описание.
<s>Вау, Express, даже и не знал, что такое есть...</s>
Начал изучать Express и отталкивает простота создание серверной части. У меня вечно такое чуство что я пишу максимально глупо и неправильно, может кто посоветовать где можно почитать про лучшие техники в создании api с использованием node.js + express.js. Вот серьезно, после ангуляра это кажется слишком просто. В своё время изучал Laravel и там не было так просто, как в node.js, тоже свои сложности и нюансы, хорошая документация, которая показывает как лучше сделать то или иную фичу

Посмотрите в сторону nest.js.

Просто Express не сравнить по функциональности с php-шными фреймворками, поэтому все проще
Moment — это компактная JavaScript-библиотека

Ha-ha


Добавьте в следующий такой же обзор luxon и date-fns.

Почему хаха? Типа не компактная?
Я бы написал как ha-Ha… с намеком на все локали в momentjs, которые не вырезать и все они упаковываются в итоговый бандл

Локали можно вырезать, это не сложно

Заходил в ожидании новых, свежих, набирающих популярность библиотек. Получил список того что и 5 лет назад было, про Express так вообще.

может и не в тему, но: typescript, ts-node, webpack, mocha

Что тут есть из 2020? Всё это было и в 2017.

Встроенный мидлвар express.json() базируется на body-parser, его не нужно ставить отдельно

Интересное наблюдение. Если в 2008 русские ребята писали сами качественные статьи и ревьювили код индусских программистов, то в 2020 переводят статьи с английского языка, написанные индусами.

Зарегистрируйтесь на Хабре, чтобы оставить комментарий