goldbergyoni /nodebestpractices

✅ The Node.js best practices list (July 2026)

★ 105,721⑂ 10,743👁 1,915⑃ 1,018● 345▤ 0◈ 0
DockerfileCC-BY-SA-4.0Created 2017-09-15twitter.com/nodepractices/
105,721
stars
+5
10,743
forks
1,915
watchers
1,018
prs
345
issues
0
releases
0
discussions

README

[✔]: assets/images/checkbox-small-blue.png

 Node.js 最佳实践


  





    




  Follow us on Twitter! @nodepractices
 

 欢迎! 首先您应该知道的三件事情

1. 当您读到这里,实际上您读了很多关于Node.js的优秀文章 - 这是对Node.js最佳实践中排名最高的内容的总结和分享

2. 这里是最大的汇集,且每周都在增长 - 当前,超过50个最佳实现,样式指南,架构建议已经呈现。每天都有新的issue和PR被创建,以使这本在线书籍不断更新。我们很乐于见到您能在这里做出贡献,不管是修复一些代码的错误,或是提出绝妙的新想法。请查看我们的milestones

3. 大部分的条目包含额外的信息 - 大部分的最佳实践条目的旁边,您将发现 🔗Read More 链接,它将呈现给您示例代码,博客引用和更多信息



 目录

1. 项目结构实践 (5) 
2. 异常处理实践 (11) 
3. 编码规范实践 (12) 
4. 测试和总体质量实践 (8) 
5. 进入生产实践 (16) 
6. :star: 新: 安全实践(23)
7. Performance Practices (coming soon)


1. 项目结构实践

 ![✔] 1.1 组件式构建你的解决方案

 TL;DR: 大型项目的最坏的隐患就是维护一个庞大的,含有几百个依赖的代码库 - 当开发人员准备整合新的需求的时候,这样一个庞然大物势必减缓了开发效率。反之,把您的代码拆分成组件,每一个组件有它自己的文件夹和代码库,并且确保每一个组件小而简单。查看正确的项目结构的例子请访问下面的 ‘更多’ 链接。

否则: 当编写新需求的开发人员逐步意识到他所做改变的影响,并担心会破坏其他的依赖模块 - 部署会变得更慢,风险更大。当所有业务逻辑没有被分开,这也会被认为很难扩展

🔗 更多: 组件结构



 ![✔] 1.2 分层设计组件,保持Express在特定的区域

TL;DR: 每一个组件都应该包含'层级' - 一个专注的用于接入网络,逻辑,数据的概念。这样不仅获得一个清晰的分离考量,而且使仿真和测试系统变得异常容易。尽管这是一个普通的模式,但接口开发者易于混淆层级关系,比如把网络层的对象(Express req, res)传给业务逻辑和数据层 - 这会令您的应用彼此依赖,并且只能通过Express使用。

否则: 对于混淆了网络层和其它层的应用,将不易于测试,执行CRON的任务,其它非-Express的调用者无法使用

🔗 更多: 应用分层



 ![✔] 1.3 封装公共模块成为NPM的包

TL;DR: 由大量代码构成的一个大型应用中,贯彻全局的,比如日志,加密和其它类似的公共组件,应该进行封装,并暴露成一个私有的NPM包。这将使其在更多的代码库和项目中被使用变成了可能。

否则: 您将不得不重造部署和依赖的轮子

🔗 更多: 通过需求构建



 ![✔] 1.4 分离 Express 'app' and 'server'

TL;DR: 避免定义整个Express应用在一个单独的大文件里, 这是一个不好的习惯 - 分离您的 'Express' 定义至少在两个文件中: API声明(app.js) 和 网络相关(WWW)。对于更好的结构,是把你的API声明放在组件中。

否则: 您的API将只能通过HTTP的调用进行测试(慢,并且很难产生测试覆盖报告)。维护一个有着上百行代码的文件也不是一个令人开心的事情。

🔗 更多: 分离 Express 'app' and 'server'



 ![✔] 1.5 使用易于设置环境变量,安全和分级的配置

TL;DR: 一个完美无瑕的配置安装应该确保 (a) 元素可以从文件中,也可以从环境变量中读取 (b) 密码排除在提交的代码之外 (c) 为了易于检索,配置是分级的。仅有几个包可以满足这样的条件,比如rc, nconf, config 和 convict。

否则: 不能满足任意的配置要求将会使开发,运维团队,或者两者,易于陷入泥潭。

🔗 更多: 配置最佳实践



⬆ 返回顶部

2. 错误处理最佳实践

 ![✔] 2.1  使用 Async-Await 和 promises 用于异步错误处理

TL;DR: 使用回调的方式处理异步错误可能是导致灾难的最快的方式(a.k.a the pyramid of doom)。对您的代码来说,最好的礼物就是使用规范的promise库或async-await来替代,这会使其像try-catch一样更加简洁,具有熟悉的代码结构。

否则: Node.js回调特性, function(err, response), 是导致不可维护代码的一个必然的方式。究其原因,是由于混合了随意的错误处理代码,臃肿的内嵌,蹩脚的代码模式。

🔗 更多: 避免回调



 ![✔] 2.2 仅使用内建的错误对象

TL;DR: 很多人抛出异常使用字符串类型或一些自定义类型 - 这会导致错误处理逻辑和模块间的调用复杂化。是否您reject一个promise,抛出异常或发出(emit)错误 - 使用内建的错误对象将会增加设计一致性,并防止信息的丢失。

否则: 调用某些模块,将不确定哪种错误类型会返回 - 这将会使恰当的错误处理更加困难。更坏的情况是,使用特定的类型描述错误,会导致重要的错误信息缺失,比如stack trace!

🔗 更多: 使用内建错误对象



 ![✔] 2.3 区分运行错误和程序设计错误

TL;DR: 运行错误(例如, API接受到一个无效的输入)指的是一些已知场景下的错误,这类错误的影响已经完全被理解,并能被考虑周全的处理掉。同时,程序设计错误(例如,尝试读取未定义的变量)指的是未知的编码问题,影响到应用得当的重启。

否则: 当一个错误产生的时候,您总是得重启应用,但为什么要让 ~5000 个在线用户不能访问,仅仅是因为一个细微的,可以预测的,运行时错误?相反的方案,也不完美 – 当未知的问题(程序问题)产生的时候,使应用依旧可以访问,可能导致不可预测行为。区分两者会使处理更有技巧,并在给定的上下文下给出一个平衡的对策。

🔗 更多: 运行错误和程序设计错误



 ![✔] 2.4 集中处理错误,不要在Express中间件中处理错误

TL;DR: 错误处理逻辑,比如给管理员发送邮件,日志应该封装在一个特定的,集中的对象当中,这样当错误产生的时候,所有的终端(例如 Express中间件,cron任务,单元测试)都可以调用。

否则: 错误处理的逻辑不放在一起将会导致代码重复和非常可能不恰当的错误处理。

🔗 更多: 集中处理错误



 ![✔] 2.5 对API错误使用Swagger文档化

TL;DR: 让你的API调用者知道哪种错误会返回,这样他们就能完全的处理这些错误,而不至于系统崩溃。Swagger,REST API的文档框架,通常处理这类问题。

否则: 任何API的客户端可能决定崩溃并重启,仅仅因为它

Top issues

Snapshot: 2026-11-10T09:35:25Z · Data license Apache-2.0 · JSON