文章來源于公眾號:印記中文 譯者: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 shaking
對 Moment
無效,導(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-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,你會發(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.parse
或new 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
對象上定義了toLocaleString
,toLocaleDateString
以及 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ū)支持
timeZone
的Intl.DateTimeFormat
構(gòu)造函數(shù)(以及Date.toLocaleString
,Date.toLocaleDateString
和Date.toLocaleTimeString
)選項(xiàng)。該選項(xiàng)可用于獲取對象的內(nèi)部基于 UTC 的時(shí)間戳和獲取已轉(zhuǎn)換為命名時(shí)區(qū)的字符串。但是,它不能將Date
對象轉(zhuǎn)換為其他時(shí)區(qū)。
如果 Date
和 Intl
對象能滿足你的需求,并且你完全了解它們的局限性,則可以考慮直接使用它們。
未來
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.DateTime
,Temporal.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)介紹了,希望對大家有所幫助。