date-fns v3 发布——这个由 200 个函数组成的 JavaScript 日期处理套件

在这里插入图片描述

date-fns v3 发布——这个由 200 个函数组成的 JavaScript 日期处理套件已经在 TypeScript 中重写,重新引入了 String 日期参数,在 Node 上支持 ESM,并且所有函数现在都可以通过命名导出导出。

经过几个月的开发,v3 终于出来了!

对于大多数开发人员来说,升级不需要做任何改动。对某些人来说,升级也是轻而易举的事。

v3 更新概览

然而,这个版本带来了很多好东西,所以对于初学者来说,这里是一些最值得注意的改变:

  • 现在,该库是 100% 的 TypeScript,具有全新的 handcrafted types。
  • 从所有函数中移除了参数检查和转换代码,除了格式化和解析,这导致了更小的最小构建大小。
  • 字符串日期参数现在又回来了!
  • 支持 Date 类扩展,如 UTCDate。
  • 支持 Node.js 的 ESM。
  • 所有函数现在都通过命名导出来导出,从而提高了与不同设置的兼容性。
  • 新的扁平化库结构改善了 ESM/Deno 的 DX( node_modules/date-fns/add.mjs )。
  • 不再支持 IE。

如果你想直接进入它,请参阅 v3.0.0 变更日志。

在这篇博文中,我将更详细地解释这些变化,并为我们在 v3 上所做的选择提供背景。

TypeScript 支持

此版本最初是对 TypeScript 的重写。当我 2014 年开始开发这个库时,TypeScript 似乎是一个小众项目。

从那以后,世界发生了变化,大多数开发人员已经意识到类型的力量,并在很大程度上采用了这种语言。

在 date-fns 中,类型是 JSDoc 生成的,我并不真正理解它是如何工作的,多年来,生成的类型变成了一个 23K LOC 怪物,没有希望轻松修复。

为了确保 date-fns 提供一流的 TypeScript 支持,我们重写了数百个函数到 TypeScript 中,我们仔细地手工制作了每个类型和接口,我们导出了所有东西,包括每个函数的选项接口,所以你可以轻松访问它们。

这花了一段时间,但是在社区的帮助下,我为这个结果感到非常自豪。

移除参数检查

在迁移到 TypeScript 时,我重新评估了我们在 v2 中引入的参数检查的价值。

它们背后的思想是为运行时提供尽可能多的类型安全,检查参数的数量和类型似乎是一个好主意。

现在,有了一流的 TypeScript 支持,它似乎是多余的。

因此,我们尽可能地删除了检查,只保留了格式和解析函数。

将类型安全委托给 TypeScript 可以使源代码更清晰,并提高最小构建大小。

以前,我乐于将最小构建大小降至 300 字节,现在只需要 200 字节!

字符串作为参数

在 v2 中,我们删除了字符串作为参数,现在它们又回来了。

我删除的原因是传递无效字符串并期望它得到正确解析是一个常见的错误。另一个普遍存在的问题是在传递日期的同时不传递时间,结果得到的是 UTC 午夜而不是本地时区,从而导致用户代码出现错误。在这两种情况下,开发人员都会将责任归咎于 date-fns,从而将支持工作推给了我们。

然而,这并没有解决用户的问题。他们在将字符串传递给函数库之前,会用new Date 对字符串进行包装,结果还是出现了错误。但是,当从版本 1 迁移到版本 2 时,成千上万的开发人员不得不修改每一个涉及字符串的函数调用,在没有类型的情况下工作时经常会遗漏一些地方,从而导致错误。此外,新开发人员在使用函数库时还会遇到额外的摩擦。

我承认我的错误,现在字符串已经回来了,这可能会导致新的问题涌入,但我会单独处理它们。

支持 Date 扩展

时区支持是我多年来一直巧妙地避免的一个最古老的功能请求,我不想重新实现 Moment.js 的 IANA 功能,因为发布一个巨大的时区数据库与为 JavaScript 创建最轻量级数据库的目标相矛盾。

然而,我最终决定做点什么,并发布了 @date-fns/utc,它提供了 UTCDate 类,这是一个扩展,将常规函数(如 getHours )映射到 UTC 版本(如 getUTCHours )。

这使得 date-fns 可以在不改变代码的情况下执行所有 UTC 计算。然而,实现它需要彻底检查如何处理参数,所以我把它推迟到 v3。

另外,得益于 TypeScript 泛型,如果您将 UTCDate 日期作为参数传递并期望返回日期,您将获得 UTCDate

ESM 支持

自 v2 版本以来发生的另一件大事是 Node.js 获得了 ESM 支持。表面上的一个简单问题变成了一项需要彻底检修构建系统的艰巨任务。

在 v3 中,我几乎完全重写了构建系统,所以我也解决了 Node.js ESM。

date-fns 仍然是一个包含 CommonJS 和 ESM 的双重软件包,但考虑到需要花费大量精力才能使其正确,v4 版本将仅使用 ESM。

不再有默认的导出

所有函数都曾导出默认值,但在为 Node.js 开发 ESM 支持并测试该库时,我发现由于导出默认值的特性,它不可能在所有可能的设置中都正常工作。由于 export default 的行为性质,我发现不可能让它在所有可能的设置中都正常工作。

所以我决定折衷一下,改用命名导出,这样你就可以从子模块导入函数了,代码也需要改一下:

import addDays from "date-fns/addDays";
// ->
import { addDays } from "date-fns/addDays";

让我惊讶的是,它破坏了 Next.js,所以,在经过一番努力之后,我决定添加一个后备方案,这样 Next.js 用户就不会来找我抱怨了,这很糟糕,但我无能为力。

顺便说一下,Next.js 团队从来没有回复过我。

扁平结构

由于我正在重新设计构建系统,我决定解决浏览器 ESM 和 Deno 用户不得不面对的烦恼。

之前,导入代码如下: https://unpkg.com/date-fns/addDays/index.mjs

现在,库的结构是扁平的,所以不再有丑陋的索引文件了: https://unpkg.com/date-fns/addDays.mjs

很整洁,对吧?

IE 再见!

我四年前发布了 v2,IE 仍然健在,现在是时候说再见了!

IE 从来都不是一个好孩子。

一些历史

主要 date-fns 版本的大主题是修复我们在之前版本中犯的错误。

在开发 v1 API 时,我们从很多地方汲取灵感,从 Moment.js 到 Ruby on Rails。它导致 API 和处理边缘情况的方法不一致。因此,当时机成熟时,我们决定从头开始重新设计该库,审查一百个函数的每一个部分。我决定在开发人员体验和 API 防错之间采取最保守的路线,总是选择后者。我们将使用现有标准,尽可能替换熟悉的 JS 模式。

在过去,JavaScript 疲劳是一个大话题。新的库版本往往互不兼容,每隔几个月就会发布一次,这使得用户不得不无休止地重构他们的工作,以保持他们的依赖关系正常工作。由于我们必须做出重大的突破性更改,因此我们将几个主要版本的更改打包到一个版本中。

当然,这一切都适得其反。一切都始于漫长的开发周期和无休止的“是否有更新”、“ETA 是什么”(以及其他不太礼貌的评论)。许多破坏性的改动,尤其是那些为了追求“最佳”而降低开发者体验的改动,引起了大量(合理的)批评。另一个副作用是,由于设置了许多防护栏,库的构建规模增大了。

虽然这是值得的,因为最终我们得到了高度一致的 API,在 v3 中,我决定退后一步,使 API 更适合开发人员。

此外,虽然有很多改进库的想法需要进行突破性更改,但我决定专注于少数几个,并采取更小的迭代步骤。

而且,从我宣布迁移到 TypeScript 到现在,已经过去了三年。

V4及以上版本

为了保持相关性,date-fns 必须进化并适应不断变化的 JavaScript 世界。

虽然现在开始使用 Temporal 还为时过早,但现在是时候完全接受 Intl 了。

format 仍然是 date-fns 中最流行但最重要的函数,大多数开发人员不需要它。通常,人们使用它来格式化 ISO 日期,而不是使用内置函数:

new Date().toISOString().slice(0, 10);
//=> '2023-12-18'

其余的可以用 Intl 解决问题。

因此,我对 v4 的目标是将 I18n 提取到单独的包(如 @date-fns/es@date-fns/de),并用 Intl 替代品 intlFormatintlFormatDistance 替换 formatformatDistance 等。

我希望这能让人们迁移到更轻量级的函数,并显著减少构建和包的大小。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/267825.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

手写Vue2源码

手写Vue2 使用rollup搭建开发环境 使用rollup打包第三方库会比webpack更轻量,速度更快 首先安装依赖 npm init -ynpm install rollup rollup-plugin-babel babel/core babel/preset-env --save-dev然后添加 rollup 的配置文件 rollup.config.js import babel f…

react 路由v6

这里是区别:V5 vs V6 这里是官网:可以查看更多高级属性 一、基本使用: 1、配置文件 src/routes/index import React from "react";const Home React.lazy(() > import("../Pages/Home")); const About React.laz…

探索 HTTP 请求的世界:get 和 post 的奥秘(上)

🤍 前端开发工程师(主业)、技术博主(副业)、已过CET6 🍨 阿珊和她的猫_CSDN个人主页 🕠 牛客高级专题作者、在牛客打造高质量专栏《前端面试必备》 🍚 蓝桥云课签约作者、已在蓝桥云…

html之如何设置音频和视频

文章目录 前言一、音频标签:audio1.audio简介2.常用属性controlsautoplayloop代码演示: 二、视频标签:video1.video2.常用的视频元素controlsautoplayloop代码演示: 总结视频元素总结音频元素总结 前言 html中插入音频和视频的方…

超维空间S2无人机使用说明书——51、使用yolov8进行目标跟踪

引言:为了提高yolo识别的质量,提高了yolo的版本,改用yolov8进行物体识别,同时系统兼容了低版本的yolo,包括基于C的yolov3和yolov4,以及yolov7。 简介,为了提高识别速度,系统采用了G…

14章总结

一.lambda表达式 1.lambda表达式简介 lambda表达式不能独立执行,因此必须实现函数式接口,并且会返回一个函数式接口的对象。 语法: ()->结果表达式 参数->结果表达式 (参数1,参数2,...,参数n)->…

老鹰目标检测数据集VOC格式60张

老鹰是天空中的王者,它们拥有极佳的飞行能力。它们能以惊人的速度在天空中翱翔,尤其擅长高空俯冲捕食。老鹰的视力非常敏锐,能够准确地发现地面上的猎物,并迅速下落抓取。它们的爪子强而有力,足以击倒比自己体型庞大的…

顶级旗舰ET9出道,蔚来还是那个「最不计成本」的中国车品牌

作者 |张祥威 编辑 |德新 2008年,李斌和新浪的曹国伟几人一起喝酒,发了第一条微博,「天冷带围巾,心冷发微博」,一晚上涨了2000多个粉丝,他偶尔还会针砭时事,很快积累了最早一波粉丝。 创立蔚来…

各种边缘检测算子的比较研究

边缘检测算子比较研究 文章目录 边缘检测算子比较研究一、引言1.1 边缘检测的重要性1.2 研究背景与意义1.3 研究目的和论文结构 二、文献综述2.1 边缘检测概述2.2 Roberts、Prewitt、Sobel、Laplacian 和 Canny 算子的理论基础和历史2.2.1 **Roberts算子:**2.2.2 **…

全部没有问题 (一.5)

java mooc练习 基础练习: 进阶练习: final 赋值一次 局部 必须赋值 抽象类 多态测试 package com.book;public class moocDraft1 {static int variable1;public void fatherMethod(moocDraft1 a){System.out.println(variable);}public static void…

leetcode——背包问题汇总

本章来汇总一下leetcode中做过的背包问题,包括0-1背包和完全背包。 背包问题的通常形式为:有N件物品和一个最多能背重量为W 的背包。第i件物品的重量是weight[i],得到的价值是value[i] 。求解将哪些物品装入背包里物品价值总和最大。0-1背包和…

1981-2020年全国各省银行金融机构分布数据、银行金融机构数据

1981-2020年全国各省银行金融机构分布数据/银行金融机构数据 1、时间:1981-2020年 2、指标:统计年度、地区代码、地区名称、金融机构分类代码、金融机构分类名称、营业网点机构个数、营业网点就业人数、营业网点资产总额、法人机构数目、每万人拥有的网…

嵌入式软件工程师常用的

最近我换工作了,看见不同嵌入式软件工程师用的平台都不一样,所以我整理了一下。 PlatformIO: 多平台支持: PlatformIO支持多种嵌入式平台,包括Arduino、ESP8266、ESP32、STM32等,通过一致的开发接口实现平台无关性。 内…

使用ClickHouse UDF与OpenAI模型集成

本文字数:14683;估计阅读时间:37 分钟 作者:Dale McDiarmid 审校:庄晓东(魏庄) 本文在公众号【ClickHouseInc】首发 Meetup活动 ClickHouse Shenzhen User Group第1届 Meetup 火热报名中&#x…

计算机提示找不到vcruntime140.dll,无法继续执行代码怎么办?如何修复

“找不到vcruntime140.dll,无法继续执行代码”。这个问题可能会让你感到困惑,不知道如何解决。那么,vcruntime140.dll是什么文件?它为什么会丢失?又该如何解决这个问题呢?本文将为你详细介绍vcruntime140.d…

教师未来前景发展

教师是一个光荣而重要的职业,他们承担着培养下一代的责任和使命。随着社会的不断发展和变化,教师的前景也在不断扩大和改变。本文将探讨教师未来的前景发展,并提供一些思考和建议。 首先,教师的就业前景将继续扩大。随着人口的增长…

自定义Springboot项目启动横幅⭐️ 附平平淡淡的周末日常

2023/12/24 天气晴 温度适宜 一觉睡到九点半,谁是神仙,我是神仙日常三联,喂鸡,刷博,肝任务今阳光甚好,遂寻吾之莆田,翻其面,光得以入之,余卧炕&#xff0…

单片机原理及应用

一、任务说明 1.主要任务 本实践环节“51单片机商用电子计价秤设计”要求收集市场电子秤的应用场景的功能列表,给出本系统各功能的参数范围,分析质量检测功能的实现方法,设计单片机仿真系统并通过Proteus进行测试,电子秤是利用物…

注意:国内发生多起Oracle 勒索病毒!

摘要:近期,国内发生多起针对Oracle 数据库的勒索病毒案例,通过分析,该勒索病毒通过网络流传的“PL/SQLDeveloper破解版”进行传播。 1.病毒发起的原因及问题现象 近期,国内发生多起针对Oracle 数据库的勒索病毒案例&…

池化层(pooling)

目录 一、池化层 1、最大池化层 2、平均池化层 3、总结 二、代码实现 1、最大池化与平均池化 2、填充和步幅(padding和strides) 3、多个通道 4、总结 一、池化层 1、最大池化层 2、平均池化层 3、总结 池化层返回窗口中最大或平均值环节卷积层对位置的敏感性同样有窗口…