当前位置: 首页 > 后端技术 > Node.js

【翻译】635000个npm包我该用哪一个

时间:2023-04-03 19:54:42 Node.js

原文:635000个npm模块我该选哪个?-CoreyCleary原译,发表于个人博客何兴的清醒生活在Node或JavaScript前端开发上投入了时间和精力,那么你就知道npm中有数十万个模块可供选择。开发人员不断寻求帮助/抱怨:“选择模块的困难正在吞噬我们”“模块X和模块Y有什么区别?哪个更好?”“npm很棒,但这些模块可能会在一年左右后死亡,这取决于模块维护者的活跃程度”通常当问这样的问题时,你会得到十个不同的答案。每个人都会向你推荐他们最喜欢的模块,然后就变成了争论哪个最好。选择npm模块时很容易陷入困境。有这么多选择,新手鼓吹“上船”,为您的项目选择正确的npm模块可能会让人望而生畏。许多这些模块做类似(或相同)的事情也无济于事。与其浪费时间谷歌搜索、npmjs.org,甚至更多时间不构建你的项目,不如弄清楚何时选择哪些模块。精选列表为了帮助解决这个问题,您将在下面找到最常见问题类型(即Web框架、模板、身份验证等)的npm模块列表,以及何时使用它们。这里有一些注意事项:您可能熟悉其中一些模块,甚至其中很多模块,但有时您会面临一个您尚未接触过的技术堆栈(可能是身份验证或Websockets之类的东西),您需要知道有哪些替代模块可以完成这项工作。您可能有一个您认为更好的模块,或者可能有此处未涵盖的用例/需求。我没有列出同一类别的10个不同模块,而是缩小了范围,这样您就可以避免分析瘫痪的陷阱。如果您认为未涵盖您的用例,请自行研究。此清单的目的是让您更快地启动和运行。这些模块的选择基于:他们完成工作的程度如何社区规模(对于支持/故障排除很重要)积极维护如果您发现自己仍然没有足够的信息来做出决定,我推荐slant.co和nodejs.libhunt。com帮助进行比较。注意:为了保持合理的范围,这些模块是在考虑服务器端的情况下制作的。其中一些可以同时在客户端或服务器上使用,但我的原则是“服务器优先”。HTTP请求(HTTP请求)请求:当你需要基于回调的HTTP请求时选择此项,例如从一个REST服务连接到另一个。axios当你需要基于Promise的HTTP请求时可以选择它注意:你可以使用request-promise,但是axios依赖较少并且是基于原生的Promises应用使用轻量级的web框架,请使用它你不介意使用回调作为异步处理的默认方式模块生态使用框架非常繁荣你需要一个大的社区来支持和故障排除使用Koa时更干净的框架更像一个中间件层,它不提供开箱即用的模板或路由,所以更适合API开发要支持开箱即用,你需要async/awaitHapi如果你想要一个比Express或Koa更多的“电池”(译者注:原来的“电池”意味着你不必重新发明轮子,大多数您需要的功能的一部分可以通过(现有的)库来完成。您可以导入和使用它们。),但不如Sails,使用它Sails当你需要像Rails这样的东西时,使用它,它几乎拥有一切(但取决于你的应用程序你可能不需要那么多)Validation(前端验证)Ajv用于当JSON需要被验证(比如来自网络请求)并且你想与应用程序的其他非JS部分共享这些验证规则(因为它是JSON,你可以这样做)Joi在需要验证输入时使用,并且就像链接调用的风格(译者注:代码见下文),而不是在JSON中定义验证规则你正在使用Hapi(Hapi带有Joi)constschema=joi.object().keys({id:joi.string().guid().required(),用户名:joi.string().alphanum().min(8).required()});Authentication(认证)Passport:当你需要提供你的Use当一个网站或API使用认证中间件你希望能够在多种认证类型(Oauth、Facebook等)之间进行选择你需要管理sessionAsynchronous(异步)Async(library):当你需要使用旧版本的NodeES6原生promises(原生JS,而不是npm)时:使用大于0.12的Node版本时要考虑的另一件事是你的团队对Promises的接受程度。在2018年,大多数开发人员应该对async/await(原生JS,而不是npm)没问题当你试图逃离“回调地狱”但错误地进入“Promise地狱”时,你有很多来自Promises(数据库)的.then和.catchDatabase下面是数据库驱动程序、ORM和查询构建器的组合。在使用ORM之前,我强烈建议您首先确定您需要使用它。当您只能使用原始SQL或查询构建器时,它们通常会添加另一层不一定提供足够收益的抽象层。mysql、node-postgres:当你不需要完整的ORM但想使用原始SQL查询数据库时使用(这些是驱动程序)node-mongodb-native:当你不需要完整的ORM但想查询时directlyUseMongooseforMongoDB:UseKnexwhenyouwantanORMforMongoDB:当你不需要完整的ORM解决方案,而只是一些使编写查询代码更容易的工具时使用它Knex是一个生成SQL的查询生成器你有一个Postgres、MSSQL、MySQL、MariaDB、SQLite3、Oracle或AmazonRedshift数据库Objection.js:你想要一个支持Knex支持的一切的ORM,不使用查询DSL(所以你编写的代码更接近原始SQL),有一个Promise的API和很好的文档流程管理(processmanagement)这个网址提供了一些流程管理器的横向比较http://strong-pm.io/compare/。注意:它们还包括StrongLoopProcessManager,这是一个不错的工具,但有点笨拙。我建议您在决定使用StrongLoop之前查看解决方案。PM2:当您希望进程管理器在服务崩溃时处理重新启动并允许您控制集群时使用注意:PM2所基于的AGPL许可证有一些潜在的违规行为。这里有一些讨论。我的看法是它最有可能被使用。但如果您有任何疑问,请咨询您的法律部门,因为我不是律师。forever:当你需要一个进程管理器来处理在服务崩溃时重启服务并且你的部署很小(pm2及其集群支持更大的部署)时使用。如果你只有少量的服务/进程,那么你或许可以使用nodemon:当你想监视应用程序中的任何代码更改时使用,并在本地开发时自动重启服务器非常适合开发!WebSockets对于WebSockets,我只是推荐primus,不列清单。它支持所有主要的WebSockets实现,并且拥有非常活跃的维护者。如果您需要切换到另一个库,只需更改一行代码即可轻松实现。Primus:当你需要WebSockets但不想绑定到特定的WebSockets实现时使用API文档Swagger-node:使用Utilities/misc(通用工具/misc)Lodash:当你需要JS实用程序库时使用很多OOP(面向对象编程)Ramda:当你想要一种函数式编程风格时使用你想要像lodash这样的东西,但在函数式编程范例时刻:当你需要解析、验证、操作和显示日期/时间时使用UUID:当你需要随机的、唯一的、难以破解的ids时使用NVM:当你希望能够在环境中安装时在多个Node版本之间切换时使用Fs-extra:当你需要能够递归使用时使用NodemailerNode中缺少mkdir、rm-rf和其他文件系统级功能:当您需要从Node发送电子邮件时使用Dotenv:当您需要将环境变量从.env文件加载到process.env时使用CLI(命令行界面)Commander:当你想构建一个将所有参数作为命令行标志的CLI程序时使用你一系列的问题生成一个package.json文件)LoggingWinston:UseBunyanwhenyouneedalogginglibraryandneeddifferentlogoutputformats:UsewhenyouneedalogginglibraryanduseJSONastheonlylogoutputformat你要对不同的组件、请求或功能使用不同的日志记录(即,这些记录器可能会以不同方式解析事件)Morgan:当您使用Express并希望记录HTTP请求时使用注意:这将适用于Winston或Bunyan。由于它是中间件,它知道如何处理请求并记录它,但不像Winston和Bunyan那样处理日志输出的传输。Templating(前端模板)Pug(原Jade):当你需要一个服务器端模板引擎时使用这个引擎,它易于阅读并且支持开箱即用的子组件代码块你只需要输出HTMLEJS:当你需要完全使用JS并允许空格缩进的服务器端模板引擎(Pug不支持)注意:不支持异步JS函数测试Mocha:当您需要编写和运行单元测试时使用Chai:当您需要证明时单元测试,使用注意:这将与MochaChai-as-promised一起工作:当你想证明你对承诺的断言时,而不是将断言放在then或catch中使用Sinon:当你需要一个模拟库来测试ESdoc时使用工具:当你想从你的代码中生成API文档并且你使用的是最新的JS版本时,默认使用支持当前版本JS的(支持类),所以如果你在代码中使用原型,请使用JSdoc使用它当出现语法和代码格式问题时(译者注:请参考我的博文vscode+vetur+eslint+prettier实现团队代码风格统一)调试(debugging)现在,nativeNodedebugging已经足够了,我的建议是直接使用它。几年前引入一些npm模块很有帮助,你可能有一个特定的用例需要一个,但现在有足够的原生支持,如果你没有任何太疯狂的调试要求,一定要忽略删除额外的依赖项。结论选择模块可能很困难,但您只需要一些方法点就可以绕过它。当您浪费时间决定要做什么,或者甚至不知道从哪里开始时,请使用本指南来提供帮助。