@qinyun
2018-04-10T16:13:20.000000Z
字数 4954
阅读 1841
未分类
npm模块的规模和范围是空前的,这也是JavaScript相对于其它编程语言的最大优势之一。你对于npm模块利用得越好,你就会成为一名更快更高产的开发人员。本文将介绍一些对于NodeJS和前端JavaScript开发价值非凡的通用模块和工具,期望能够对广大读者有所裨益。
本文所述仅代表个人观点,主要聚焦于对于NodeJS和前端JavaScript开发价值非凡的通用模块和工具。本文不会面面俱到,也不会包含任何特定用途的模块,因为那种类型的列表虽然确实不错但有点儿片面。
让我们先来看看一些非常有用的命令行工具。
np - 一个更好的
npm publish
如果你是一位npm模块开发者,我强烈建议你检出np。因为它将版本冲突处理、添加git发布标记以及发布到npm的流程变得轻而易举,特别是当你需要维护十来个以上模块的时候。另外值得一提的是,Zeit开发的release也是一个不错的选择。
图片来源:Sindre Sorhus开发的np
yarn - 一个兼容npm的更好的包管理器。
尽管npm v5比之前版本快了很多,但我仍然认为yarn比npm更适合本地开发,因为yarn的速度和一致性更出色。无论使用哪种方式,你都是基于底层的同一个npm模块库,而且我个人认为,这两者之间其实差不多,并没有哪一个比另一个出色得多。你应该选择最适合你的项目需求的包管理器。
我认为,在2018年,作为一名JS开发者,你最好同时熟悉npm
和yarn
,并且能够在这两者之间切换自如。
prettier - 一款偏执的代码格式化工具。
Prettier会解析你的代码,然后按照它自己的规则重新打印你的代码。它会根据最大行长度,在需要的时候进行换行。通过这样,Prettier可以强制使你的代码风格保持一致。
我热爱eslint,也一直是JavaScript Standard Style的长期用户。但是,像prettier和gofmt这样的自动代码格式化工具背后的理念具有无法抗拒的吸引力。
作为开发者,我们花费了太多时间和精力去操心代码的风格样式,而prettier减轻了这些担心的必要,使你能够专注于编写什么而不是如何编写。
图片来源:prettier
now - 非常简单的部署工具。
考虑到简单性、可靠性和功能集,Now绝对是如今最好的免费部署系统。它对于测试静态和动态发布非常有用,而且当你需要更多服务器的时候,可以很好地扩展。你可以一直免费使用它,直到你需要扩展的时候才需要付费。
Node.js和JS驱动的Web应用在它上面运行得非常好。另外,我还强烈推荐检出Zeit提供的其它模块,因为他们团队是由一些社区最好的JS开发者组成的。
图片来源:Zeit
asciinema - 高质量终端会话的免费记录工具。
可以查看我的上一篇博客《Making your Code Beautiful》(让你的代码更漂亮),详细了解如何利用asciinema来生成高质量的代码样式和截屏。
这一节值得专门写一篇完整的文章来进行介绍,尤其是现在,async & await已经开始成为JavaScript并行编程的事实标准。
也就是说,如果你还没有检出Sindre Sorhus的promise-fun模块,那么我强烈推荐你检出这个优秀的模块。我对这些模块唯一的抱怨是,它们好像不能在create-react-app和rollup之类的大部分前端工具链中开箱即用。
下面是一些最有用的模块,它们支持promise和async风格的Node代码:
pify - 将回调风格的函数Promise化。
有许多方法可以将函数从旧的回调方式转变为Promise风格,但是我发现pify是其中最好用的。它很小,提供了一些不错的细节,例如自动方法绑定,这在内置的util.promisify中是没有的。
p-map - promise并发管理
并发很棒,但是大部分时候,无论是为了限制网络带宽或者计算资源,你都会想要设置一个实际的并行限制。p-map在这方面非常突出。99%的时候,我会用它来替代Promise.all(...),因为Promise.all(...)不支持限制并行。
我在接触p-map之前,自己创建了一个并行限制模块async-awiat-parallel,但我还是推荐你使用p-map,因为它更好。😛
p-retry - 重试promise返回值函数或异步函数
我一般用p-retry包装所有HTTP请求和外部服务调用,给它们增加一层基本的健壮性。结合p-map,你可以用可控的并行方式处理大批量的外部请求,而不需要太担心偶然的传输错误、套接字挂断或者服务器超时。
p-timeout - 超过特定时间后使promise超时。
和p-retry一样,p-timeout通常是与第三方API和服务对接时,提高稳健性的必需模块。你可以指定一个备选反馈,因为通常情况下,直接给出反馈比没有明确时间提示的挂起等待或者等待超长时间之后才给出反馈要好得多。
p-cache或者p-memoize - 通过一个LRU(Least Recently Used,最近最少使用)缓存来缓存异步函数结果。
许多这些Promise工具的目的,都给了我很多架构稳健微服务的启发。在我的微服务架构中,每个外部依赖都可以被当作一个普通的接口,支持重试、超时、缓存、熔断、回退等。
功能性的优雅降级通常比系统崩溃或者根本不响应更可取,因此,如果还不太熟悉微服务,可以检出p-cache或p-memoize,看看它们的设计决策是否也能够帮助提升你的Promise处理能力。
有许多非常棒的网页抓取工具,其中一些操作原始的HTML,例如cheerio;其中一些模拟了一个完整的浏览器环境,例如puppeteer。你使用什么工具取决于你的真实使用场景,因为用原始HTML更快也更轻量,而自动化一个无头浏览器(headless browser)虽然更稳健但也更笨重一些,不容易上手。
cheerio - 专门为服务器端设计的快速、灵活、简洁的核心
jQuery
实现。
Cheerio真的非常适合只想操作原始HTML的快速混杂的网页抓取。它提供了一个稳健的类jQuery语法用来遍历并操作HTML文档。Cheerio配合request-promise-native抓取远程HTML文档特别好用。
puppeteer - Chrome无头浏览器的Node API
和cheerio不一样,puppeteer是一个用来自动化chrome无头浏览器实例的包装器,非常适合现代的JS单页应用。因为你就是在用Chrome本身,它对于解析、渲染和脚本执行的一致性支持非常棒。Chrome无头浏览器相对来说还比较新,但是它很可能会在接下来的几年里逐步淘汰较老的方案,例如PhantomJS。
如果你需要持续抓取网站,自动化基于Web的工作流,或者捕捉截图,puppeteer是一个明显的赢家,它会逐渐变得更受欢迎。
dotenv-safe -从
.env
文件加载环境变量并确保它们都生效。
这个模块继承了非常受欢迎的dotenv模块,通过一个.evn.example
文件来强制所需的环境变量文件。像原来的dotenv模块一样,它提供了针对Node的快速、安全和稳健的环境变量支持。
它还可以通过在now.json中配置"dotenv": true
来很好地与Zeit的now.sh部署脚本配合使用。
request 和 request-promise-native - 简化的HTTP请求客户端。
发起HTTP请求是一个非常普遍的操作,我的模块使用的是request-promise-native,它用原生的ES6 promise包装了原来的request模块。95%的时候,我都会await promise化的HTTP请求结果。其余5%的时候,我会直接使用响应流,在这种情况下,我使用底层的request模块,而不需要Promise支持。
通常情况下,为了稳健性,我会用p-retry、p-timeout和p-cache来一起包装request-promise-native调用。
另外值得一提的是,支持promise的got也可以作为request的一个比较新的备选模块,尽管我个人还没怎么用过这个模块。
const request = require('request-promise-native')
const html = await request('https://github.com')
console.log(html)
这是用request-promise-native下载HTML文档的一个例子
consolidate - 针对Node的模板引擎统一库。
Consolidate用来处理任何类型的后端模版(邮件、推特、原始HTML等)非常棒。我通常选择handlebars作为我的模版引擎,但是无论怎样,我总会用consolidate包装我的模版用例,因为它提供了一种简单一致的模版构建接口,而无论你在底层决定使用的是哪种模板引擎。
例如,我在create-react-library中使用consolidate,来用这个库相关的变量渲染boilerplate模板。
execa - 一个更好用的
child_process
。
如果你想要运行一个shell命令或者生成一个子进程,execa会非常好用。
fs-extra - 一个更好的
fs
(文件流模块),拥有额外的方法和Promise支持。
我发觉自己很少直接使用fs
了。试过fs-extra
后,你就再也不会回过头用fs了。
D3(Data-Driven Documents,数据驱动文档)是一个流行的用于数据可视化和动画渲染的前端库。它还包含一些非常棒的用于常见数学运算的单独包,我一直都选择用它们而不是其它可选模块。
d3-random - 从各种分布中生成随机数字。
当Math.random
不好使的时候,试一试d3-random吧。它为各种常见分布提供了样例,包括均匀分布、正态分布和指数分布。
d3-ease - 流畅的动画功能。
图片来源:d3-ease
d3-interpolate - 插入数字、颜色、字符串、数组、对象等任何东西!
这个模块提供了各种插入方法,用于在任意两个值之间混入其它值。这些值可能是数字、颜色、字符串、数组或者深层嵌套的对象。
ava - 杰出的JS测试运行框架。
我使用的Node.js单元测试运行框架,是由Sindre Sorhus创建的另外一个工具。Ava是一款比较新的测试运行框架,吸收了mocha、tape、chai和其它JS测试运行框架的优点,然后将所有这些优点拼在一起,形成一个非常棒的项目,并且配置了必要的默认值,可以让它“刚刚好能够工作”。
值得一提的是,Ava的测试任务默认是并行运行的。针对一些使用场景,例如数据测试,单元测试的顺序可能非常重要,你可以在文件级别关闭这个功能。
图片来源:ava
nock - 一个HTTP模拟库
Nock非常适合那些孤立地执行HTTP请求的测试模块。如果你的Node模块会发起HTTP请求,而你想要提供适当的单元测试,那么nock是个不错的选择。
sinon - 一个JS测试库
Sinon是一个非常有用的工具库,利用依赖注入来编写孤立的测试。每个Node开发者都应该掌握这个工具。
我期望这篇分析文章能够对你有所帮助,即使它只是让你了解到一个你之前没有听说过的好用的模块。我知道许多经验丰富的有志向的开发者,会针对常见问题提出他们自己的解决方案。但是有些时候,如果已经有一些优秀的方案,使用这些方案而不是不断重造轮子,也是不错的。
NPM模块库的规模和范围是空前的,而且我个人认为,这是JavaScript相比于其它编程语言的最大优势之一。你对npm模块利用得越好,你就会成为一名更快更高产的开发人员。类似这样的高阶“软”技能,是传说中的10x程序员的
特征之一。
有哪些你喜爱的npm模块,我漏掉了吗?在评论中分享你喜爱的模块,让我知道吧!
本文作者
Travis Fischer Automagical.ai的联合创始人和CTO。