⏰ Moment.js 宣布停止開發,現在該用什麼?
本文整理自Moment.js官方英文公告https:// momentjs.com/docs/# /-project-status/
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自帶的Date
和Intl
對象完全可以滿足。強大的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 Star的Day.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 解決一切問題。