1. 程式人生 > >⏰ Moment.js 宣佈停止開發,現在該用什麼?

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

> 本文整理自 Monent.js 官方英文公告 https://momentjs.com/docs/#/-project-status/ ![](https://img2020.cnblogs.com/blog/1099530/202009/1099530-20200917101617358-100923187.png) 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 為同類更小的庫。 ![](https://img2020.cnblogs.com/blog/1099530/202009/1099530-20200917101629629-1891316095.png) 現在,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](https://github.com/iamkun/dayjs) 的設計理念與這份總結不謀而合。在保持了優秀的 API 設計不變的同時,引入不可變物件(immutable)減少了開發時所需的心智成本,同時簡化邏輯使整個包體積僅有 __2 kB__ 大小。 ![](https://img2020.cnblogs.com/blog/1099530/202009/1099530-20200917101642081-997925329.png) [https://github.com/iamkun/dayjs](https://github.com/iamkun/dayjs) 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'); ``` -