App下載

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

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

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

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

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

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

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

而大家所詬病的另一點就是 Moment 包的體積大小,而 tree shakingMoment 無效,導(dǎo)致應(yīng)用的包體積劇增。如果你的應(yīng)用中需要用到國際化和時區(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。但我們并不推薦你在新項目中使用它,相反,我們向大家 推薦 一些能更好應(yīng)用于現(xiàn)代 web 的庫。同時還推薦大家試用 JavaScript 處理時間的新提案 - Temporal,該提案需要大家的支持和貢獻。

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

事實上,這意味著:

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

關(guān)于 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 的文檔中了解更多相關(guān)內(nèi)容。

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

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

其他庫的依賴

有些庫,尤其是日期選擇器和圖形庫,都將 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用戶 相關(guān)文檔。

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

Day.js

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

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

date-fns

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

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

js-Joda

js-JodaJavaThree-Ten BackportJavaScript 版本,該 backport 是根據(jù) Java SE 8 java.time 包中 JSR-310 實現(xiàn)的基礎(chǔ)。如果你熟悉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 對象不同,不能將其設(shè)置為使用其他時區(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 提供的國際化支持。有關(guān)更多詳細信息,請參見 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 相關(guān)的日期和時間處理庫。而是直接使用 JavaScript 語言本身的特性。盡管今天有 Date 和提供了一些特性的 Intl,但我們從以往的經(jīng)驗和數(shù)據(jù)來看,它們?nèi)杂泻艽蟮母倪M空間。

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

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

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

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

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

0 人點贊