持续创作,加速成长!这是我参与「掘金日新计划 · 6 月更文挑战」的第1天,点击查看活动详情
根据 StackOverflow 开发人员调查,Node.js 是过去几年开发人员中最受欢迎的开发框架。它是一个运行在 V8 引擎上开源、跨平台、后端 JavaScript 的运行时环境。
语法简单易懂,最适合异步和事件驱动的编程。因此,开始使用 Node.js 很容易,但是一旦你进入高级编程,你就需要处理代码复杂性和可能变成麻烦的错误。
但是,遵循最佳 Node.js 实践可以减少代码中出现错误和漏洞的可能性,并使你的应用免受最常见的 Node.js 陷阱的影响。
1.始终使用 npm init 创建一个新项目并保存确切的包版本
NPM 是 Node.js 包的包管理器,主要用于安装依赖项。始终使用 npm init 创建项目,它将帮助你生成 package.json 文件。
$ mkdir my-new-project$ cd my-new-project$ npm init
Npm 使用 JSON 来获取有关这些字段的最终文档以及它们的作用。
使用 npm install <pkg> —— 之后保存以安装一个包并将其作为依赖项保存在 package.json 文件中。
例如,如果你使用包 express 它将被写成:
$ npm install express — save
它将包及其安装版本保存到 package.json 文件中,如下所示
“express”: “^4.17.1”,
这里前置的 ^ 表示版本在 “>=4.17.1<5.0.0” 之间的包是被应用程序所接受的。
因此,当你团队中的某个人运行 npm install 时,它将安装该软件包的最新版本。如果最新版本与软件包的初始版本不兼容,则可能导致行为差异或错误。
然而,对于开发团队而言,让包保持在同一个版本上很重要。这可以通过使用 .npmrc 文件来实现。它具有确保 npm install 始终更新 package.json 并强制版本相同的有用属性。
这可以通过在终端中运行以下命令来简单地完成
npm install express --save --save-exactOrnpm config set save-exact=true
运行上述命令后,依赖会被保存,并将锁定到你安装的版本。
译者注:
save-exact=true将会拒绝安装(甚至考虑安装)任何声称与当前 Node.js 版本不兼容的包。node 版本虽然也影响包的安装,但其实项目里包含 package-lock.json 文件是更好的选择。
2.添加脚本
NPM 有一个标准启动 node 应用程序的方式。使用 start 键将脚本属性和对象添加到你的 package.json 中。如下所示:
“scripts”: {“start”: “node myapp.js”}
当有人运行 npm start 时,NPM 会运行 node myapp.js 并在你的 $PATH 上运行 node_modules/.bin 中的所有依赖项。因此不需要全局安装 NPM 模块。
3.使用环境变量
在你的应用代码中使用 Node.js 中的环境变量查找来自 process.env 的值。要确定你正在运行哪些环境变量,检查 NODE_ENV 环境变量。
console.log(“Running in :” + process.env.NODE_ENV);
4. 使用风格指南
如果你在团队中开发一个项目,每个开发者的编码风格不可避免地会存在差异。大多数开发人员更喜欢特定的样式指南以使代码可读。
不幸的是,如果你需要处理不同编码风格的代码,你最终将花费数小时手动重新调整大括号、空格和制表符的位置。因此,为了保持高效,团队的最佳选择是选择特定的风格指南并在整个项目中遵循相同的风格。
以下是一些流行的科技公司使用的风格指南。
- Google’s style guide on GitHub
- Idiomatic style guide on GitHub
- JavaScript Standard style guide on GitHub
- jQuery style guide on their website
此外,可以使用一些工具来确保执行所选样式指南的规则。
- Prettier
- ESLint
- Automate Format and Lint on Save
- Husky
- Lint-staged
- With Husky and Lint-staged Combined
- EditorConfig
5. 异步结构
同步功能使应用程序逻辑的流程易于理解。但是直到它自己完成,它会阻止任何其他代码运行。
你可以使用 -trace-sync-io(译者注:该配置只能跟踪同步 io 操作,但并不是所有同步功能都是 io 操作) 标志在代码中跟踪同步函数,当遇到同步 API 时会显示警告。
另一方面,ES6 中的 async/await 结构为阻塞问题提供了解决方案。因此作为一个 Node 开发者,你必须使用 async/await 而不要陷入同步功能中。
译者注:更多的时候封装 Promise 是更好的方式,可以更好地捕获处理异常和错误
6.错误处理
忽略代码中的错误处理会使调试变得比应有的更加困难。应用程序中的一个错误可能会花费你数十亿美元。因此,良好的异常管理对于应用程序很重要。
错误处理并不能消除代码中的错误。但是,它使您的代码足够聪明,可以应对意外出错的事情。
处理错误的最佳方法是使用 .catch() 处理程序,它将干净地传播所有要处理的错误。
7. 避免使用 V8 引擎标志进行垃圾收集。
译者注:文章内容却是建议使用标识手动回收和进行调试分析😂
Node (V8) 通过垃圾回收来管理堆内存。它释放了不再从堆栈中引用的对象所使用的内存,以便为新对象的创建腾出空间。
但是,如果您的内存使用量不可预测地膨胀,则可能不是由于内存泄漏,而是由节点的空闲行为引起的。
该问题可以通过调节应用程序的垃圾收集器来解决,您可以使用 V8 引擎标志和 chrome 调试器展示垃圾收集器以调试内存问题。
node —-expose-gc —-inspect myapp.js
8. 保持你的应用程序无状态
如果你将会话、用户数据、缓存等数据存储在应用程序本身中,则其范围将仅限于该特定进程。因此,你需要将其存储在外部数据存储中。
保持应用程序无状态使应用程序能够在系统故障中幸存下来,而不会损害其服务和性能。
为此,您可以使用 AWS Lambda 等默认强制执行无状态行为的无服务器(serverless)平台。
9.使用日志工具
Console.log 是一个很棒的工具,但在生产应用程序中存在局限性,因此你不能将它用于满足所有日志记录需求。它没有提供足够的配置选项,例如,没有过滤器选项来过滤日志。
Node 有几个可以在你的应用程序中使用的日志框架。日志记录的选择取决于你的业务需求和资源限制。
Bunyan、Winston 和 Pino 是一些很好的日志框架示例。它使 Node.js 日志记录更简单、更高效。这是一种比使用代理更好的日志记录方法,因为代理会增加资源消耗和延迟。
日志库有助于构建、格式化和传输日志消息,而不会增加任何可观的开销。
10. 测试你的应用程序
在将应用程序投放市场之前对其进行测试至关重要。无论你的应用程序开发处于哪个阶段,引入测试永远不会太晚。
测试对于发现缺陷和错误很重要,这保证了软件的质量,使软件更加可靠和易于使用。
专家建议为每个报告的错误编写测试。因此你必须知道:
- 如何复现错误(确保先测试失败了!)
- 如何修复错误(确保修复错误后通过测试)
- 确保该错误不再发生。
以下是 Node.js 应用程序最流行的测试库:
- Mocha
- Jest
- Jasmine
- AVA
总结
在这篇文章中,我们讨论了十种 Node.js 开发的最佳实践方法。依照这些操作帮助你编写更好的 Node.js 应用。
“如果你正在使用 Node.js 作为后端开发应用程序,请尝试 DhiWise ,它支持干净的代码架构,使你能够更快地构建可扩展的应用程序并简化代码维护”