文章來(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-Joda
是 Java 的 Three-Ten Backport
的 JavaScript 版本,該 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.parse
或new 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ì)象上定義了toLocaleString
,toLocaleDateString
以及 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ū)支持
timeZone
的Intl.DateTimeFormat
構(gòu)造函數(shù)(以及Date.toLocaleString
,Date.toLocaleDateString
和Date.toLocaleTimeString
)選項(xiàng)。該選項(xiàng)可用于獲取對(duì)象的內(nèi)部基于 UTC 的時(shí)間戳和獲取已轉(zhuǎn)換為命名時(shí)區(qū)的字符串。但是,它不能將Date
對(duì)象轉(zhuǎn)換為其他時(shí)區(qū)。
如果 Date
和 Intl
對(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.Date
,Temporal.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ì)大家有所幫助。