首页 > 编程语言 >9 个 Node.js 最佳实践原则!

9 个 Node.js 最佳实践原则!

时间:2024-10-17 12:52:34浏览次数:10  
标签:Node 依赖 js 最佳 API 测试 使用

你好,前端开发爱好者。

Node.js 是现代应用开发的基石之一,超过 630 万网站和无数 API 使用 Node.jsNode.js 以事件驱动的架构为核心,支持高并发和非阻塞 I/O 操作,是构建高性能应用的理想选择。

虽然它功能强大,但有效管理和扩展 Node.js 应用需要丰富的经验。今天的文章中总结了九个重要原则,帮助大家开发高性能、可扩展且易维护的 Node.js 应用。

1. 避免阻塞事件循环

Node.js 的事件循环是其性能和可扩展性的关键。事件循环负责处理异步操作,确保应用保持响应状态。阻塞事件循环会导致性能下降、增加延迟,甚至使应用无响应。

如何避免阻塞事件循环?

  • 分解复杂任务:将复杂任务拆分为较小的异步步骤,例如使用 Promiseasync/await
  • 卸载 CPU 密集型任务:将计算密集型操作隔离到工作线程中,例如使用 piscina 库。
  • 缓存和去重:减少 CPU 密集型操作后的 API 调用,可使用 async-cache-dedupe 库。
  • 监控事件循环使用率:使用 perf_hooksunder-pressure 插件监控事件循环性能,识别瓶颈。

2. 监控 Node.js 特有的指标

仅依赖标准指标往往不足以有效排除故障。监控 Node.js 应用性能需要结合多个工具和自定义仪表板。

关键监控指标

  • 内存使用情况:监控 heap 内存的使用比例(已用堆内存 vs 总堆内存)。
  • RSS:测量进程占用的物理内存总量。
  • CPU 使用率:与事件循环使用率 (ELU) 结合,避免过早缩放。
  • 事件循环使用率:测量事件循环的活跃时间占总时间的比例,量化事件循环的繁忙程度。

度量指标并采取行动

  • 避免基于内存消耗进行扩展Node.js 会使用所有可用内存,不应在内存使用率达到 60-80% 时扩展或终止进程。
  • 基于 CPU 指标进行扩展时考虑 ELUNode.js 使用 100% 可用 CPU 并不意味着不可响应。
  • 制定应急计划:包括自动回滚、金丝雀部署、容器化和编排、事故响应程序等。

3. 在生产环境中使用 Node.js LTS 版本

Node.js LTS 版本线提供更长的支持期限,提高生产环境的稳定性和安全性。

使用 LTS 版本的好处

  • 减少破坏性变更的风险:LTS 版本优先考虑与现有包和模块的兼容性。
  • 增强安全性:及时获得安全更新。
  • 提高稳定性:LTS 版本经过严格测试,提供更可预测和可靠的运行环境。

最佳实践

  • 监控 LTS 发布计划:及时了解即将发布的 LTS 版本,制定迁移策略。
  • 彻底测试:迁移到新的 LTS 版本前,进行全面测试。
  • 依赖管理工具:使用 npm audityarn audit 识别和解决依赖中的漏洞。

4. 尽可能自动化测试、代码审查和一致性检查

编写自动化测试

建立全面的测试策略,确保代码可靠性和可维护性,同时加速开发流程。

测试最佳实践

  • 定义测试用例:为每个测试用例创建配置或夹具。
  • 优先进行实时测试:与真实系统互动发现潜在的集成问题。
  • 专注于行为测试:主要验证代码的外部行为。
  • 消除测试不稳定性:持续调查和解决测试失败问题。
  • 减少全局状态:减少全局状态有助于提高测试稳定性。

测试覆盖率

  • 单元测试:验证单个代码单元的正确性。
  • 集成测试:验证不同组件之间的交互。
  • 端到端测试:模拟真实用户场景,确保应用按预期工作。

选择合适的测试框架

  • 建议使用 VitestNode-tapjest-light-runnerMocha 等更适合 Node.js 的测试框架。
  • 对于涉及浏览器的端到端测试,推荐使用 playwright

5. 避免依赖膨胀

依赖的复杂性

每个新包可能引入更多依赖,导致依赖树复杂化,难以管理和理解潜在风险。

策略

  • 使用原生 Node.js API:优先使用原生模块(如 fshttppath)。
  • 默认使用原生 API:了解和利用 Node.js 提供的最新 API,比如现代的 fetch API。

高效管理模块

利用 NPM 进行代码重用,分享内部代码,避免重复开发。

6. 降低依赖风险

定期扫描依赖中的漏洞

使用工具如 npm auditSocket.devSnyk 进行漏洞管理,保持依赖安全。

选择高质量依赖

选择有良好维护记录和测试充分的包,避免引入不必要的依赖。

7. 避免全局变量、配置或单例

使用依赖注入模式

将依赖显式传递,而不是依赖隐式全局访问,提高代码可测试性和可维护性。

遵循高内聚、低耦合原则

  • 高内聚:模块应专注于单一职责,易于理解和修改。
  • 低耦合:模块间依赖应尽量减少,减少意外副作用,提高可维护性。

8. 处理错误并提供有意义的日志

错误处理

捕获和管理执行过程中可能发生的错误,防止应用崩溃。

提供详细日志

记录错误、请求和响应信息、性能指标和应用状态,以便有效排查问题。

选择日志库

推荐使用 Pino,一个低开销、高性能且配置灵活的 Node.js 日志库。

9. 使用 API 规范并自动生成客户端

确立清晰、一致的 API 规范

定义 API 结构、数据类型和操作,促进协同和集成。

自动生成客户端代码

使用工具如 OpenAPI Generatorgraphql-codegen,提高开发效率,减少错误风险。

总结

遵循这九大原则,能帮助你打造高效、可扩展、易维护的企业级 Node.js 应用,同时积极参与和支持开源项目,为 Node.js 社区的繁荣做出贡献。希望这些知识能助你提升 Node.js 开发水平,构建出经得起时间考验的出色应用。

如果今天的文章有帮到你,希望能够得到一个免费的点赞和关注~

标签:Node,依赖,js,最佳,API,测试,使用
From: https://blog.csdn.net/ConardLi/article/details/143010038

相关文章

  • 基于Node.js+vue高中生心理健康管理系统(开题+程序+论文) 计算机毕业设计
    本系统(程序+源码+数据库+调试部署+开发环境)带文档lw万字以上,文末可获取源码系统程序文件列表开题报告内容选题背景高中生心理健康问题一直是教育领域和社会关注的焦点。随着社会竞争的加剧和学业压力的增大,高中生面临的心理压力也日益增加。近年来,国内外关于高中生心理健......
  • 基于Node.js+vue辅导员职责信息管理系统(开题+程序+论文) 计算机毕业设计
    本系统(程序+源码+数据库+调试部署+开发环境)带文档lw万字以上,文末可获取源码系统程序文件列表开题报告内容选题背景辅导员职责信息管理系统的设计与开发,旨在提高辅导员工作效率,优化学生管理流程。当前,关于辅导员职责信息管理的研究主要集中在辅导员工作流程的优化、学生信......
  • jsp东哈驾校管理系统的设计与实现dy35m(程序+源码+数据库+调试部署+开发环境)
    本系统(程序+源码+数据库+调试部署+开发环境)带论文文档1万字以上,文末可获取,系统界面在最后面。系统程序文件列表学员,教练,报名登记,退学登记,练车预约,考试预约,报考信息,报考反馈,成绩信息开题报告内容一、项目背景随着汽车保有量的不断增加,驾驶培训行业迎来了巨大的发......
  • jsp订餐管理系统的设计与实现3v4h1--(程序+源码+数据库+调试部署+开发环境)
    本系统(程序+源码+数据库+调试部署+开发环境)带论文文档1万字以上,文末可获取,系统界面在最后面。系统程序文件列表用户,厢房信息,厢房预约,菜品分类,特色美食,员工信息,营业统计开题报告内容一、项目背景随着餐饮行业的数字化转型,订餐管理系统成为提升餐厅运营效率、优化顾......
  • jsp动物园管理系统的设计与实现zoejc程序+源码+数据库+调试部署+开发环境
    本系统(程序+源码+数据库+调试部署+开发环境)带论文文档1万字以上,文末可获取,系统界面在最后面。系统程序文件列表饲养员,后勤人员,动物类型,动物信息,食谱定制,物资信息,物资入库,排班申请,排班申请2,工资信息开题报告内容一、研究背景与意义随着城市化进程的加快和公众对......
  • Nodejs中process.cwd()与__dirname的区别
    Nodejs中process.cwd()与__dirname的区别2018-03-214104版权 简介: 首先,上官方解释。=>process.cwd(): The process.cwd() methodreturns thecurrentworkingdirectoryoftheNode.jsprocess.上面的意思就是,process.cwd()返回的是当前Node.js进程执行时的工作目......
  • spring boot fastjson Long 转字符串
     由于Long类型返回给前端时,如果数值过大,会导致精度丢失,这时候就需要把Long转成String。这时候如果专门为其写一个属性来存储,比较麻烦。这时候可以使用fastJson里的标签@JSONField(serializeUsing=ToStringSerializer.class)只要在model类上的Long字段加上这个标签,则会......
  • EasyPlayer.js 很不错的在线直播播放器支持h.265 h.264
    下载地址:https://github.com/EasyDarwin/EasyPlayer.js?tab=readme-ov-file代码比较简单:<scriptsrc="/scripts/EasyPlayer/EasyPlayer-pro.js"></script><divclass="demo_play"name="demo_play"></div><script>......
  • vue中的js:获取小括号中的字符串并且做替换
    1)js正则表达式替换小括号中的斜杠:conststr="这是一个(带有/斜线)的字符串,(还有另一个/斜线)需要替换";letreplacedStr=str.replace(/\(.*?\)/g,function(match){returnmatch.replace(/\//g,'AAA');//替换括号内的斜线});console.log(replacedStr);......
  • 采用黑白仪表盘风格提高清晰度-Stimulsoft Dashboards.JS 2024.4.1
    采用黑白仪表盘风格提高清晰度2024年10月16日StimulsoftDashboards.JS2024.4.1采用了时尚、现代的设计和一致的报告格式,并采用了新的单色预设主题。StimulsoftDashboards.JS是一个JavaScript库,旨在在Web应用程序中构建交互式仪表板。......