来自公众号:前端界
来自公众号:前端界
开篇之前,先提两个问题:
你知道 Radash吗?
Radash会取代 Lodash吗?
你知道 Radash吗?
Radash会取代 Lodash吗?
相信大家都知道Lodash, 这个 Java 工具库从2012至今,已经存在长达12年的时间,它在github上的 star 数超过 58.6k, 在 npm 上每周的下载量已超过 5200 万。
最初,Lodash的运行情况很好,帮助开发人员编写了简洁、可维护的 Java 代码。然而,由于近两年没有针对最新 Java 函数进行重大更新,开发人员在使用Lodash时开始面临一些挑战,在这样的背景下,Radash应运而生,以其现代化的特性和对Type的友好支持,逐渐成为开发者的新宠。
在本文中,我将详细讨论Lodash中的问题以及Radash如何解决这些问题,从而回答提出的问题:Radash会取代Lodash吗?
Lodash 面临的问题
随着 Java 语言的不断进化和新特性的引入,Lodash的一些功能开始显得不再那么必要。
Lodash 函数过时了
随着ES6及后续版本的推出,Java 引入了许多新的语言特性,如可选链(?.)和空值合并(??),使得一些Lodash的函数显得多余。
在 ES6 之前,如果你想安全地访问对象的嵌套属性,可以使用Lodash的_.get函数来避免可能的undefined错误。例如:
//假设我们有一个对象,我们想访问`a.b.c`属性
constobj={
a:{
b:{
c:'Hello'
}
}
};
//使用Lodash的_.get来安全地获取值
constvalue=_.get(obj,'a.b.c','Default');console.log(value);
//输出:'Hello'
如果obj中的任何中间属性是undefined或null,_.get将返回提供的默认值'Default',而不是抛出错误。
然而,随着 ES6 引入了可选链操作符?.,我们现在可以更简洁地实现同样的功能,而不需要Lodash:
//使用可选链操作符来安全地访问嵌套属性
constvalue=obj?.a?.b?.c||'Default';
console.log(value);
//输出:'Hello'
同样的,像.filter、.map和_.size这样的函数也变得多余了。并且,在性能方面,像可选链?.这样的特性远远超过了Lodash函数,可选链的性能几乎Lodash的_.get函数的两倍(根据能测量工具:measurethat.net的测试结果)。
源码可读性差
实话说,上面所谈到的,作为开发者的你也许可以接受,但是Lodash源码的学习成本真的很高,这可能才是我们的底线。这是 Lodash源码
我们不应该为了了解一个单行函数是如何工作的,而去翻阅 15000 行代码,为了学习 API。
我们不应该为了了解一个单行函数是如何工作的,而去翻阅 15000 行代码,为了学习 API。
image.png
几年前,相信大家经常看到过这样解读Lodash的文章。
以前,我也曾花费不少时间挖掘源代码,学习每一个 API,记录每一个函数调用,理解得足够透彻,为了能够回答一个简单的面试问题,比如isNumber函数是如何工作的?
Radash 的崛起
Radash,这个新兴的工具库,以其现代化的设计和对Type的原生支持,迅速吸引了开发者的注意。
虽然Radash是新产品,但它在 GitHub 上的star数已超过 2.8K,拥有 99 个 Forks,每周的 NPM 下载量超过 7.6 万。您可以使用 NPM 或 Yarn 轻松安装Radash。
Radash的特点包括:
零依赖: Radash不依赖于任何第三方库,使得项目更加轻量级。
Type友好: Radash完全使用Type编写,提供了准确的类型定义。
现代化功能: Radash去除了 Lodash中一些过时的函数,并引入了许多新的实用功能。
易于理解和维护: Radash的源代码易于理解,对新手友好。
零依赖: Radash不依赖于任何第三方库,使得项目更加轻量级。
Type友好: Radash完全使用Type编写,提供了准确的类型定义。
现代化功能: Radash去除了 Lodash中一些过时的函数,并引入了许多新的实用功能。
易于理解和维护: Radash的源代码易于理解,对新手友好。
值得👍的是,源代码的维护真的将新人的易懂性放在首位。在大多数情况下,如果你想使用Radash函数,但又不想安装,你可以直接从 GitHub 复制。
例如下面这段源代码:
exportconstunique=<T,Kextendsstring|number|symbol>(
array:readonlyT[],
toKey?:(item:T)=>K
):T[]=>{
constvalueMap=array.reduce((acc,item)=>{
constkey=toKey?toKey(item):(itemasanyasstring|number|symbol)
if(acc[key])returnacc
acc[key]=item
returnacc
},{}asRecord<string|number|symbol,T>)
returnObject.values(valueMap)
}
定义了一个名为unique的泛型函数,目的是从输入数组中提取唯一的元素。函数接受两个参数:一个类型为readonly T[]的只读数组array,以及一个可选的映射函数toKey, 相信很多初级的开发者都可以看懂。
另外,如果你项目只需要一个unique函数,完全可以将源码复制到自己的工具文件中来使用。
目前Radash已经提供 90多个实用函数。
可以后台回复【Radash】,获取每个函数的详细介绍
可以后台回复【Radash】,获取每个函数的详细介绍
下面我们将介绍几个特别实用的函数:
tryit
tryit函数可能是我最喜欢的Radash函数。tryit函数可以包装一个函数,将其转换为错误优先函数。适用于异步和同步功能。
import{tryit}form"radash"
const[err,user]=awaittryit(api.users.userInfo)(userId)
我发现它是对代码整洁最大提升的代码。不再需要为了尝试某些操作而分叉控制流。不再需要在try块外部创建一个可变的let变量,在里面设置它,然后在之后检查它。
range
range可以取代传统的循环。例如,假设您需要打印从 1 到 5 的数据,如果使用传统的 for 循环,就会像下面这样:
for(leti=1;i<=5;i++){
console.log(i);
}
但是,使用Radash的range函数,您可以省略所有变量声明、条件和增量。
import{range}from'radash';
for(constiofrange(1,5)){
console.log(i);
}
list
list函数可以根据提供的参数动态生成列表。这个函数支持1到4个输入参数,包括起始值、结束值、映射函数和步长。
import{list}from'radash';
constmyList=list(1,10,(i)=>i*2,2);
console.log(myList);//输出:[2,4,6,8,10]
在这个例子中,list函数创建了一个从2开始,每次增加2,到10结束的列表。
counting
counting函数用于统计类数组集合中各类元素的数量。它接收一个对象数组和一个回调函数,通过回调函数定义计数条件。
import{counting}from'radash';
constitems=[
{category:'A'},
{category:'B'},
{category:'A'},
{category:'C'}
];
constcounts=counting(items,(item)=>item.category);
console.log(counts);//输出:{A:2,B:1,C:1}
在项目中,我发现自己使用counting的次数比自己想象得要多。
除了上面这些有特色的方法,还有很多实用的方法, 例如:
节流 throttle和防抖 debounce
类型判断方法,如 isArray、 isString、 isNumber等
对象操作 pick、 omit、 clone等
节流 throttle和防抖 debounce
类型判断方法,如 isArray、 isString、 isNumber等
对象操作 pick、 omit、 clone等
还有很多非常实用的方法, 大家可以通过官网查阅:
image.png
在这篇文章中,讨论了不喜欢Lodash的原因,以及可能倾向Radash等替代品的原因。但是,与新的竞争对手相比,Lodash仍然拥有庞大的用户群,并在许多大型项目中得到广泛应用。
我已经在项目中使用了, 如果你使用遇到问题,欢迎找我一起讨论😊
看完上面的分析,新项目中你会选择这个现代化替代品Radash吗?
参考文章:
https://medium.com/exobase/lodash-is-dead-long-live-radash-d9d52abf428b
---END---