写点什么

怎样挑选一个好的 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:564356
用户头像

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

关注

评论

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

挤破脑袋要进阿里、腾讯的java程序员,去B站不香吗?

钟奕礼

Java 程序员 java面试 java编程

网易互娱数据成本优化治理实践

网易数帆

数据中台 数据仓库 数据治理 12 月 PK 榜

SAP IDoc状态70 - This IDoc is saved as the original of an edited document.

SAP虾客

这个库居然能够快速打开页面的链接

FE情报局

Multi-Site High Availability Architecture solution of Honor of Kings mall

David

#架构实战营

Wallys/DR9074E-Qualcomm Atheros QCN9074(QCN9024)/ 4x4 MU-MIMO Dual Band Wireless Module

Cindy-wallys

QCN9074 QCN9024

一步登顶还是步步维艰?Java资深架构师撰下的“阿里P7成神之路”

钟奕礼

Java 程序员 java面试 java编程

NineData,领先的多云数据管理平台

NineData

数据库 数据复制 数据备份 多云管理 SQL开发

在不确定性的2022年寻找确定性|这些ToB赛道值得关注

ToB行业头条

九科信息受邀参加软件与信息服务产业集群高质量发展论坛

九科Ninetech

Java 编程入门第一课:HelloWorld

千锋IT教育

【iOS逆向与安全】iOS插件开发光速入门

小陈

用低代码赋能数字化 快速打造项目管理系统

力软低代码开发平台

Linux之基于Centos系统安装Redis、MySQL、Nginx

C++后台开发

nginx redis 后端开发 linux开发 C++开发

如何管好一个迭代?让数据帮你回答这些关键问题

思码逸研发效能

数据 研发效能 迭代

模块一作业

程序员小张

「架构实战营」

SAP MM 使用两个STO实现免关税跨国公司间转储(III)

SAP虾客

借助云的力量,重塑企业的现在和未来|re:Invent 2022 Adam Selipsky 主题演讲精华全收录

亚马逊云科技 (Amazon Web Services)

亚马逊云科技

SAP MM 采购订单的Document Flow

SAP虾客

MegPeak——让你更懂你的处理器

MegEngineBot

深度学习 开源 处理器 MegEngine MegPeak

乐观锁思想在JAVA中的实现——CAS

JAVA旭阳

Java Java并发

如何使用 vue + intro 实现后台管理系统的引导

千锋IT教育

实战|2个 MatrixGate 接入性能优化小技巧

YMatrix 超融合数据库

性能优化 超融合数据库 数据接入 YMatrix MatrixGate

收到7个offer,用同一个技术套路了多位面试官

钟奕礼

Java java程序员 java面试 java编程

含泪复盘!项目踩坑回炉改造血泪史(附芯片PCB/原理图)

华秋PCB

PCB PCB设计

从零开始学习Java系列教程之Windos下dos命令行使用详解前言

千锋IT教育

RocketMQ 5.0 可观测能力升级:Metrics 指标分析

阿里巴巴云原生

阿里云 RocketMQ 云原生

域内用户Hash获取方式总结

网络安全学海

黑客 网络安全 信息安全 渗透测试 漏洞挖掘

世界杯“无障碍字幕直播间”火了,背后有啥火山语音的黑科技?

科技热闻

WorkPlus SE专业版:政企首选的安全即时通讯及移动办公工具

BeeWorks

行业分析:头部咨询管理企业的“数字化转型”之路!

优秀

企业数字化转型 SAP咨询行业

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