Moment.js は JavaScript の日時を取り扱う便利ライブラリです。素の Date オブジェクトの扱い難い部分を補ってくれる便利屋です。
その Moment.js が今後新機能の開発をしない。今後新たなプロジェクトで Moment.js を使用するのは推奨できない。と声明を出しました。
Considering using Moment.js in your project?
There may be better modern alternatives.
Please see the new Project Status section of our docs.
Thank you.https://t.co/7owSQbp1Vy— Moment.js (@momentjs) September 14, 2020
プロジェクトでMoment.jsの使用を検討していますか?
もっと良い代替案があるかもしれません。
ドキュメントの新しいプロジェクト状況のセクションをご覧ください。
ありがとうございました。
詳しくはMoment.js | Docs#Project Status にあります。今後の変更はセキュリティサポートとバグ修正に留まります。この様な宣言がなされた理由は大雑把に言えば Moment.js の設計は 2011 年に作られた時のままで現代のプログラミングに合わない、とのことです。例として Moment オブジェクトが変更可能なことが挙げられています。これは短く言えば強制シングルトンな書き換え可能オブジェクトを export しているということです。動作例を挙げると次です。
あるタイミングで moment を読み込んで値を書き換えると
// boot.js // 必ず読み込まれるファイル import moment from 'moment'; moment.defaultFormat = 'YYYY年MM月DD日 hh:mm:ss';
次以降どこからどう呼んでも書き換えられた値が反映されます。
// 適当な moment 使用箇所 import moment from 'moment'; // fomat メソッドでは何もしなくても↑ファイルで定義した defaultFormat が適用される console.log(momnet('2012-03-04 12:34:56').format()) // 2012年03月04日 12:34:56
コードが短くなる、という点では便利です。一方で、不意の変更がどこかで加わった時点で処理が変化してエラーメッセージが出ないまま謎の日時表記だけが現れる、という事態を引き起こしやすくもあります。他にも Luxon のページで次の直感的でない真偽が成り立つことも示されています。
Manual | Luxon#For Moment users
var m1 = moment(); var m2 = m1.add(1, 'hours'); m1.valueOf() === m2.valueOf(); //=> true
Moment.js を新規プロジェクトで採用すべきでない、ということで今後の新規プロジェクトで採用すべき Moment.js に代わるライブラリがMoment.js | Docs#Project Statusで紹介されています。以下紹介されているライブラリの短い所感です。
- Luxon: Moment.js のコントリビュータが作成した進化版
- Day.js: ほぼ Moment.js の軽量版。雑に使った Moment.js 1/50 以下のファイルサイズ
- date-fns: Date オブジェクトを操作するライブラリ。必要な関数だけの import も可能なのでバンドルした時のサイズが超少なそう(試してない)。
- js-Joda: java.time の JavaScript 移植。Java に親しんでいる人向け。
GitHub のスター数的には dayjs > date-fns >> luxon >> js-joda です。