最新发布《数智时代的AI人才粮仓模型解读白皮书(2024版)》,立即领取! 了解详情
写点什么

怎样挑选一个好的 NPM 包?

  • 2020-12-23
  • 本文字数:2131 字

    阅读完需:约 7 分钟

怎样挑选一个好的NPM包?

我最近写了一篇关于如何加快React开发的文章,其中提到使用包而不是重新造轮子。例如,你几乎肯定希望使用一个 modal 库,而不是构建你自己的实现。(我说“几乎肯定”,是包括那些受虐狂在内。)我之前的推荐有限定条件。使用第三方库会带来风险。每周都有恶意软件包的新闻。从一个废弃的包迁移代码花费了数百万开发工时。


作为一个例子,我将比较一些比较流行的 React 组件库,评估它们在可持续性、性能和安全方面的风险。我不会深入比较主观方面的问题,例如 APIs 和 UI,尽管这些无疑是选择一个包的主要因素。即使在这些比较顶级的开源软件中,其风险状况的差异也是比较明显的:


  • Chakra UI

  • Evergreen]

  • Antd

  • Base Web


寿命


开发者喜欢点赞数。它们是代码库质量的实际衡量标准。但是它们并不完整,有时甚至会误导有潜力成为常青树的指标(我太喜欢 Segment 的 evergreen 组件库的双关语)。其它常见的指标是有多少代码库使用这个项目、有多少贡献者、是否有机构赞助这个项目等。下面是我们的组件库表格:



所有这些库都比较有名,但 Antd 比其它库表现好得多。它肯定没有废弃的危险。Antd 的明显优势是由于它的年龄。它在其它库还没有一个package.json的时候,就已经开始流行了,因此获得了更多的点赞数、用户等。多年来,它的唯一主要竞争对手是 Material UI。


在安装任何包之前,我通常会使用 Tim Qian 的神奇工具来查看它的点赞历史。Antd 的优势很明显:



点赞历史对比


Antd 几乎打破了我们图表的比例,因此,让我们聚焦看下新库们:



除 Antd 外的点赞历史对比


这里,我们看到截然不同的轨迹。单从点赞数来看,人们可能认为 Chakra UI 和 Evergreen 在采用率上大致相同,但是 Chakra UI 明显超过了它的竞争者。所有这些库最初都收获了一轮点赞爆发,但只有 Chakra 在过去的一年里维持了它的增长率。


假设你在评价包时优先考虑企业赞助,并将选择范围缩小到 Segment 的 Evergreen 和 Uber 的 Base Web。考虑到更高的点赞数和采用率,Evergreen 似乎明显胜出。Evergreen 的不足之处是它的贡献者的分布和代码提交频率。下面是其前六位贡献者的活动]:



Evergreen 的头部贡献者


除前三位开发者外,对 Evergreen 有明显贡献的开发者很少。更令人担忧的是,这三位核心开发者中有两位已经一年多不活跃了。下面是 Base Web 的对比:



Base Web 的头部贡献者


尽管 Base Web 也有一些分布比较偏头部的贡献者,但它比 Evergreen 更平均,而且它的头部贡献者仍然活跃。同时,Evergreen 的所有压力似乎都落在了 mshwery 的肩上。


代码提交频率图的显示结果类似。Base Web 的贡献者更持续:


Evergreen



Evergreen 代码提交频率


Base Web



Base Web 代码提交频率


虽然由成功的科技公司支持的库往往更持久(React 本身就是一个很好的例子),但它们也有各自的风险。有时候只有一个或少量工程师支持公司内部的开源库。当那些先驱离开时,如果没有机构的支持,这个项目可能会萎缩。像 Antd 和 Chakra UI 这样比较去中心化的包,对政策上的冷漠更有抵抗力。


性能


做同样事情的两个软件在大小上可能差异很大。Moment.js 是最流行的日期操作库,每周有超过 1200 万下载量,但它代码简化做得并不好,会向你的项目增加 300KB 大小。Day.js 拥有几乎相同的 API,但只有 2KB。事实上,Moment.js 现在推荐使用 Day.js 和其它日期库作为替代。


下面是根据 Bundlephobia 的每个组件库的开销:



Antd 在性能方面明显比较差。顺便一提,Moment.js 占其大小的 20%。为了下载完整的 Antd 包,在新兴的 3G 网络上会花费 7 秒时间。Antd 的副作用同样值得考量。副作用(代码执行其模块之外的一些行为)妨碍了代码优化。一个包不能安全的移除具有副作用的模块,因为它可能具有所需的外部作用。


Bundlephobia 提供的数据是指导性的,但并不完整。一个包对于你的应用程序大小的影响可能是有限的,如果这个包被优化过的话。为了准确评估你的应用程序中这个包的大小,使用像 Webpack Bundle Analyzer 这样的工具,它会生成打包内容的可视化树图:



正在执行的 Webpack 包分析器


安全


最安全的包是比较流行的、维护良好的、向下依赖比较少的包。即使一个库有上百万下载量,当它没有满足这些标准时,它的风险也会更高(例如,event-stream的原始不活跃的维护者将发布权限授予一个增加恶意下游依赖的人)。如果一个包比较流行,就会有更多开发者来修补它;如果它依赖比较少,那么其风险首先就比较小。


虽然我们检查过的这些组件都是安全的,但是 Chakra UI 和 Antd 的庞大的依赖使得它们比较脆弱。在下载一个依赖后,你应该使用yarn auditnpm audit来执行一次审计。这些 CLI 命令可以识别包中的安全漏洞并推荐补丁。理想情况下,你应该在你的持续集成管道流中包含yarn auditnpm audit,来检查每个拉取请求的依赖的已知漏洞。事实上,yarn audit确实揭示了 Evergreen 的一个低风险问题:



以上公告发布于 9 月 10 日,而 Evergreen 的最新版本发布于 9 月 28 日。这个问题可能无关紧要,但是 Evergreen 没有在那个正式版本或任何后续提交中修复这个问题,可能体现出它们对安全的关注很差。


如果软件已经吞噬了世界,那么开源软件将更进一步。当评价包时,仔细选择你的工具,这样以免你在周六晚上还要因为你的整个应用程序依赖某个古老的库而为它提交拉取请求,祈求来自百慕大海岸某个地方的维护人员的代码审查。


原文链接:


https://thecarrots.io/blog/how-to-evaluate-npm-packages

2020-12-23 10:564044
用户头像

发布了 165 篇内容, 共 71.6 次阅读, 收获喜欢 342 次。

关注

评论

发布
暂无评论
发现更多内容

BRC20支持的Dapp:开创去中心化应用的未来

区块链软件开发推广运营

dapp开发 区块链开发 链游开发 NFT开发 公链开发

简论密码登录安全性

Geek_44385e

登录 密码安全

常见的企业网络问题及SD-WAN解决方案

Ogcloud

SD-WAN SD-WAN组网 SD-WAN服务商

SD-WAN和MPLS的区别以及如何选择?

Ogcloud

SD-WAN SD-WAN组网 SD-WAN服务商

深度解析:i++ 与 ++i,探究其性能差异与使用技巧

高端章鱼哥

i++ i

Imagiro Autochroma for Mac(混响音频插件) v1.25激活版

iMac小白

透过 Footprint 的聚合视图洞察加密世界的全貌

Footprint Analytics

区块链 数据分析 加密货币

香港服务器出租的优势分析:为何成为企业首选?

一只扑棱蛾子

香港服务器

低代码:数字化转型的助推器

EquatorCoco

低代码 数字化 数字转型

【教程】苹果上架常见要求的有哪些?

2024最新一期中国数据库流行榜公布:阿里云PolarDB登顶

阿里云瑶池数据库

数据库 云计算 阿里云 云原生 polarDB

外包管理战略:解锁高效团队协作的关键

测吧(北京)科技有限公司

测试

28图图解Raft协议,so easy~~

快乐非自愿限量之名

Java 前端 开发 服务器 raft

纯血鸿蒙来了,鸿蒙App开发有可能提速吗?

FinFish

鸿蒙系统 小程序化 小程序技术 鸿蒙Next 纯血鸿蒙

京东商品详情数据接口(app)Python

tbapi

京东API接口 京东商品详情接口 京东商品数据采集

JNPF低代码平台存在的价值

高端章鱼哥

软件开发 低代码 JNPF

《实现领域驱动设计》- 领域服务

EquatorCoco

DDD 项目开发

10个React状态管理库推荐

伤感汤姆布利柏

利用 ASP.NET Core 开发单机应用

不在线第一只蜗牛

.net 架构 分布式 微服务

SD-WAN的突出作用

Ogcloud

SD-WAN SD-WAN组网 SD-WAN服务商

唯品会商品详情数据接口Python

tbapi

唯品会API接口 唯品会商品数据接口 唯品会商品详情数据接口

初次承担管理的成功领导力建立

测吧(北京)科技有限公司

测试

FCPX插件:276个水果蔬菜肉类面包佐料食物餐具动画预设 mCuisine

iMac小白

服务器C盘突然满了,是什么问题

德迅云安全杨德俊

高效集成|聚道云软件连接器实现薪人薪事与每刻报销无缝对接

聚道云软件连接器

案例分享

区块链游戏解说:Sunflower Land 是什么

Footprint Analytics

区块链游戏 NFT 链游

什么是信创业态支持?支持信创的数据库防水坝哪家好?

行云管家

数据库 信创 堡垒机 国产化 数据库防水坝

TDengine 3.0 四大企业应用案例合集,给你最直观的应用体验

TDengine

tdengine 时序数据库

每日一题:LeetCode-958. 二叉树的完全性检验

半亩房顶

面试 算法 LeetCode 二叉树 BFS

为什么Nginx被称为“反向”代理呢?

互联网工科生

服务器 ​Nginx

Rust 值得关注的三个 Web 框架

这我可不懂

rust Web

怎样挑选一个好的NPM包?_安全_Sam Winter_InfoQ精选文章