Moment.js 文档

Moment.js 已成功用于数百万个项目,我们很高兴为让网络上的日期和时间变得更好做出贡献。 截至 2020 年 9 月,Moment 每周的下载量超过 1200 万次! 然而,Moment 是为 JavaScript 生态系统的前一个时代而构建的。 如今,现代网络看起来大不相同。 多年来,Moment 有所发展,但它的设计与 2011 年创建时的设计基本相同。 考虑到有多少项目依赖它,我们选择将稳定性优先于新功能。

例如,考虑 Moment 对象是可变的。 这是有关 Moment 的常见投诉来源。 我们 在我们的使用指南中 解决了这个问题,但它仍然让大多数新用户感到惊讶。 将 Moment 更改为不可变对于使用它的每个项目来说都是一个重大变化。 创建一个不可变的 "Moment v3" 将是一项艰巨的任务,并且会使 Moment 成为一个完全不同的库。 由于这已经在其他库中完成,我们认为保留可变 API 更为重要。

在现代应用程序中反对使用 Moment 的另一个常见论点是它的大小。 Moment 不适用于现代 "摇树优化" 算法,因此它往往会增加 Web 应用程序包的大小。 如果需要国际化或时区支持,Moment 会变得很大。 现代网络浏览器(和 Node.js)通过编码为 ECMA-402Intl 对象公开国际化和时区支持。 像 Luxon(和其他)这样的库利用了这一点,减少或消除了传送你自己的数据文件的需要。

最近,Chrome Dev Tools 仅针对尺寸 开始显示更换 Moment 的建议。 我们普遍支持这一举措。

你可能还想阅读:

Moment 团队对这些问题进行了详细讨论。 我们认识到许多现有项目可能会继续使用 Moment,但我们不希望在未来的新项目中使用 Moment。 相反,我们希望 推荐替代品 是当今现代应用程序中使用的绝佳选择。 我们还想推广 JavaScript 语言的 Temporal 补充,它正在寻找反馈和贡献者。

我们现在普遍认为 Moment 是一个处于维护模式的旧项目。 它没有死,但确实已经完成了。

实际上,这意味着:

  • 我们不会添加新的特性或功能。
  • 我们不会将 Moment 的 API 更改为不可变的。
  • 我们不会解决摇树优化或者包体积的问题。
  • 我们不会进行任何重大更改(没有版本 3)。
  • 我们可能会选择不修复错误或行为怪癖,尤其是当它们是长期存在的已知问题时。

具体关于 Moment 的国际化语言环境文件:

  • 我们可能会选择不接受对区域设置字符串或本地化日期格式的更正,特别是如果它们已经成功地针对其当前形式进行了争论。
  • 你必须为区域设置更改提出新的令人信服的论据,并提供重要的非轶事证据来支持你的立场。
  • 如果你要求更改的字符串或格式反映在 CLDR 中,那么你必须先在那里提交更改并让其接受。

然而,由于我们了解到 Moment 在数百万现有项目中得到了很好的应用:

  • 我们将解决出现的关键安全问题。
  • 我们将在 IANA 时区数据库 版本发布后发布 Moment-Timezone 的数据更新。

继续使用 Moment 的原因

在大多数情况下,你不应该为新项目选择 Moment。 但是,出于某些可能的原因,你可能希望继续使用它。

浏览器支持

Moment 在 Internet Explorer 8 及更高版本上运行良好。 相比之下,Luxon 仅适用于 IE 10 及更高版本,并且需要 polyfill 才能这样做。 你可以在 Luxon 的文档中阅读更多内容。

其他库也存在与 Safari 相关的问题,尤其是在移动设备上。 如果你强烈要求支持旧版浏览器,那么你可能希望坚持使用 Moment 更长时间。

但是,Day.js 报告了与 IE8 及更高版本的兼容性,所以你仍然可能希望考虑替代方案。

其他库的依赖

其他几个库,尤其是日期选择器和图形库,将 Moment 作为依赖项。 如果你正在使用这样的组件并且找不到替代品,那么你已经在你的项目中包含了 Moment。 因此,在整个项目中继续使用 Moment 而不是包含另一个日期和时间库可能是有意义的。

熟悉程度

如果你是 Moment 的长期用户,你可能已经很好地了解它的 API 和限制。 如果是这样,并且上述问题不是你关心的问题,那么你当然可以继续使用它。