⏰ Moment.js 宣佈中止開發,如今該用什麼?

本文整理自 Monent.js 官方英文公告 momentjs.com/docs/#/-pro…git

Moment.js 宣佈中止開發,進入維護狀態。github

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

可是,做爲一個誕生於 2011 年的元老級明星項目,以如今的眼光來看 Moment.js 並不是天衣無縫,官方總結了兩大問題:markdown

1. 可變對象

Moment 對象是可變對象(mutable),簡單點說,任什麼時候間上的加減等計算都改變了其自己。這種設計讓代碼變的十分不可控,並且很容易帶來各類隱蔽且難以調試的 bug。以致於咱們在每步修改以前,都要先調用 .clone 克隆一次才能放心操做。工具

2. 包體積過大

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

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

如今,Moment.js 中止開發了,那咱們接下來該用什麼呢?設計

官方給了 3 種替代方案:調試

1. 不使用庫

對於一些簡單的時間處理需求,其實 JavaScript 自帶的 DateIntl 對象徹底能夠知足。強大的 Intl 對象能夠展現不一樣時區不一樣語言的時間日期格式,在多數現代瀏覽器上已經有很好的支持。code

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 大小。

github.com/iamkun/dayj…

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 解決一切問題。

相關文章
相關標籤/搜索