App下載

Moment.js官方推薦使用其它時(shí)間處理庫(kù)代替

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

文章來(lái)源于公眾號(hào):印記中文 譯者:Phobal

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

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

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

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

而大家所詬病的另一點(diǎn)就是 Moment 包的體積大小,而 tree shaking 對(duì) Moment 無(wú)效,導(dǎo)致應(yīng)用的包體積劇增。如果你的應(yīng)用中需要用到國(guó)際化和時(shí)區(qū),那么 Moment 可能會(huì)大到超乎想象。現(xiàn)代 Web 瀏覽器(和 Node.js)通過(guò)Intl 對(duì)象(其編號(hào)為 ECMA-402)實(shí)現(xiàn)了對(duì)國(guó)際化和時(shí)區(qū)支持。而像 Luxon 之類的庫(kù)就利用了這一優(yōu)勢(shì)來(lái)降低庫(kù)文件的大小。

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

社區(qū)針對(duì)這個(gè)問(wèn)題發(fā)表過(guò)很多文章:

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

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

我們正式宣布 Moment 進(jìn)入維護(hù)期,但并非消亡,只是完成了使命。

事實(shí)上,這意味著:

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

關(guān)于 Moment 的國(guó)際化語(yǔ)言環(huán)境文件:

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

但是,由于 Moment 使用者還很多,當(dāng)遇到以下問(wèn)題時(shí)我們會(huì)及時(shí)進(jìn)行處理:

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

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

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

瀏覽器支持

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

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

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

其他庫(kù)的依賴

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

忠實(shí)粉絲

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

推薦一些替代庫(kù)

有很多不錯(cuò)的庫(kù)可以代替 Moment。

在做選擇時(shí),請(qǐng)考慮下面幾點(diǎn):

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

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

Luxon

Luxon 可以認(rèn)為是 Moment 的演變,它由 Moment 的長(zhǎng)期撰稿人 Isaac Cambron 撰寫。請(qǐng)閱讀為什么會(huì)存在Luxon?以及 Luxon 文檔中的 For Moment用戶 相關(guān)文檔。

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

Day.js

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

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

date-fns

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

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

js-Joda

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

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

不使用任何第三方庫(kù)

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

使用 Date 對(duì)象時(shí),請(qǐng)注意以下幾點(diǎn):

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

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

使用 Intl 對(duì)象時(shí),請(qǐng)注意以下幾點(diǎn):

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

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

未來(lái)

Temporal - 使用 JavaScript 自帶時(shí)間和日期處理方式會(huì)更好

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

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

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

你可以通過(guò)這個(gè) 實(shí)驗(yàn)性的 polyfill 來(lái)體驗(yàn)它,但還是不要在生產(chǎn)環(huán)境中使用它。

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

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

0 人點(diǎn)贊