本文整理自 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 自帶的 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 大小。
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 解決一切問題。