别再用MomentJS了,来试试Date-fns

1,697 阅读2分钟

一起养成写作习惯!这是我参与「掘金日新计划 · 4 月更文挑战」的第7天,点击查看活动详情

MomentJs是非常流行的JavaScript日期库,之前做的项目,要在前端进行大量的日期计算,刚开始使用的时候,踩了不少坑。最近尝试了新的日期库:Date-fns,还挺好使。

Moment.js是一个很棒的时间日期库,提供了许多出色的功能。如:日期时间格式化,验证处理不同时区等功能。但是对于web应用程序来说,MomentJS太过于复杂,包太大了。

MomentJS缺点

在我早期使用时,发现这样一个问题。当修改endDate时,startDate也会随之变化。

const startDate = moment();
const endDate   = startDate.add(1, 'year');

console.log(startDate); // 2023-03-13T13:39:07+01:00
console.log(endDate);   // 2023-03-13T13:39:07+01:00

Moment最大的缺点就是包过于大,大约300k。在一些对于性能要求较大项目中,可能会出现性能问题。

接下来,一起看看Date-fns。

Date-fus

github地址:github.com/date-fns/da…

文档地址:date-fns.org/docs/Gettin…

安装:

npm install date-fns --save
 #或者使用 yarn 
yarn add date-fns

使用:

import { formatDistance, subDays } from 'date-fns'

formatDistance(subDays(new Date(), 3), new Date(), { addSuffix: true })
//=> "3 days ago"

Date-fns特点

1.支持单个导入

Date-fns 库包含多个函数,有200多种功能,适用于几乎所有场合。并且是模块化的,可以根据需要单独导入这些函数。适用于 webpack、Browserify 或 Rollup,还支持 tree-shaking。

例如,如果要计算2个日期之间的差值,只需要导入formatDistance和subDays函数。

import { formatDistance, subDays } from ‘date-fns’

formatDistance(subDays(new Date(), 3), new Date())

2.Date-fns是不可变的

上面提到,可变性是使用 momentJs 时最大的问题之一。在date-fns 完全消除了这个问题,它支持不变性。

案例如下:

const startDate = new Date();
const endDate = add(startDate, {years: 2});

console.log(startDate) // 2022-03-13T13:39:07+01:00
console.log(endDate)   // 2024-03-13T13:39:07+01:00

3.代码包更小

Date-fns的包大小约为80kb,不到MomentJS的三分之一,并且同时支持 Flow 和 TypeScript。