Date-Fns 和 Moment.Js 哪个更好?

我们在开发过程中,往往会遇到很多需要处理日期的地方,如果我们用自带的date属性去处理日期,是一个很麻烦的事情,这个时候用一个合适的时间库就可以完美的解决这个问题了,目前比较常用的日期处理库就是Momentjs和date-fns这两个库,如下图所示,我们可以看到他们的使用量

Moment-js使用

目前Momentjs已经不再维护了,但是针对已有的api,我们仍然是可以继续使用Momentjs去处理日期,官网建议不要为新项目选择Momentjs,官方也为我们提供了一些替代方案,详见官网

上面我们说了,虽然官方给我们提供了一些其他的解决方案,但是Momentjs仍然可以使用,下面我们就一起来使用一下Moment,然后再让Moment和date-fns对比一下

  • 安装Moment

    javascript 复制代码
    npm install Moment
    // or
    yarn add Moment
  • 在项目中使用Moment详见

    javascript 复制代码
    var Moment = require('Moment'); // require
    Moment().format(); 
    // ES6
    import Moment from 'Moment';
    Moment().format();

    在这里我们就可以看到,当你创建 Moment.js 实例时,Moment.js 会加载所有函数。执行基本功能需要加载相当大的代码块。不可能导入特定的函数。因此,即使在加载基本日期时也会引入性能开销,因为您必须导入整个 API 链。

    默认情况下,webpack 打包所有 Moment.js 语言环境(在 Moment.js 2.18.1 中,这是 160 缩小的 KB)。 要去除不必要的语言环境并仅打包使用过的语言环境,请添加 moment-locales-webpack-plugin:

    javascript 复制代码
    // webpack.config.js
    const MomentLocalesPlugin = require('moment-locales-webpack-plugin');
    
    module.exports = {
        plugins: [
            // To strip all locales except "en"
            new MomentLocalesPlugin(),
    
            // Or: To strip all locales except "en", "es-us" and "ru"
            // ("en" is built into Moment and can't be removed)
            new MomentLocalesPlugin({
                localesToKeep: ['es-us', 'ru'],
            }),
        ],
    };

Date-fns使用

  • 安装date-fns

    javascript 复制代码
    npm install date-fns --save
    // or
    yarn add date-fns
  • 在项目中使用date-fns详见

    javascript 复制代码
    import { format, compareAsc } from 'date-fns'
    
    format(new Date(2014, 1, 11), 'MM/dd/yyyy')
    //=> '02/11/2014'
    
    const dates = [
    new Date(1995, 6, 2),
    new Date(1987, 1, 11),
    new Date(1989, 6, 10),
    ]
    dates.sort(compareAsc)
    //=> [
    //   Wed Feb 11 1987 00:00:00,
    //   Mon Jul 10 1989 00:00:00,
    //   Sun Jul 02 1995 00:00:00
    // ]

Moment和Date-fns差异

特性差异 date-fns moment
国际化 支持 支持
TypeScript 支持 支持
日期处理功能 提供丰富的日期处理函数 提供丰富的日期处理函数
大小和性能 相对较小,性能良好 相对较大,性能略低
API 设计 函数式编程,模块化 面向对象
可变性 vs. 不可变性 返回不可变的新日期对象 返回可变的日期对象
文档和社区支持 文档相对较少,社区支持较少 文档丰富,社区支持广泛
本地化支持 提供基本的本地化函数,需额外配置来实现复杂本地化需求 内置强大的本地化支持
浏览器和服务器支持 支持在浏览器和服务器端使用 同样支持在浏览器和服务器端使用
是否持续更新

Date-fns 合适吗?

它于 2017 年首次发布,因其简单性、不变性和性能而广受欢迎。然而,它已经很受欢迎并且正在快速增长:

  • 既然 Moment.js 即将消失,那么Date-fns是否合适?以下是 Date-fns 成为替代 Moment.js 的理想选择的一些完美理由:

  • 它是一个基于函数的 API。Date-fns 是许多小函数的集合,使用原生 Date 来操作日期对象。与 Moment.js 不同,您只导入需要的内容。只选择你需要的方法。

  • 它的捆绑输出非常小,至少构建输出减少了至少 40%。

  • 不可变的日期很好。Date-fns 不变性功能可确保从运行的函数返回新的 Date 实例。

  • 其减小的尺寸提高了整体性能。

  • Date-fns 支持 tree-shaking 算法,使其可以与React、Webpack等工具一起使用。

结论

不管是用Moment还是用date-fns去处理日期格式,都是一个不错的选择,不能绝对的说哪个库好用,这取决于你的项目想要那些功能。

相关推荐
知识分享小能手1 小时前
React学习教程,从入门到精通, React 属性(Props)语法知识点与案例详解(14)
前端·javascript·vue.js·学习·react.js·vue·react
魔云连洲1 小时前
深入解析:Vue与React的异步批处理更新机制
前端·vue.js·react.js
mCell2 小时前
JavaScript 的多线程能力:Worker
前端·javascript·浏览器
超级无敌攻城狮3 小时前
3 分钟学会!波浪文字动画超详细教程,从 0 到 1 实现「思考中 / 加载中」高级效果
前端
excel4 小时前
用 TensorFlow.js Node 实现猫图像识别(教学版逐步分解)
前端
gnip5 小时前
JavaScript事件流
前端·javascript
赵得C5 小时前
【前端技巧】Element Table 列标题如何优雅添加 Tooltip 提示?
前端·elementui·vue·table组件
wow_DG5 小时前
【Vue2 ✨】Vue2 入门之旅 · 进阶篇(一):响应式原理
前端·javascript·vue.js
weixin_456904275 小时前
UserManagement.vue和Profile.vue详细解释
前端·javascript·vue.js
资深前端之路5 小时前
react 面试题 react 有什么特点?
前端·react.js·面试·前端框架