App下載

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

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

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

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

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

Moment.js 已廣泛應(yīng)用于數(shù)百萬個(gè)項(xiàng)目中,能幫助你處理網(wǎng)站中日期和時(shí)間的問題,我們感到萬分榮幸。截至 2020 年 9 月,Moment 每周下載量超 1200 萬次!然而 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 對象是可變對象(mutable),這點(diǎn)經(jīng)常被用戶所詬病。盡管我們在 使用指南 中寫明了如何解決此問題,但還是會有很多新用戶犯錯(cuò)。而如果將 Moment 變?yōu)椴豢勺儗ο螅╥mmutable)這會對已使用 Moment 的項(xiàng)目產(chǎn)生破壞性的影響。讓 Moment 支持 immutable 本身就是件艱巨的任務(wù),這將使 Moment 變?yōu)榱硗庖粋€(gè)庫,現(xiàn)階段已有很多類似的庫實(shí)現(xiàn)這個(gè)特性,所以讓 Moment 保持 mutable 也沒什么不好。

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

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

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

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

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

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

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

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

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

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

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

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

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

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

瀏覽器支持

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

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

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

其他庫的依賴

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

忠實(shí)粉絲

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

推薦一些替代庫

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

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

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

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

Luxon

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

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

Day.js

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

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

date-fns

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

  • 語言環(huán)境:可以單獨(dú)導(dǎo)入的自定義數(shù)據(jù)文件
  • 時(shí)區(qū):Intl 通過單獨(dú)的庫實(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,你會發(fā)現(xiàn) js-Joda 具有可比性。

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

不使用任何第三方庫

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

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

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

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

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

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

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

未來

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

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

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

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

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

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

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

0 人點(diǎn)贊