概要
- Eleventyの 日付パース ライブラリ選定の経緯と課題
- Luxon依存 からの脱却とバンドルサイズ削減
- RFC 9557対応の 新ライブラリ @11ty/parse-date-strings導入
- 他の主要な日付ライブラリとの 比較検証
- 今後の Temporal API 対応を見据えた設計
Eleventyの日付パースライブラリ刷新の経緯
- 2018年に Luxon をEleventyの日付パース用ライブラリとして採用
- Luxonは Node.js専用要件 には適していたが、クライアントサイド対応やバンドルサイズが課題
- Eleventyの依存モジュール21.3MBのうち、Luxonが 4.7MB(22%) を占有
- 新しい@11ty/clientバンドルでもLuxonは 229kB/806kB(28%) と大きな割合
- EleventyでのLuxon利用範囲は DateTime.fromISO によるISO 8601パースのみ
代替ライブラリの検討
- バンドルサイズ・精度を重視し dayjs などを検証
- dayjsは小型だが テスト228件中80件で不合格、精度に難あり
- 他の候補(moment, date-fns)も総合的に不採用
- Dual publishing (ESM/CJS両対応)の必要性にも疑問
パース仕様の見直しとRFC 9557対応
- 多様な日付形式対応による 曖昧さ がトラブルの元
- ISO 8601標準は サブフォーマットが多く複雑
- 例:"200"は年200ではなく、2000-2010年のディケードを指す
- 今後は 厳格なパース仕様 に変更(設定でLuxon利用も可)
- 新しい指針として RFC 9557 (ISO 8601/RFC 3339拡張)を採用
- Temporal API(次世代JavaScript日付API)とも互換
主要日付フォーマット対応状況一覧
- RFC 9557, Luxon, ISO 8601, Date.parseの 各フォーマット対応状況
- 例:YYYY-MM-DDTHH:II:SS.SSS、ミリ秒・マイクロ秒・ナノ秒精度など
- RFC 9557が最も 幅広い形式 に対応
新ライブラリ@11ty/parse-date-stringsの導入
- RFC 9557互換の パース専用小型ライブラリ
- ESM形式、6.69kB(バンドル2.3kB) と超軽量
- @11ty/clientバンドルで約 230kB削減、@11ty/eleventyのnode_modulesも 21.3MB→16.6MB に減量
- 今後の Temporal API移行 もスムーズに
他の注目日付ライブラリ・Temporalポリフィル
- @js-temporal/polyfill:2.98MB(186.5kB min)
- temporal-polyfill:551kB(56.3kB min)
- @formkit/tempo:501kB(17.3kB min)
- それぞれ特徴と用途に応じて選択肢
まとめ
- Eleventyでは 日付パースの精度・軽量化・将来性 を重視し、独自ライブラリへ移行
- RFC 9557および Temporal API時代 を見据えた設計
- 他プロジェクトでも 日付パース要件 の見直しやライブラリ選定の参考事例
最近、医療の現場で誕生日を保存するために日付の扱いについて悩んだんだ。最終的には、誕生日って物理的な時間じゃなくて、ただの文字列だって考えることにした。ユーザーには「02/18/1993」みたいに先頭のゼロも含めて指定されたフォーマットで入力させることができるし、文字列の等価性以外の操作は無効にするつもり。これが実際にどうなるかはわからないけど、時間の点や区間として扱うよりはずっと良くなってる。タイムゾーンを移動したときに誕生日が変わる問題もないしね。