avatar
Published on

์™œ moment ๋Š” deprecated ๋˜์—ˆ์„๊นŒ

Author
  • avatar
    Name
    yceffort

Datetime์„ ๋‹ค๋ฃจ๋Š” ๊ฒƒ์€ ๋ถ„๋ช… ์‰ฌ์šด ์ผ์€ ์•„๋‹ˆ๋‹ค. ํ•œ์ฐธ vanilla ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ์— ์ทจํ•ด ์žˆ์„ ๋•Œ, least library challenge(?)์˜ ์ผํ™˜์œผ๋กœ datetime์„ ๋‚ด์žฌํ™” ํ•ด์„œ ๊ด€๋ฆฌํ•˜๊ณค ํ–ˆ์ง€๋งŒ ์ด๋Š” ๋ถ„๋ช… ์–ด๋ ค์šด ์ผ์ด์—ˆ๋‹ค. ๊ทธ ๋•Œ ๋งˆ๋‹ค ๊ฒฐ๊ตญ ๊ฐ€์žฅ ์ต์ˆ™ํ•œ moment๋กœ ๋Œ์•„์™€์„œ ํ•˜๊ณค ํ–ˆ๋Š”๋ฐ, ์–ธ์  ๊ฐ€ bundle ๋ถ„์„์„ ํ•œ ๋’ค๋กœ moment์— ๋Œ€ํ•œ ์‚ฌ์šฉ์„ ์กฐ๊ธˆ ๊บผ๋ฆฌ๊ธฐ ์‹œ์ž‘ํ–ˆ๋‹ค. moment๋Š” ๋‚ด๊ฐ€ ์“ฐ๋Š” ๊ธฐ๋Šฅ ๋Œ€๋น„ ์ •๋ง ํฐ ์šฉ๋Ÿ‰์„ ์ฐจ์ง€ํ•˜๊ณ  ์žˆ์—ˆ๋‹ค. (timezone์„ ์ œ์™ธ ํ•˜๋”๋ผ๋„) ๋ถ„๋ช… ๋‚ด๊ฐ€ moment์˜ ์ข‹์€ ๊ธฐ๋Šฅ์„ ์‰ฝ๊ฒŒ ์‚ฌ์šฉํ•˜๋Š” ๋ฉด๋„ ์žˆ์—ˆ์ง€๋งŒ, ์กฐ๊ธˆ์ด๋ผ๋„ ๋” ๋น ๋ฅธ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์„ ์‚ฌ์šฉํ•˜๊ธฐ ์œ„ํ•ด์„œ๋Š” moment ์™ธ์— ๋‹ค๋ฅธ ๋Œ€์•ˆ์ด ํ•„์š”ํ–ˆ๋‹ค.

๊ทธ๋Ÿฌ๋˜ ์ค‘, moment ๊ฐ€ deprecated ๋œ๋‹ค๋Š” ์†Œ์‹์„ ์•Œ๋ ค์™”๋‹ค.

... The modern web looks much different these days. Moment has evolved somewhat over the years, but it has essentially the same design as it did when it was created in 2011. Given how many projects depend on it, we choose to prioritize stability over new features.

์กฐ๊ธˆ ๋งŽ์ด ๋’ท๋ถ์ด๊ธด ํ•˜์ง€๋งŒ, ์™œ moment๊ฐ€ ์—ญ์‚ฌ ์†์œผ๋กœ ์‚ฌ๋ผ์กŒ๋Š”์ง€ ๋ช‡๊ฐ€์ง€ ์ด์œ ๋ฅผ ์งš๊ณ  ๋„˜์–ด๊ฐ€๊ณ ์ž ํ•œ๋‹ค.

1. ๋Š๋ฆฌ๋‹ค

๋‹จ๋„์ง์ž…์ ์œผ๋กœ ๊ทธ๋ž˜ํ”„๋ฅผ ํ†ตํ•ด์„œ ์•Œ์ˆ˜ ์žˆ๋‹ค. ๋‹ค๋ฅธ datetime library ๋Œ€๋น„ ์†๋„๊ฐ€ ๋งŽ์ด ๋Š๋ ธ๋‹ค.

https://raygun.com/blog/wp-content/uploads/2017/09/image4-2.png

https://raygun.com/blog/wp-content/uploads/2017/09/image3.png

https://raygun.com/blog/wp-content/uploads/2017/09/image1.png

์ถœ์ฒ˜: https://raygun.com/blog/moment-js-vs-date-fns/

๋ญ ์—ฌ๋Ÿฌ๊ฐ€์ง€ ์ด์œ ๊ฐ€ ์žˆ๊ฒ ์ง€๋งŒ, regex๋ฅผ ์ฃผ๋กœ ์“ฐ๋Š” moment์— ๋Œ€๋น„ ๋‹ค๋ฅธ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋“ค์€ Z๋กœ ๋๋‚˜๋ฉด new Date(string)์„ ์“ด๋‹ค๋˜์ง€, ํ˜น์€ ๋Š๋ฆฐ regex ๋Œ€์‹ ์— ์ž์ฒด์ ์œผ๋กœ ๊ฐœ๋ฐœํ•œ(?) if ์™€ charAt ๋“ฑ์„ ์“ด๋‹ค๋˜์ง€ ๋‹ค์–‘ํ•œ ๋…ธ๋ ฅ๋“ค์„ ํ•˜๊ณ  ์žˆ์—ˆ๋‹ค. regex๋ฅผ ํŒŒ์‹ฑํ•ด์„œ ์ดํ•ดํ•˜๋Š” ์ž‘์—…์€ ํ™•์‹คํžˆ ๋Š๋ฆฌ๋‹ค.

2. ๋ฌด๊ฒ๋‹ค

size-of-datetime-libraries

์ถœ์ฒ˜: https://inventi.studio/en/blog/why-you-shouldnt-use-moment-js

https://github.com/jmblog/how-to-optimize-momentjs-with-webpack

๊ธฐ๋ณธ์ ์œผ๋กœ momentjs๋Š” 232kb, (gzip์‹œ 66kb) ์ด๋ฉฐ, webpack์œผ๋กœ locale์„ ์ œ๊ฑฐํ•  ๊ฒฝ์šฐ ์‚ฌ์ด์ฆˆ๋Š” 68kb (gzip์‹œ 23kb) ๊นŒ์ง€ ๋–จ์–ด์ง„๋‹ค. ๊ทธ๋ฆฌ๊ณ  ๋” ์ด์ƒ์˜ tree shaking์€ ๋ถˆ๊ฐ€๋Šฅํ•˜๋‹ค. js-joda๊ฐ€ ์ œ๋ฒ• ํฌ๊ธด ํ•˜์ง€๋งŒ ๊ธฐ๊ฐ„๊ณผ ํƒ€์ž„์กด๊นŒ์ง€ ๊ธฐ๋ณธ์œผ๋กœ ์ œ๊ณตํ•˜๋Š” ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋ผ๋Š” ๊ฒƒ์„ ์•Œ์•„๋‘ฌ์•ผ ํ•œ๋‹ค. ๊ทธ๋ฆฌ๊ณ  ๋‚˜๋จธ์ง€ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋“ค์€ ํŠธ๋ฆฌ์‰์ดํ‚น์ด ๊ฐ€๋Šฅํ•˜๋‹ค.

3.mutable์ด๋‹ค.

์ด๋Š” moment ๊ณต์‹ ๊ฐ€์ด๋“œ์—์„œ๋„ ์–ธ๊ธ‰ํ•œ ๋ฌธ์ œ๋‹ค.

As an example, consider that Moment objects are mutable. This is a common source of complaints about Moment. We address it in our usage guidance but it still comes as a surprise to most new users. Changing Moment to be immutable would be a breaking change for every one of the projects that use it. Creating a "Moment v3" that was immutable would be a tremendous undertaking and would make Moment a different library entirely. Since this has already been accomplished in other libraries, we feel that it is more important to retain the mutable API.

https://inventi.studio/en/blog/why-you-shouldnt-use-moment-js

const startedAt = moment()
const endedAt = startedAt.add(1, 'year')

console.log(startedAt) // > 2020-02-09T13:39:07+01:00
console.log(endedAt) // > 2020-02-09T13:39:07+01:00

moment๋ฅผ ์กฐ์ž‘ํ•˜๋Š” ๋ชจ๋“  method ๋“ค์€ ๋ฆฌํ„ด ๊ฐ’๊ณผ ์ฐธ์กฐ๊ฐ’ ๋ชจ๋‘๋ฅผ ๋ฐ”๊ฟ” ๋ฒ„๋ฆฌ๊ธฐ ๋•Œ๋ฌธ์—, ์—๋Ÿฌ๋ฅผ ๋งŒ๋“ค ์†Œ์ง€๊ฐ€ ๋†’๋‹ค.

4. ๋””๋ฒ„๊น…์ด ์–ด๋ ต๋‹ค.

moment์•ˆ์— ํŒŒ๋ผ๋ฏธํ„ฐ๋ฅผ ๋„ฃ๋Š” ๊ฒƒ์€ ์ข‹์€ ์•„์ด๋””์–ด์ด๊ธดํ•˜์ง€๋งŒ, ๊ทธ ์•ˆ์— ๋”ฐ๋ผ์„œ ๋™์ž‘์ด ๋งค์šฐ ์ผ๊ด€์ ์ด์ง€ ๋ชปํ•˜๋‹ค. ์˜ˆ๋ฅผ ๋“ค์–ด, moment ์•ˆ์— ์ž˜๋ชป๋œ ๊ฐ’์„ ๋„ฃ์—ˆ์„ ๊ฒฝ์šฐ ์—๋Ÿฌ๊ฐ€ ๋‚˜๋Š”๊ฒŒ ์•„๋‹ˆ๋ผ ๊ทธ๋ƒฅ ํ˜„์žฌ ์‹œ๊ฐ„์ด ๋‚˜์™€๋ฒ„๋ฆด ์ˆ˜๋„ ์žˆ๋‹ค.

moment().format() // > 2019-02-08T17:07:22+01:00
moment(undefined).format() // > 2019-02-08T17:07:22+01:00
moment(null).format() // > Invalid date
moment({}).format() // > 2019-02-08T17:07:22+01:00
moment('').format() // > Invalid date
moment([]).format() // > 2019-02-08T17:07:22+01:00
moment(NaN).format() // > Invalid date
moment(0).format() // > 1970-01-01T01:00:00+01

์š”์•ฝํ•˜์ž๋ฉด, undefined๋Š” ๊ฐ€๋Šฅํ•˜์ง€๋งŒ, null '', NaN์€ ์•ˆ๋œ๋‹ค.

๊ฒฐ๊ตญ

lighthouse์—์„œ๋„ ์—๋Ÿฌ๊ฐ€ ๋œจ๊ณ 

https://pbs.twimg.com/media/EhM0XE3UwAA2Co5?format=jpg&name=medium

https://twitter.com/addyosmani/status/1304676118822174721

moment๋ฅผ ์ตœ์ ํ™” ํ•˜๋Š” ๋ฐฉ๋ฒ•๊นŒ์ง€๋„ ์•Œ๋ ค์ง€๊ธฐ ์‹œ์ž‘ํ–ˆ๋‹ค.

https://github.com/GoogleChromeLabs/webpack-libs-optimizations#moment

๋Œ€์•ˆ

์‚ฌ์ด์ฆˆ๊ฐ€ ์ค‘์š”ํ•œ ํ”„๋ก ํŠธ์—”๋“œ์˜ ๊ฒฝ์šฐ date-fns๋‚˜ day.js๊ฐ€ ์ข‹๋‹ค. ๊ทธ ์™ธ์˜ ๊ฒฝ์šฐ์—๋Š” ๊ธฐ๋Šฅ์ด ๊ฐ€์žฅ ๋ฆฌ์น˜ํ•œ js-joda๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ๊ฒƒ์ด ์ข‹๋‹ค.

sizesize(gzip)speed(to)tree-shakingimmutablethrow errortimezone
moment232/6866/2616.527XXXO
day.js639.129XOXX
luxon641815.406XOOO
js-joda2083911.397XOOO
date-fns3075.175OOXX
native1.297XXX

์ถœ์ฒ˜: https://inventi.studio/en/blog/why-you-shouldnt-use-moment-js#fnref2

๊ทธ๋Ÿผ์—๋„, ์ €๋ ‡๊ฒŒ ํฐ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ ์ž์ฒด๋ฅผ deprecated ์‹œํ‚ฌ ์ˆ˜ ์žˆ๋‹ค๋Š” ๊ฒƒ ๋งŒ์œผ๋กœ๋„ ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ ์ƒํƒœ๊ณ„๊ฐ€ ๊ฑด๊ฐ•ํ•˜๊ฒŒ ๋‚˜์•„๊ฐ€๊ณ  ์žˆ๋‹ค๋Š” ๋ฐฉ์ฆ์ธ ๊ฒƒ ๊ฐ™๋‹ค. ์—ฌ์ „ํžˆ, ๋งŽ์€ ์ˆ˜์˜ ํ”„๋กœ์ ํŠธ๊ฐ€ moment์— ์˜์กดํ•˜๊ณ  ๋˜ ๊ทธ ํŽธ๋ฆฌํ•จ์— ๋งŽ์€ ๋„์›€์„ ์–ป์—ˆ๋‹ค. moment๊ฐ€ ์ด์•ผ๊ธฐ ํ•œ modern web looks much different these days ์ฒ˜๋Ÿผ, ์ด์ œ๋Š” ๋‹ค๋ฅธ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋ฅผ ์“ธ ๋•Œ๊ฐ€ ์™”๋‹ค. ๊ทธ๋ฆฌ๊ณ  ๋‚˜ ๋˜ํ•œ, ์˜ค๋ž˜๋˜๊ณ  ๋‚ก์€ ์ฝ”๋“œ๋ฅผ ๊ณผ๊ฐํ•˜๊ฒŒ deprecated ์‹œํ‚ฌ ์šฉ๊ธฐ๊ฐ€ ํ•„์š”ํ•˜๋‹ค.