熟习 Node 或前端 JavaScript 事情的同学都知道,社区中的可用模块有数十万之多。
开拓职员常常会提问或抱怨,比如说:
在谈到这些问题时,你常日会得到十个不同的答案。每个人都会向你推举他最宝贝的模块,然后大家就会为哪个模块是最好的这个话题吵得不可开交。

选择 npm 模块时随意马虎碰着“剖析瘫痪”这种情形。可选项实在太多了,还总有一大堆新模块被吹成是“你,值得拥有”,想要为自己的项目选出得当的模块实在不是件随意马虎的事情。而且许多模块做的事情都是差不多(或者完备一样)的,更给人添乱。
实在你用不着摧残浪费蹂躏韶光在谷歌或 npmjs.org 上乱搜一通,影响你的运用构建事情;你要做的便是知道在什么时候选择哪些模块。
一、精选列表
为了帮你办理这个问题,本文针对各种最常见的问题类型制作了一份模块列表(例如 Web 框架、模板、身份验证等),并见告你这些模块该当何时利用。
有一些把稳事变:有些模块你可能已经很熟习了,但有时你会碰着完备陌生的技能栈(比如说身份验证或 Web Socket 之类),这时候你须要知道用哪些模块可以完成事情。你可能以为某款模块更出色。也可能你的用例 / 需求不不才面的列表里。我并没有在每个分类下塞一堆选项,而是只管即便精简,避免陷入剖析瘫痪的陷阱。如果你的场景比较分外,那么就得自己做些调查来做补充了;这个列表的目的是让你更快地投身事情。
这些模块是基于下面的原则挑选出来的:
它们完成事情的能力如何。社区规模(对支持 / 故障打消很主要)。积极掩护如果你还是以为信息不敷,难下决定,我建议利用 slant.co 和 nodejs.libhunt.com 来做比较。npmtrends.com 这个网站可以比拟不同包的下载量 / 问题数 /GitHub 星数,也很有用(感谢 Bill 推举)。
把稳:为了掌握范围,记住这些模块都是做事真个。很多模块既能在客户端也能在做事端利用,但总的来说是“做事端优先”原则。二、HTTP 要求1、Request:
须要发起基于回调的 HTTP 要求时利用,例如从一个 REST 做事到另一个 REST 做事。
2、Axios:
须要发起基于 Promise 的 HTTP 要求时利用。
把稳:可以利用 request-promise,但 axios 的依赖项更少,而且是基于原生 Promise 的。
三、Web 框架
1、Express:
你的 API、网站或单页运用须要一个轻量级 Web 框架时用它。
你不介意利用开箱即用的回调来实现异步。
你希望有一个搭配框架利用的丰富的模块生态系统。
你希望框架有一个大型社区来供应支持并打消故障。
2、Koa:
你想要比 Express 还轻量的框架时就选它。
Koa 更像是一个中间件层,不供应开箱即用的模板或路由,更适宜 API 开拓。
你想要开箱即用的 async/await 支持。
3、Hapi:
你想要一个比 Express 或 Koa 有更多“部件”的框架时选它,但它集成的东西没 Sails 那么多。
4、Sails:
你想要像 Rails 之类的东西时就用它,它集成了一大堆东西(但个中有很多可能是你用不着的)。
四、验证1、Ajv:
在须要验证 JSON 时利用(例如来自一个 Web 要求的 JSON)。
你想与运用程序的非 JS 部分共享这些 schema(它是 JSON,以是你可以这样做)。
2、Joi:
你须要验证输入并且喜好它下面这种样式时就用它
它不是在 JSON 中定义 schema
你正在利用 Hapi(Joi 自带它,开箱即用)
五、身份验证1、Passport:
须要为你的网站或 API 利用身份验证中间件时用它。
你希望能选择多种身份验证类型(Oauth,Facebook 等)。
你须要管理会话。
六、异步
1、Async(库):
你须要利用只支持回调,不支持 Promise 的旧版 Node 时选它
2、ES6 原生 Promise(原生 JS,不是 npm):
利用 Node 0.12 以上版本时用它。
还要考虑你的团队是否熟习 Promise。现在大多数开拓者该当都很熟习了。
3、async/await(原生 JS,不是 npm):
你好随意马虎逃离了回调地狱,结果又掉进 Promise 地狱的时候用它。
你有很多来自 Promise 的.then 和.catch
七、数据库:下面列出了数据库驱动程序、ORM 和查询构建器等内容。先别急着找 ORM,我强烈建议你先确认自己的确用得着 ORM 再说。很多时候用原始的 SQL 或查询构建器就够了,而 ORM 会加入另一层抽象,性价比不足高。
1、mysql、node-postgres:
在不须要完全的 ORM 时利用,它们利用原始的 SQL 查询数据库(这些是驱动程序)
2、node-mongodb-native:
在不须要完全的 ORM 时利用,它会直接查询 MongoDB
3、Mongoose:
你更想在 MongoDB 上利用 ORM 时用它
4、Knex:
你不须要完全的 ORM 办理方案,只是想在写查询代码时方便一些就用它。
Knex 是一个天生 SQL 的查询构建器。
你有一个 Postgres、MSSQL、MySQL、MariaDB、SQLite3、Oracle 或 Amazon Redshift 数据库。
5、Objection.js:
你想要一个支持 Knex 所有功能的 ORM,不用查询 DSL(以是你写的代码更靠近原始 SQL),还有一个基于 Promise 的 API 和详尽的文档。
八、进程管理想要比拟进程管理器的话,可以参考 http://strong-pm.io/compare/ 。把稳:它们还会同时比拟 StrongLoop 进程管理器,后者挺好用但是有些繁芜。我建议你先找找办理方案,然后再决定是否利用 StrongLoop。
1、PM2:
你须要一个能够在做事崩溃时重新启动做事,并能用来掌握集群的进程管理器时选它。
把稳:听说 PM2 可能违反 AGPL 容许证,干系谈论可以看这里。我认为它用起来没什么问题。但如果你有问题 / 疑虑就请咨询你的法律部门,由于我不是状师。
2、forever:
你想要一个能在做事崩溃时重启做事的进程管理器时可以选它。
你的支配比较小(支持集群的 pm2 适用于更大规模的支配)。如果你只有少量做事 / 进程,那么用 forever 就很得当。
3、nodemon:
你想监视运用程序中的任何代码变动,并在本地开拓时自动重启做事器时用它。
它非常适宜开拓事情!
九、Web Socket:
Web Socket 这里我单推 primus。它支持所有盛行的 Web Socket 实现,而且更新掩护很勤快;如果你想换个库用,那么改一行代码就能轻松切换不同的库了。
1、Primus:
你须要 Web Socket,但又不想局限在某个特定的 Web Socket 实现时用它。
十、API 文档1、Swagger-node:
你须要为 REST API 编写文档,并须要针对端点测试要求时用它。
十一、实用程序 / 杂项:1、Lodash:
在须要 JS 实用程序库时利用。
你利用了大量的 OOP。
2、Ramda:
你想用更加函数式的风格编程,用函数组合写代码时用它。
你想在函数式编程中利用 lodash 一类的东西。
3、Moment:
在须要解析、验证、操作和显示日期 / 韶光时利用。
4、UUID:
须要很难破解的随机、独特的 id 时用它。
5、NVM:
你希望能在环境中安装的多个版本 Node 之间切换时用它。
6、FS-EXTRA:
你须要递归 mkdir、rm -rf 和 Node 中短缺的其他文件系统实用程序时用它。
7、Nodemailer:
须要从 Node 中发送电子邮件时利用。
8、Dotenv:
须要将.env 文件中的环境变量加载到 process.env 时利用。
十二、CLI1、Commander:
你要构建一个 CLI 实用程序,将所有参数作为命令行上的标志时就用它。
2、Inquirer:
你想要构建一个按顺序确定选项的“交互式”CLI 实用程序时用它(类似运行 npm init 时的方法,它会问你一系列问题来天生 package.json 文件)。
十三、日志
1、Winston:
在须要日志库和不同的日志输出时利用。
2、Bunyan:
在须要日志库时利用,并且可以处理 JSON 是唯一的日志输出的情形。
你想为不同的组件、要求或功能利用不同的日志记录器(比如说这些记录器可能以不同的办法解析)。
3、Morgan:
在利用 Express 并且想要记录 HTTP 要求时利用。
把稳:它是和类似 Winston 或 Bunyan 的工具并用的。由于它是中间件,以是知道如何处理要求并记录它,但不会像 Winston 和 Bunyan 那样卖力传输到日志输出中。
十四、模板1、Pug(原 Jade):
你须要一个易读的做事端模板引擎并附带开箱即用的子布局块支持时就用它。
你的输出只有 HTML。
2、EJS:
你须要一个完备利用 JS 的做事端模板引擎并且可以容忍空格缩进时选它(Pug 没有缩进)
把稳:它不支持异步 JS 函数。
十五、测试1、Mocha:
在须要编写和运行单元测试时利用。
2、Chai:
你的单元测试须要一个断言库时用它。
把稳:它和 Mocha 是搭配利用的。
3、Chai-as-promised:
你须要针对 promise 的断言库,但不想用 then 或 catch 时用它。
4、Sinon:
须要一个 mocking 库进行测试时利用。
十六、工具1、ESdoc:
你在利用较新版本的 JS,想从代码中天生 API 文档时用它。
支持当前版本的 JS,默认目标 class。以是如果你在代码中利用原型,请利用 JSdoc。
2、JSdoc:
你须要支持 ES6 的代码 API 文档天生器时用它。
支持类和原型。
3、ESlint:
你须要一个 linter 来自动查找(和修复)代码中的语法和模式问题时选它。
十七、调试目前 Node 的原生调试已经够用了,我建议用原生功能就行。几年前一些额外的 npm 模块还能有些帮助,有的特定场景可能用得着;但是现在有了足够的原生支持,如果你没什么猖獗的调试需求就最好省却额外的依赖项。
小结挑选模块可能会很费事,但用些技巧就能事半功倍。如果你犯了选择困难症,乃至不知道从哪里下手的话就看看本文的推举吧。
英文原文: https://www.coreycleary.me/which-of-the-635000-npm-modules-do-i-choose/