⏰ Moment.js 宣布停止開發,現在該用什麼?

⏰ Moment.js 宣布停止開發,現在該用什麼?

本文整理自Moment.js官方英文公告 momentjs.com/docs/#

Moment.js 宣布停止開發,進入維護狀態。

這是一個大而全的時間日期庫,極大方便了我們在JavaScript 中計算時間和日期,每週下載量超過1200 萬,已成功用於數百萬個項目中。

但是,作為一個誕生於2011 年的元老級明星項目,以現在的眼光來看Moment.js 並非完美無缺,官方總結了兩大問題:

1.可變對象

Moment 對像是可變對象(mutable),簡單點說,任何時間上的加減等計算都改變了其本身。這種設計讓代碼變的十分不可控,而且很容易帶來各種隱蔽且難以調試的bug。以至於我們在每步修改之前,都要先調用.clone克隆一次才能放心操作。

2.包體積過大

因為Momnet.js將全部的功能和所有支持的語言都打到一個包裡,包的大小也是到了280.9 kB這樣一個誇張的數字,而且對於Tree shaking無效。如果要使用時區相關的功能,包體積更是有467.6 kB的大小。簡單點說,我們可能只需要一個.format格式化時間的方法,用戶就需要加載數百kB的庫,這是十分不划算的。

最新版本的Chrome 開發者工具也開始建議用戶更換Moment.js 為同類更小的庫。

現在,Moment.js 停止開發了,那我們接下來該用什麼呢?

官方給了3 種替代方案:

1.不使用庫

對於一些簡單的時間處理需求,其實JavaScript自帶的DateIntl對象完全可以滿足。強大的Intl對象可以展示不同時區不同語言的時間日期格式,在多數現代瀏覽器上已經有很好的支持。

2. Temporal

也許今後的某一天,我們再也不需要使用任何庫,被看作是未來的全新內置的時間日期方案Temporal 很值得期待。這是一個JS 語言內置的重新設計的時間和日期API,現在可以通過實驗性的polyfill 來嘗試Temporal,但離生產上大規模可用還有很長的路要走。

3.其他替代庫

官方推薦了Luxon,Day.js,date-fns 等更先進設計更優秀的時間日期庫。相比之下可能Day.js 是最值得嘗試的一個。

Day.js

官方推薦語:Day.js 被設計為Moment.js 的極簡替代品,擁有幾乎一樣的API。如果你習慣使用Moment 的API 並希望快速入門,請考慮使用Day.js。

上面說到了官方總結的Moment.js 的兩點設計缺陷,可變對象降低了代碼的維護性,過大的包體積影響了影響了整個項目的加載速度。

而將近3萬Github StarDay.js的設計理念與這份總結不謀而合。在保持了優秀的API設計不變的同時,引入不可變對象(immutable)減少了開發時所需的心智成本,同時簡化邏輯使整個包體積僅有2 kB大小。

Day.js 是一個輕量的JavaScript 時間日期處理庫,和Moment.js 的API 設計保持完全一樣. 如果你曾經用過Moment.js, 那麼你已經知道如何使用Day.js

Day.js 基本用法如下,相同的API,相同的鍊式操作,熟悉的味道。

dayjs() .startOf('month') .add(1, 'day') .set('year', 2018) .format('YYYY-MM-DD HH:mm:ss');
  • 和Moment.js 相同的API 和用法
  • 僅2kB 大小的微型庫
  • 不可變數據(Immutable)
  • 支持鍊式操作(Chainable)
  • I18n 國際化
  • 支持全球時區轉換

感謝Moment.js前輩的付出,讓我們的開發體驗變的更好,期待接過接力棒的Day.js能讓時間日期處理再也不是難題,也期待未來JavaScript內置的時間日期新方案能讓我們使用Vanilla js 解決一切問題。

What do you think?

Written by marketer

用Rust 和N-API 開發高性能NodeJS 擴展

用React Query 來管理數據請求