App下載

Moment.js官方推薦使用其它時間處理庫代替

猿友 2020-09-24 11:26:05 瀏覽數(shù) (6065)
反饋

文章來源于公眾號:印記中文 譯者:Phobal

近期,Moment.js 在官方文檔中發(fā)布了項目狀態(tài),文中寫道:Momentjs 正式進入維護期,不會再提供大版本更新,推薦使用其他時間處理庫代替或使用 JavaScript 處于實驗階段的提案 Temporal。

以下是針對這篇項目狀態(tài)的中文翻譯。

Moment.js 已廣泛應用于數(shù)百萬個項目中,能幫助你處理網(wǎng)站中日期和時間的問題,我們感到萬分榮幸。截至 2020 年 9 月,Moment 每周下載量超 1200 萬次!然而 Moment 是為 JavaScript 生態(tài)系統(tǒng)的上一個時代而構(gòu)建的。這些年 Web 發(fā)生翻天覆地的變化,Moment 緊隨其后,但其設計與 2011 年創(chuàng)建時基本相同。鑒于有很多項目依賴它,所以我們優(yōu)先考慮穩(wěn)定性而非新功能。

Moment 對象是可變對象(mutable),這點經(jīng)常被用戶所詬病。盡管我們在 使用指南 中寫明了如何解決此問題,但還是會有很多新用戶犯錯。而如果將 Moment 變?yōu)椴豢勺儗ο螅╥mmutable)這會對已使用 Moment 的項目產(chǎn)生破壞性的影響。讓 Moment 支持 immutable 本身就是件艱巨的任務,這將使 Moment 變?yōu)榱硗庖粋€庫,現(xiàn)階段已有很多類似的庫實現(xiàn)這個特性,所以讓 Moment 保持 mutable 也沒什么不好。

而大家所詬病的另一點就是 Moment 包的體積大小,而 tree shakingMoment 無效,導致應用的包體積劇增。如果你的應用中需要用到國際化和時區(qū),那么 Moment 可能會大到超乎想象?,F(xiàn)代 Web 瀏覽器(和 Node.js)通過Intl 對象(其編號為 ECMA-402)實現(xiàn)了對國際化和時區(qū)支持。而像 Luxon 之類的庫就利用了這一優(yōu)勢來降低庫文件的大小。

最近,Chrome 開發(fā)工具會建議用戶更換 Moment。我們也贊成此舉動。

社區(qū)針對這個問題發(fā)表過很多文章:

  • 你可能不再需要 Moment.js
  • 你(可能)不需要 Moment.js
  • 為什么你不需要使用 Moment.js...
  • 4 個可替代 moment.js 的庫,用于日期國際化

Moment 團隊也針對這些問題做過詳細的討論。我們意識到可能已有項目會繼續(xù)使用 Moment。但我們并不推薦你在新項目中使用它,相反,我們向大家 推薦 一些能更好應用于現(xiàn)代 web 的庫。同時還推薦大家試用 JavaScript 處理時間的新提案 - Temporal,該提案需要大家的支持和貢獻。

我們正式宣布 Moment 進入維護期,但并非消亡,只是完成了使命。

事實上,這意味著:

  • 不再添加新功能。
  • 不會將 API 變?yōu)?immutable。
  • 不會解決 tree shaking 及包體積的問題。
  • 不會進行任何重大更改(不會有 v3)。
  • 可能選擇不對 bug 進行修復,特別是長期存在的已知 bug。

關于 Moment 的國際化語言環(huán)境文件:

  • 我們可能選擇不接受對語言環(huán)境字符串或本地化日期格式的更正,特別是它們的現(xiàn)有格式已被論證時。
  • 語言環(huán)境發(fā)生重大改變時,必須提出令人信服的依據(jù)來支持你的立場。
  • 如果你要更改字符串或格式,那么你必須先在 CLDR 上提交更改申請并被接受后才可更改。

但是,由于 Moment 使用者還很多,當遇到以下問題時我們會及時進行處理:

  • 當出現(xiàn)嚴重的安全問題時,我們將予以解決。
  • 我們將在 IANA 時區(qū)數(shù)據(jù)庫 發(fā)布更新后更新 Moment-Timezone 的數(shù)據(jù)。

需要繼續(xù)使用 Moment 的場景

在大多數(shù)情況下,新項目請不要選擇 Moment。但是,在一些特殊的場景下你可能還是需要使用它。

瀏覽器支持

Moment 能在 IE8 下完美運行。相比之下,Luxon 只能在 IE 10 及更高版本上運行,并且還需要搭配 polyfill 使用。你可以在 Luxon 的文檔中了解更多相關內(nèi)容。

其他庫在 Safari 上也有相同的問題,尤其是在移動設備上。如果你必須要支持舊版瀏覽器,那可能還要繼續(xù)使用 Moment。

但是,Day.js 支持 IE8 及更高版本,如果有兼容性相關的需求,你可以考慮使用它。

其他庫的依賴

有些庫,尤其是日期選擇器和圖形庫,都將 Moment 作為依賴項,如果你正在使用類似的組件,且找不到替代方案,那么你的項目已經(jīng)依賴了 Moment。你可以在項目中繼續(xù)使用 Moment,而不需要再引入日期時間庫。

忠實粉絲

如果你是 Moment 的忠實粉絲,那么你肯定非常了解它的 API 和局限性。如果是這樣,并且不 care 上述問題,那可以繼續(xù)使用它。

推薦一些替代庫

有很多不錯的庫可以代替 Moment。

在做選擇時,請考慮下面幾點:

  • 有些庫會被分割為模塊,插件及配套庫。
  • 有些庫將 ECMAScript 的 Intl API 用于語言環(huán)境、時區(qū)或兩者皆有。
  • 有些庫仍像 Moment 和 Moment-Timezone 一樣提供自己的語言環(huán)境和時區(qū)文件。

以下是我們推薦的替代方案:

Luxon

Luxon 可以認為是 Moment 的演變,它由 Moment 的長期撰稿人 Isaac Cambron 撰寫。請閱讀為什么會存在Luxon?以及 Luxon 文檔中的 For Moment用戶 相關文檔。

  • 語言環(huán)境:Intl 實現(xiàn)
  • 時區(qū):Intl 實現(xiàn)

Day.js

使用類似的 API,Day.js 被設計為 Moment.js 的極簡替代品。它不是臨時替代品,如果你習慣使用 Moment 的 API 并希望快速入門,請考慮使用 Day.js。

  • 語言環(huán)境:可以單獨導入的自定義數(shù)據(jù)文件
  • 時區(qū):Intl 通過插件實現(xiàn)

date-fns

Date-fns 提供了一系列用于處理 JavaScript Date 對象的函數(shù)。欲了解更多詳細信息,請到date-fns 主頁中閱讀 “為什么使用 date-fns?” 一節(jié)。

  • 語言環(huán)境:可以單獨導入的自定義數(shù)據(jù)文件
  • 時區(qū):Intl 通過單獨的庫實現(xiàn)

js-Joda

js-JodaJavaThree-Ten BackportJavaScript 版本,該 backport 是根據(jù) Java SE 8 java.time 包中 JSR-310 實現(xiàn)的基礎。如果你熟悉java.time,Joda-Time 或 Noda Time,你會發(fā)現(xiàn) js-Joda 具有可比性。

  • 語言環(huán)境:通過附加模塊的自定義數(shù)據(jù)文件
  • 時區(qū):通過附加模塊的自定義數(shù)據(jù)文件

不使用任何第三方庫

JavaScript 一直有一個 Date 對象,遵循了 ECMAScript(ECMA-262)的規(guī)范。

使用 Date 對象時,請注意以下幾點:

  • Date 對象內(nèi)部具有毫秒精度的 Unix 時間戳。它提供了可以在系統(tǒng)本地時區(qū)之間來回轉(zhuǎn)換的功能,但是內(nèi)部始終是 UTC。與 Moment 對象不同,不能將其設置為使用其他時區(qū)。它并不存在“模式”的概念。
  • 使用 Date.parsenew Date() 在過去一直存在 bug,且實現(xiàn)不一。當前的規(guī)范 支持定義解析 ISO 8601 的字符串,其中只有日期的形式會(如 "2020-09-14")被解析為 UTC,而非 ISO 8601 中的當?shù)貢r間。即便如此,也不是所有的現(xiàn)代瀏覽器都會按照這個標準來實現(xiàn)(例如 Safari)。其他類型的字符串也可以使用,但是解析它們是額外實現(xiàn)的,并且可能會有很大的不同,特別是對于舊版本的瀏覽器來說。實現(xiàn)方式以及傳入字符串的不同,可能會產(chǎn)生不同的結(jié)果。由于這些原因,我們同意 MDN 的聲明,即 強烈反對使用 Date 對象對字符串進行解析。

現(xiàn)代 JavaScript 環(huán)境也實現(xiàn)了 ECMA-402 的規(guī)范,提供了 Intl 對象,并在 Date 對象上定義了toLocaleString,toLocaleDateString 以及 toLocaleTimeString 等方法。

使用 Intl 對象時,請注意以下幾點:

  • 并非每個環(huán)境都會實現(xiàn)完整的規(guī)范。特別是,Node.js 環(huán)境依賴 ICU 提供的國際化支持。有關更多詳細信息,請參見 Node.js 文檔。
  • ECMAScript Intl 兼容性列表 (由 kangax 提供) ,方便查詢支持情況。
  • 多數(shù)較新的環(huán)境提供了通過 IANA 時區(qū)支持 timeZoneIntl.DateTimeFormat 構(gòu)造函數(shù)(以及 Date.toLocaleString,Date.toLocaleDateStringDate.toLocaleTimeString)選項。該選項可用于獲取對象的內(nèi)部基于 UTC 的時間戳和獲取已轉(zhuǎn)換為命名時區(qū)的字符串。但是,它不能將 Date 對象轉(zhuǎn)換為其他時區(qū)。

如果 DateIntl 對象能滿足你的需求,并且你完全了解它們的局限性,則可以考慮直接使用它們。

未來

Temporal - 使用 JavaScript 自帶時間和日期處理方式會更好

將來,我們希望不再需要使用 JavaScript 相關的日期和時間處理庫。而是直接使用 JavaScript 語言本身的特性。盡管今天有 Date 和提供了一些特性的 Intl,但我們從以往的經(jīng)驗和數(shù)據(jù)來看,它們?nèi)杂泻艽蟮母倪M空間。

從 ECMA TC39 的臨時提案可以看出,組織正在努力為 JavaScript 語言編寫更好的日期和時間 API。目前已處于 TC39 流程的第二階段。

Temporal 將是一個充當頂級名稱空間(如 Math)的新全局對象。它暴露了許多不同的類型的對象,包括 Temporal.AbsoluteTemporal.DateTime,Temporal.Date,Temporal.Time,Temporal.TimeZone等。Temporal Cookbook 中包含了許多案例,并舉例說明了如何在不同情況下使用這些對象。

你可以通過這個 實驗性的 polyfill 來體驗它,但還是不要在生產(chǎn)環(huán)境中使用它。

如果你有使用 Moment 或其他日期時間處理庫的經(jīng)驗,并且對 temporal 提案感興趣,歡迎參與討論和開發(fā)。

以上就是W3Cschool編程獅關于Moment.js官方推薦使用其它時間處理庫代替的相關介紹了,希望對大家有所幫助。

0 人點贊