iamkun:
本文整理自 Monent.js 官方英文公告 https://momentjs.com/docs/#/-project-status/
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 停止开发了,那我们接下来该用什么呢?
官方给了 3 种替代方案:
1. 不使用库
对于一些简单的时间处理需求,其实 JavaScript 自带的 Date
和 Intl
对象完全可以满足。强大的 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 大小。
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.jsXbathy:我在 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…