值得使用的 JavaScript 模块🔥
快速分解一下我发现自己反复使用的最有用的 JavaScript 模块。
这篇文章主要探讨我认为对 Node.js 和前端 JavaScript 开发非常有价值的通用模块和实用程序。它不会详尽无遗地列出所有特殊用途的模块,因为那些令人眼花缭乱的列表虽然很棒,但往往让人不知所措。
命令行工具
让我们从一些极其有用的命令行工具开始。
np——更好的
npm publish
。
如果你是 npm 开发者,我强烈建议你尝试一下np,因为它让升级版本、添加 git 发布标签以及发布到 npm 变得轻而易举,尤其是在你开始维护多个模块的时候。Zeit的发布也值得一提,也是一个不错的选择。

yarn——一个替代的包管理器
npm
。
npm
和之间没有明显的赢家yarn
。最近 v2 的戏剧性事件yarn
可能足以让许多yarn
开发者重新使用npm
。
作为 2020 年的 JS 开发人员,请确保您至少熟悉这两者npm
,并且yarn
可以轻松地在它们之间切换。
prettier - 一个固执己见的代码格式化程序。
Prettier 通过解析您的代码并使用自己的规则重新打印来强制执行一致的样式,这些规则考虑了最大行长度,并在必要时包装代码。
我喜欢eslint ,并且一直是 JavaScript标准样式的长期用户,但prettier和gofmt等自动代码格式化程序背后的想法无疑很有吸引力。
作为开发人员,我们花费了太多的时间和精力来担心代码的呈现和样式,而Prettier减轻了这些思考过程的需要,让您专注于编写的内容而不是编写方式。

现在——极其简单的部署。
Now 绝对是目前市面上最简洁、最可靠、功能最齐全的免费部署系统。它非常适合测试静态和动态部署,并且在您需要更多服务器时能够很好地扩展。对了,我有没有提过,在您需要扩展之前,它是免费的?!
它与 Node.js 以及基于 JS 的 Web 应用兼容得非常好。我还强烈推荐大家了解Zeit 的其他产品,因为他们的团队汇聚了社区中最优秀的 JS 开发者。

asciinema - 用于记录高质量终端会话的免费工具。
请参阅我之前的博客文章“让你的代码更漂亮”,了解如何利用asciinema像专业人士一样制作高质量的代码演示和截屏视频。
承诺
这部分内容确实值得用一整篇文章来阐述,尤其是在async 和 await已经成为 JavaScript 并发编程事实上的标准范式的当下。话虽如此,我强烈建议你去看看Sindre Sorhus的精彩的promise-fun模块合集(如果你还没看过的话)。我对这些模块唯一的不满是,它们可能无法与大多数前端工具链(例如create-react-app或rollup)开箱即用。
以下是一些最有用的精华,它们在 Node 中使用承诺和异步样式代码时脱颖而出:
pify - Promisify 回调样式函数。
有很多方法可以将函数从老式的回调函数转换为 Promise 函数,但我发现pify是最好的。它体积小巧,并且具有一些内置util.promisify所不具备的特性,例如自动方法绑定。
p-map - 同时映射承诺。
并发性固然很好,但大多数情况下,你都需要对并行度设置一个实际的限制,无论是限制网络带宽还是计算资源。这正是p-map 的真正优势所在。我 99% 的时间都用它来替代Promise.all(…)
不支持限制并行度的 。
在我意识到p-map之前,我创建了自己的版本async-await-parallel,但你应该使用p-map ,因为它更好。😛
p-retry - 重试承诺返回或异步函数。
我通常会使用p-retry包装所有 HTTP 请求和外部服务调用,以增强其基本的稳健性。结合p-map,您可以以可控的并行度处理大批量的外部请求,而无需过多担心偶尔出现的传输错误、套接字挂起或服务器超时。
p-timeout - 在指定时间后超时承诺。
除了p-retry之外,p-timeout也是与第三方 API 和服务协同工作的必备选项。您还可以指定可选的回退机制,因为通常情况下,返回某些内容比无限期挂起或在过长的时间后返回要好。
p-cache或p-memoize - 通过LRU 缓存记忆异步函数的结果。
许多 Promise 实用程序的目的让我想起了构建强大的微服务,其中每个外部依赖项都可以使用支持重试、超时、缓存、断路器、回退等的通用接口来处理。
优雅地降低功能通常比压垮系统或根本不响应要好,所以如果您对微服务不太熟悉,请检查它们并看看它们的设计决策是否也有助于提高您的 Promise 处理能力。
刮擦
市面上有很多优秀的数据抓取工具,有些像cheerio一样处理原始 HTML ,有些则像puppeteer一样模拟完整的浏览器环境。具体使用哪种工具取决于你的实际使用场景,因为处理原始 HTML 速度更快、更轻量,而自动化无头浏览器则更健壮,但代价是启动时系统负担更重。
cheerio
jQuery
-专为服务器设计的核心的快速、灵活、精益实现
Cheerio 非常适合快速且粗略的网页抓取,尤其适合那些只想对原始 HTML 进行操作的情况。它提供了类似 jQuery 的强大语法来遍历和操作 HTML 文档。Cheerio 与下面的request-promise-native配合使用,尤其适合抓取远程 HTML 文档。
puppeteer - 无头 Chrome Node API
与 cheerio 不同,puppeteer 是一个用于自动化无头 Chrome 实例的包装器,这对于处理现代 JS 驱动的 SPA 非常有用。由于您使用的是 Chrome 本身,因此它还具有一流的解析/渲染/脚本一致性支持。无头 Chrome 仍然相对较新,但它可能会在未来几年逐步淘汰PhantomJS等较旧的方法。
如果您需要忠实地抓取网站数据、自动化基于 Web 的工作流程或捕获屏幕截图,那么puppeteer显然是赢家,而且随着时间的推移,它只会变得越来越受欢迎。
Node.js
dotenv-safe -从中加载环境变量
.env
并确保它们都存在。
此模块扩展了广受欢迎的dotenv模块,通过文件强制执行预期环境变量的存在.env.example
。与原版模块一样,它为 Node 提供了快速、安全且强大的环境变量支持。
它还可以与 Zeit 的now.sh部署配合良好,并在now.json”dotenv”: true
中设置选项。
request和request-promise-native - 简化的 HTTP 请求客户端。
发起 HTTP 请求是一项极其常见的操作,我在这里使用的 goto 模块是request-promise-native,它使用原生 ES6 Promise 支持对原始请求模块进行包装。95% 的时间里,我希望等待已 Promise 化的 HTTP 请求的结果。另外 5% 的时间里,我希望直接处理响应流,在这种情况下,我会使用底层的请求模块,放弃对 Promise 的支持。
为了稳健性,我经常将request-promise-native调用包装在p-retry、p-timeout和p-cache的某种组合中。
还值得一提的是,got是request的一个较新的替代品,它内置了对承诺的支持,尽管我个人并没有用过太多。
const request = require('request-promise-native') | |
const html = await request('https://github.com') | |
console.log(html) |
const request = require('request-promise-native') | |
const html = await request('https://github.com') | |
console.log(html) |
使用request-promise-native下载 HTML 文档的示例。
合并- Node 的模板引擎合并库。
Consolidate 非常适合处理任何类型的后端模板(电子邮件、推文、原始 HTML 等)。我通常使用Handlebars作为我的模板引擎,但无论如何,我都会将模板使用到Consolidate中,因为无论你决定在底层使用哪种模板引擎,它都能提供简单且一致的模板接口。
例如,我使用create-react-library中的合并功能,通过特定于库的变量来呈现样板的模板。
execa——更好的
child_process
。
如果您需要运行 shell 命令或生成子进程,这将非常有用。
fs-extra -
fs
具有附加方法和 Promise 支持的更好的版本。
我很少再直接用它了fs
。试试看fs-extra
,你就不会后悔了。
数学
D3(数据驱动文档)是一个流行的数据可视化和动画前端库。它还包含一些用于常见数学运算的最佳独立包,我发现自己总是选择它们而不是其他模块。
d3-random — 从各种分布生成随机数。
如果Math.random
不行,可以试试d3-random。它支持从各种常见分布中进行采样,包括均匀分布、正态分布和指数分布。
d3-ease - 缓和函数以实现流畅的动画。

d3-interpolate - 插入数字、颜色、字符串、数组、对象等等!
此模块提供了多种插值方法,用于混合两个任意值。值可以是数字、颜色、字符串、数组,甚至是深度嵌套的对象。
测试
ava - 很棒的 JS 测试运行器。
毫不奇怪,我首选的 Node.js 单元测试运行器是 Sindre Sorhus 创建的又一款工具。Ava 是一款较新的单元测试运行器,它吸收了mocha、tape、chai和其他 JS 测试运行器的许多优点,并将它们捆绑到一个高质量的项目中,并设置了合理的默认设置,确保“正常工作”。
值得注意的是,Ava 的测试默认是并行运行的,您可以在文件级别禁用此功能,以用于数据库测试等用例,其中单元测试的运行顺序可能很重要。

nock -HTTP 模拟和期望库。
Nock 非常适合测试单独执行 HTTP 请求的模块。如果您的 Node 模块需要发出 HTTP 请求,并且您希望提供合适的单元测试,那么nock是您的最佳选择。
sinon - 用于 JS 测试的功能间谍、存根和模拟。
Sinon 是一个非常实用的库,可以利用依赖注入来编写隔离测试。它应该成为每个 Node 开发人员工具箱中的一部分。
总结
我希望你觉得这份分解清单很有帮助,即使只是让你了解一个你之前不了解的高质量模块。我认识很多有抱负的和经验丰富的开发人员,他们最终都会自己开发解决方案来解决常见问题,这本身就是一种很有用的做法,但了解哪些现有的高质量解决方案值得借鉴,而不是不断地重复造轮子,也是很有益处的。
NPM 模块库的规模和范围是前所未有的,在我看来,这是 JavaScript 相较于其他编程语言的最大优势之一。你越善于利用 npm 模块,你作为开发者的速度就会越快、效率也会越高。像这样的高阶“软”技能是成为神话般的 10 倍速程序员的标志之一。
我遗漏了哪些你最喜欢的 npm 模块?快来评论区分享你最喜欢的模块吧!❤️
在你离开之前……
如果你喜欢这篇文章,请留下❤
鏂囩珷鏉ユ簮锛�https://dev.to/transitivebullshit/javascript-modules-worth-using-4267