浜松のWEBシステム開発・スマートフォンアプリ開発・RTK-GNSS関連の開発はお任せください
株式会社シーポイントラボ
TEL:053-543-9889
営業時間:9:00~18:00(月〜金)
住所:静岡県浜松市中区富塚町1933-1 佐鳴湖パークタウンサウス2F

【JavaScript】Moment.js の新規機能開発が停止。新規プロジェクトへの採用は非推奨へ

 Moment.js は JavaScript の日時を取り扱う便利ライブラリです。素の Date オブジェクトの扱い難い部分を補ってくれる便利屋です。
 その Moment.js が今後新機能の開発をしない。今後新たなプロジェクトで Moment.js を使用するのは推奨できない。と声明を出しました。
 

プロジェクトで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 です。

  • この記事いいね! (0)