摘要:在npm官网查看了request依赖包的当前状态,果然在2020年就被弃用了。

本文分享自华为云社区《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(根据我们团队谢汉华wx1079540 的测试):下载最新版本的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

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

突然发现,npm里request依赖包已经弃用,怎么办?的更多相关文章

  1. Nuget包里的依赖包更新到最新版本会不会随主包回滚到旧包的研究

    A包中有几个依赖包:A-1包,版本:>=1.0:但是我项目上已经引用了A-1包的2.0版本,那么我添加A包的时候,不会将A-1包2.0版本改成1.0版本,会直接用2.0版本的.

  2. 关于npm无法安装依赖包以及安装包缓慢的解决方法

    因为npm的服务器在国外,导致我们使用npm安装第三方包缓慢.而且有的第三方包是被墙的. 因此,作为墙内人,必须解决这个问题,否则开发起来实在是太坑了! 推荐大家使用淘宝的镜像(cnpm),它以每10 ...

  3. 记 Maven 本地仓库埋坑之依赖包为何不能用

    记一次 Maven 本地仓库埋坑之 Verifying Availability 背景 某 Java 后端项目使用 maven 构建,因为某些原因,某些依赖库下载不了,直接找其它人索要了他电脑上的 m ...

  4. idea引入依赖包报错

    今天在更新项目的时候,maven依赖的一个服务一直报错.查了后发现原来是因为缺少依赖包.但是依赖包明明在我本地啊. 又重新下载,依然如故... 搞了半天,发现自己的依赖包类状态都是不可用的.如下图所示 ...

  5. 一行命令更新所有 npm 依赖包

    npm 包的更新速度很快,为了将项目或者全局依赖更新到最新版本.传统的做法是一个一个更新,比如更新 react 到最新版本,命令如下: # npm npm i --save react@latest ...

  6. homestead虚拟机,通过npm下载依赖包和解决运行gulp报错问题 yarn出错问题

    homestead虚拟机,通过npm下载依赖包和解决运行gulp报错问题 yarn出错问题 1. 在虚拟器运行 npm 下载依赖组件时报错: npm ERR! EPROTO: protocol err ...

  7. 初识node.js(通过npm下载项目依赖的包的过程)

    一.初识node.js 简单的说Node.js 就是运行在服务器端的JavaScript. Node.js 是一个基于Chrome JavaScript 运行时建立的一个平台. Node.js是一个事 ...

  8. IntelliJ Idea 依赖包下载成功,代码里无法import问题解决方法

    今天clone一个github上的基于maven的项目IntelliJ Idea 依赖包下载成功,代码里无法import.解决方法:删掉原来的.iml,刷新. 如果不行,可尝试:File->In ...

  9. 用gradle4.4转化spring,发现依赖包integration-0.9.15.jar已经不在

    用gradle4.4转化spring,发现依赖包integration-0.9.15.jar已经不在仓库了,应该怎么解决? 解决办法如下: 1  修改build.gradle文件,将id " ...

随机推荐

  1. 注意,你所做的 A/B 实验,可能是错的!

    对于 A/B 实验原理认知的缺失,致使许多企业在业务增长的道路上始终在操作一批"错误的 A/B 实验".这些实验并不能指导产品的优化和迭代,甚至有可能与我们的初衷背道而驰,导致&q ...

  2. POJ 3617 Best Cow Line (字典序最小问题 & 贪心)

    原题链接:http://poj.org/problem?id=3617 问题梗概:给定长度为 的字符串 , 要构造一个长度为 的字符串 .起初, 是一个空串,随后反复进行下列任意操作. 从 的头部删除 ...

  3. ToDesk-----个人免费 极致流畅的远程协助软件

    ToDesk https://www.todesk.com/ ToDesk官方下载地址 https://www.todesk.com/ 还支持文件传输,用过许多远程的控制工具,这个自我感觉比向日葵好用 ...

  4. Go 分布式令牌桶限流 + 兜底策略

    上篇文章提到固定时间窗口限流无法处理突然请求洪峰情况,本文讲述的令牌桶线路算法则可以比较好的处理此场景. 工作原理 单位时间按照一定速率匀速的生产 token 放入桶内,直到达到桶容量上限. 处理请求 ...

  5. 从头造轮子:python3 asyncio之 gather (3)

    前言 书接上文:,本文造第三个轮子,也是asyncio包里面非常常用的一个函数gather 一.知识准备 ● 相对于前两个函数,gather的使用频率更高,因为它支持多个协程任务"同时&qu ...

  6. 将待授权的数据库的dbowner指派给该用户

    USE 数据库goEXEC dbo.sp_changedbowner N'账号'

  7. VS code远程连接Linux 开发C++ 配置详细介绍

    VS code 远程连接服务器,编译C++ 一.前期准备 1.VS code安装 Remote-SSH插件 2.Windows安装SSH. 3.Linux服务器连接测试. a.接通测试使用ping命令 ...

  8. Servlet-base标签的作用(相对路径和绝对路径)

    Web中的相对路径和绝对路径 在javaWeb中,路径分为相对路径和绝对路径: 相对路径: .     表示当前目录 .. 表示上一级目录 资源名 表示当前目录/资源名 绝对路径: http://ip ...

  9. 哪些是GET请求,哪些是POST请求

    GET请求: 1,form标签 method=get 2,a标签 3,link标签引入css 4,Script标签引入js文件 5,img标签引入图片 6,iframe引入html页面 7,在浏览器地 ...

  10. 【转载】Systemd 入门教程:实战篇

    作者: 阮一峰 日期: 2016年3月 8日 上一篇文章,我介绍了 Systemd 的主要命令,今天介绍如何使用它完成一些基本的任务. 一.开机启动 对于那些支持 Systemd 的软件,安装的时候, ...