写点什么

突然发现,npm 里 request 依赖包已经弃用,怎么办?

  • 2022 年 2 月 21 日
  • 本文字数:2560 字

    阅读完需:约 8 分钟

本文分享自华为云社区《npm里request依赖包已经弃用?致敬并调研替代方案!》,作者: gentle_zhou。


在这个月的代码审视中,发现一个 js 项目里仍然在使用 request 依赖包进行下载操作,依稀记得这个依赖包应该在 2019 年就已经进入维护状态了(即只会维护当前代码,修复 bug,但不会接收新特性或则发行主要版本)。


加上最近在做 MD5 文件校验,但是每次对通过 request 方法下载下来的资源进行 MD5 求值,获得的结果都不一样,于是就对 request 依赖包产生了怀疑(后来经过开发测试发现,其实和 request 依赖包没啥关系,request 仍然可以使用;但是因为是弃用状态,还是建议替换掉)。


于是立马上 npm 官网去查看了下这个依赖包的当前状态,果然在 2020 年就被弃用了。官网的链接:https://www.npmjs.com/package/request


为何 request 依赖包被弃用

官网介绍说,2020 年 2 月 11 日,npm 依赖包就完全被弃用了(即不会有任何新的改变了);这是非常遗憾的,这个 2009 年出现的依赖包可以说是 JavaScript 生态世界里非常重量级的一款。

在 2019 年的时候,就有 41K 的模块依赖它在做下载操作,每周还有 14,000,000 的下载量。

这么大量的使用和下载,导致开发者认为这会给依赖包带来两个显著的不好的效应:1.对于新的开发类似需求的依赖包来说会变的很困难,因为 request 当前占据了生态系统(Respect! ∠(°^°)); 2.这么大量的依赖与使用,导致未来任何有意义的改变(显著的改变)请求的执行都会非常困难,因为这种改变不仅可能不被它的大多数依赖项所采用,而且还会使它与成千上万的使用 request 依赖包的博客和堆栈溢出响应不一致。

再加上随着 JS 的发展,在某些特定情况下,request 依赖包的核心部分已经跟不上时代潮流了。比如说,大部分开发人员会用 async/await 和 promises 搭配一起,这个模式在版本 8 的 Node.js 里第一次被使用,但是 request 并不支持。这时候开发者所说的第二个不好的效应就限制了 request 去发展去改变(对 request 进行显著的改变可能会导致非常多的冲突)。

因此,这个在 2022 年 2 月 14 日去查看的时候 github 上被 star 了 25.4K 的项目就在 2020 年 2 月 11 日处于被弃用状态了。RIP。

request 依赖包是干嘛用的

先上一张 npm 官网关于 request 依赖包的截图介绍:

我们从图中介绍,可以看出这相当于是一个非常容易使用的简单的 HTTP 客户端(实际使用过程中也确实非常好用简易);request 依赖包被创建的作用就是用来可以帮助用户简单地处理 HTTP 调用,它能帮助用户做配置工作,为用户省去很多复杂的工作(比如配置 HTTP 连接到代理,或则做一个 POST 请求)。

最简单的实践操作使用方法如下(就是引用一下依赖包,然后 request 去下载,返回 error, response, body 信息):

const request = require('request');request('http://www.google.com', function (error, response, body) {  console.error('error:', error); // Print the error if one occurred  console.log('statusCode:', response && response.statusCode); // Print the response status code if a response was received  console.log('body:', body); // Print the HTML for the Google homepage.});
复制代码

request 依赖包的替代方案

那么有没有 request 的替代方案可以让我们使用呢?我在做了一番调研之后,发现了下面这些依赖于最新的 Node.js-8.x 的“流行爆款”依赖包:

  1. Got:Human-friendly and powerful HTTP request library for Node.js。用户友好的轻量级 HTTP 请求库。https://www.npmjs.com/package/got

  2. Axios:Promise-based HTTP client for the browser and Node.js。https://www.npmjs.com/package/axios

  3. Node Fetch:A light-weight module that brings window.fetch to Node.js。一个轻量级的 HTTP 请求库,它将浏览器的 Fetch API 功能引入 Node.js。https://www.npmjs.com/package/node-fetch

  4. Superagent:Small progressive client-side HTTP request library, and Node.js module with the same API sporting many high-level HTTP client features.一个类似于 Axios 的流行 HTTP 库,用于在 Node.js 和浏览器中发出 AJAX 请求。https://www.npmjs.com/package/superagent

几款依赖包支持的功能等性能比较,可以参考下图:


因此,通过上图以及我们实际测试,得出下面结论:

  • Axios 有更多的日/周/月下载量,github 上获得更多星;更多的 followers 和更多的 fork,支持在 browser 上使用,但进度展示仅支持在浏览器上显示。

  • Got 有更多的版本,更频繁的更新,更少的 open issues 和更少的 open pull requests,但是有个明显的 issue:下载最新版本的 12.0.1,使用起来会有错误-使用 await go 引入包会导致 no response,仅仅使用 got 引入包会导致"Must use import to load ES Module:"告警

  • – https://github.com/sindresorhus/got/discussions/1978

  • 而如果使用前一个版本 11.8.3,则会发生在网页 CloudIDE 上连接超时的错误(怀疑和 proxy 有关):

  • – https://github.com/sindresorhus/got/issues/1572。


还有一种替代方案是直接使用 Node.js 标准库里的 HTTP 和 HTTPS 模块,无需安装外部软件包,但是同样地也会带来弊端就是使用起来并不友好,会繁琐很多。


这里感谢小伙伴的链接分享~

  1. https://www.twilio.com/blog/2017/08/http-requests-in-node-js.html

  2. https://cloud.tencent.com/developer/article/1735008

  3. http://nodejs.cn/learn/making-http-requests-with-nodejs/#执行-get-请求

代码 demo:

const https = require('https');
https.get(url, (res : any) => { console.log(`状态码: ${res.statusCode}`)
res.on('data', d => { process.stdout.write(d) }) res.on('end', () => { console.log(`已结束`) })}).on('error', error => { console.error(error)})
复制代码

注:

针对 JS 项目里的流式下载,并不仅仅是 https.get(requestUrl)下载完之后,就真的下载完了;我们还需要对 const stream = fs.createWriteStream(toolsPath);这个 stream 常量进行检测,看是否是 finish 状态了。

当 https.get 是 end 状态和 stream 是 finish 状态的时候,我们才可以说所有下载都完成了;此时才可以进行 MD5 值的校验。

参考链接

  1. https://www.npmjs.com/package/request

  2. https://betterprogramming.pub/request-has-been-deprecated-a76415b4910b?gi=3fd5d3ad02db

  3. https://github.com/request/request/issues/3142


点击关注,第一时间了解华为云新鲜技术~


发布于: 刚刚阅读数: 2
用户头像

提供全面深入的云计算技术干货 2020.07.14 加入

华为云开发者社区,提供全面深入的云计算前景分析、丰富的技术干货、程序样例,分享华为云前沿资讯动态,方便开发者快速成长与发展,欢迎提问、互动,多方位了解云计算! 传送门:https://bbs.huaweicloud.com/

评论

发布
暂无评论
突然发现,npm里request依赖包已经弃用,怎么办?