⏰ Moment.js 宣布停止开发,现在该用什么?

iamkun

本文整理自 Monent.js 官方英文公告 https://momentjs.com/docs/#/-project-status/

⏰ Moment.js 宣布停止开发,现在该用什么?插图

Moment.js 宣布停止开发,进入维护状态。

这是一个大而全的时间日期库,极大方便了我们在 JavaScript 中计算时间和日期,每周下载量超过 1200 万,已成功用于数百万个项目中。

但是,作为一个诞生于 2011 年的元老级明星项目,以现在的眼光来看 Moment.js 并非完美无缺,官方总结了两大问题:

1. 可变对象

Moment 对象是可变对象( mutable ),简单点说,任何时间上的加减等计算都改变了其本身。这种设计让代码变的十分不可控,而且很容易带来各种隐蔽且难以调试的 bug 。以至于我们在每步修改之前,都要先调用 .clone 克隆一次才能放心操作。

2. 包体积过大

因为 Momnet.js 将全部的功能和所有支持的语言都打到一个包里,包的大小也是到了 280.9 kB 这样一个夸张的数字,而且对于 Tree shaking 无效。如果要使用时区相关的功能,包体积更是有 467.6 kB 的大小。简单点说,我们可能只需要一个 .format 格式化时间的方法,用户就需要加载数百 kB 的库,这是十分不划算的。

最新版本的 Chrome 开发者工具也开始建议用户更换 Moment.js 为同类更小的库。
⏰ Moment.js 宣布停止开发,现在该用什么?插图(1)

现在,Moment.js 停止开发了,那我们接下来该用什么呢?

官方给了 3 种替代方案:

1. 不使用库

对于一些简单的时间处理需求,其实 JavaScript 自带的 DateIntl 对象完全可以满足。强大的 Intl 对象可以展示不同时区不同语言的时间日期格式,在多数现代浏览器上已经有很好的支持。

2. Temporal

也许今后的某一天,我们再也不需要使用任何库,被看作是未来的全新内置的时间日期方案 Temporal 很值得期待。这是一个 JS 语言内置的重新设计的时间和日期 API,现在可以通过实验性的 polyfill 来尝试 Temporal,但离生产上大规模可用还有很长的路要走。

3. 其他替代库

官方推荐了 Luxon,Day.js ,date-fns 等更先进设计更优秀的时间日期库。相比之下可能 Day.js 是最值得尝试的一个。

Day.js

官方推荐语:Day.js 被设计为 Moment.js 的极简替代品,拥有几乎一样的 API 。如果你习惯使用 Moment 的 API 并希望快速入门,请考虑使用 Day.js 。

上面说到了官方总结的 Moment.js 的两点设计缺陷,可变对象降低了代码的维护性,过大的包体积影响了影响了整个项目的加载速度。

而将近 3 万 Github Star 的 Day.js 的设计理念与这份总结不谋而合。在保持了优秀的 API 设计不变的同时,引入不可变对象( immutable )减少了开发时所需的心智成本,同时简化逻辑使整个包体积仅有 2 kB 大小。

⏰ Moment.js 宣布停止开发,现在该用什么?插图(2)
https://github.com/iamkun/dayjs

Day.js 是一个轻量的 JavaScript 时间日期处理库,和 Moment.js 的 API 设计保持完全一样. 如果你曾经用过 Moment.js, 那么你已经知道如何使用 Day.js

Day.js 基本用法如下,相同的 API,相同的链式操作,熟悉的味道。

dayjs()
    .startOf('month')
    .add(1, 'day')
    .set('year', 2018)
    .format('YYYY-MM-DD HH:mm:ss');
  • ? 和 Moment.js 相同的 API 和用法
  • ? 仅 2kB 大小的微型库
  • ? 不可变数据 (Immutable)
  • ? 支持链式操作 (Chainable)
  • ? I18n 国际化
  • ? 支持全球时区转换

感谢 Moment.js 前辈的付出,让我们的开发体验变的更好,期待接过接力棒的 Day.js 能让时间日期处理再也不是难题 ?,也期待未来 JavaScript 内置的时间日期新方案能让我们使用 Vanilla js 解决一切问题。

liushuangbill:喜欢 date-fns

liyang5945:dayjs

官方不在维护 moment.js 了

oliver34:今天上 moment 官网,发现官方决定不在维护 moment 了,而且推荐新项目不要选用 moment,改用其他库。 摘自官网: The Moment team has discussed these issues at length. We recognize that many existing projects may contin…

问题 node.js

Xbathy:我在 a.html 页面有一个循环播放的动画,如何通过访问另一个路由,比如说 /error,使 a.html 停止播放? 换句话说如何通过路由向 view 传参?应该是这么个意思. 不用框架比如说 vue 、angular 啥的

这个网站是 Node.js 搭建的吗?

yunyingsilue:小弟不懂,想问问大家www.ruanfa.cn这个网站是 Node.js 搭建的吗?能不能看出来Node.js 搭建的网站有哪些优缺点?putaozhenhaochi:这就是你想出来的推广方式? imherer:是的,用的 next.js SingeeKing:不说是不是推广,看软件介绍里面的图我有点想 @1ychee jimmy2…

不懂就问: node.js 做静态资源服务器如何?

cat:有个轻业务,访问量不大,后端已经用 koa 写了,现在需要提供图片及其它文件给前端,请问可以直接在 koa 中返回文件的 stream 吗?如果文件比较大( 100M 以内)是否还合适?以前都是由 nginx 提供,现在为了省一个流程,想用 koa 直接做 http serverDanswerme:一般不都是 nginx 做静态资源服务器,然后其他请…

cnzz 的统计 js 经常打开很慢,大家有推荐的速度快点的统计吗

paowang:网站没统计又不行,但是 cnzz 又经常抽风,我自己打开有时候都卡半天等待 cnzz 响应,太影响体验了,大家现在都用啥herozzm:cnzz 无法统计百度 google 的来路,没用它的理由啊,国内百度,国外 google paowang:@herozzm 马上换百度,真让 cnzz 气死了 dcalsky:国内只能百度啦哭 baiduy…