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


本文整理自 Monent.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 自帶的 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 大小。

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');
  • 🕒 和 Moment.js 相同的 API 和用法
  • 📦 僅 2kB 大小的微型庫
  • 💪 不可變數據 (Immutable)
  • 🔥 支持鏈式操作 (Chainable)
  • 🌐 I18n 國際化
  • 👫 支持全球時區轉換

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


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM