Node.js 最佳实践 - 在 2017 年如何成为一名更好的 Node.js 开发者

5,722 阅读8分钟
原文链接: www.zcfy.cc

一年前,我发表的 在2016年如何成为一名更好的Node.js开发者 成功地引起了广泛关注,因此今年我想延续去年的主题,讲讲在2017年,如何成为一名更好的Node.js开发者。

在这篇文章中,我们将展望2017年Node.js的最佳实践,最热话题,以及我们需要关注什么,来提升自身能力。让我们开始吧!

Node.js 2017最佳实践

使用 ES2015

去年,我们也建议大家使用ES2015,和去年相比,今年有很大的改观。

一年前,Node.js v4 LTS,仅支持57% ES2015的语法,而现在,Node.js v6 LTS,支持了99% ES2015的语法。

也就是说,如果你正在使用最新的 LTS 版本的Node,你不需要再依赖babel,就可以使用ES2015的全部特性。不过即使是这样,你在浏览器端仍然需要使用 babel。

关于更多的Node.js版本对ES2015支持的细节,我推荐大家去Node.js官网上查看。

使用 Promises

promise的概念早在上个世纪八十年代就被提出,现在已经是大多数现代编程语言中支持的特性,让你能更轻松地实现异步模型。

想象如下场景,读取一个文件,把它转成JSON并输出文件名,如果用callback回调函数实现,代码如下:

fs.readFile('./package.json', 'utf-8', function (err, data) {  
  if (err) {
    return console.log(err)
  }

  try {
    JSON.parse(data)
  } catch (ex) {
    return console.log(ex)
  }
  console.log(data.name)
})

我们用Promises实现这个功能,可以提高代码的可读性:

fs.readFileAsync('./package.json').then(JSON.parse).then((data) => {  
  console.log(data.name)
})
.catch((e) => {
  console.error('error reading/parsing file', e)
})

当然,现如今使用fs模块并没有一个返回值为Promise的 readFileAsync API,为了让上述代码正常运行,你需要引入一个类似promisifyAll的模块。

使用 JavaScript Standard Style

当我们谈到代码风格时,在全公司统一标准是至关重要的,只有这样,当你想要改变你的项目时,你可以从容地从一步步从头开始,而不用担心基础的构建会有不一致性。

我们在RisingStack项目中使用了 JavaScript Standard Style 来构建我们的项目。

Node.js best practices - The Standard JS Logo

使用 Standard,你不需要配置 .eslintrc, .jshintrc, 或 .jscsrc 。 它安装后即可直接使用,具体你可以参考这里的 Standard 规则

使用Docker —— 在 2017 年,容器将成为标配

你可以把Docker镜像当成部署容器的工具。Docker就是部署软件运行环境的一个容器,它包含了你软件运行的大部分的基础环境:代码,运行时,系统工具,系统程序库,任何你能想到需要安装的东西。

为什么应该使用 Docker?

  • 隔离了运行环境和项目代码

  • 作为一个安全工具,让你的代码更加安全

  • 轻量的Docker镜像

  • 稳定的部署

  • 通过Docker你可以在本地看到你软件的运行环境

你可以参照官方新手引导文档完成你的第一个Docker,另外推荐Kubernetes 的最佳实践作为补充。

监控你的程序

当你的Node进程出现故障时,第一个知道的人应当是开发者,而不是用户。

一个开源的解决方案Prometheus可以帮助你解决进程崩溃的问题。 Prometheus是SoundCloud的一个开源工具箱,监听并报告进程崩溃问题。 Prometheus唯一的缺点是你需要手动设置并自己管理。

如果你在寻找一个开箱即用的方案,可以关注我们开发的 Trace by RisingStack ,也是一个不错的解决方案。

Trace能为我们做的

  • 警告

  • 生产环境中的内存和CPU分析

  • 分布式追踪,查找错误

  • 性能监控,

  • 保护你的npm包安全

Node.js Best Practices for 2017 - Use Trace and Profling

在后台进程中使用消息服务

如果你用HTTP发送消息,一旦接收服务停机了,所有消息都会丢失。但是,如果你选择一个支持持久化的传输层,比如消息队列来传输消息,你就不会有这个困扰。

如果接收服务停机,消息内容会被保持住,能够在稍后发出。如果服务没有停机,但是接收出了一点问题,服务将会在之后重试,从而保证数据不丢失。

一个例子: 假如你想要一次发送成百上千封邮件。在这个场景下,你只要将一些基本信息比如邮件地址和接收者姓名写下来,这时后台就好像邮递员一样,将邮件内容按基本信息规整后再将它们邮出。

这样的好处是,当邮路繁忙时,你可以随时横向扩展,没有邮件会被寄丢。如果你发现有大量的邮件需要同时处理,你可以添加更多的邮递员,让他们一同处理同一批邮件。

使用消息队列有很多选择:

使用最新的Node.js LTS版本

为了平衡稳定性和新特性,我们最推荐使用最新的 LTS(long-term support)版本。在写这篇文章的时候,最新的 LTS 版本是 6.9.2

为了更方便地切换Node版本, 你可以使用 nvm。 一旦你安装了它, 切换版本只需要敲两行命令:

nvm install 6.9.2  
nvm use 6.9.2

使用语义版本控制(Semantic Versioning)

在几个月前我们进行了一次 Node.js 开发者调查, 这一调查让我们对人们使用语义版本控制(semver)的情况有了一些了解。

不幸地是,我们发现只有71%的调查对象使用语义版本控制来发布/使用 npm 模块。这个比例应当更高,我们的观点是,每个项目都应当使用这种版本管理方式。为什么这么说,因为当我们更新包的时候,如果没有 semver,很容易把整个项目搞崩溃。

Node.js Best Practices for 2017 - Semantic versioning survey results

对你的项目和模块做版本控制是很关键的,你的用户必须知道,一个模块是否发布了新版本,以及在使用新版本之前他们需要做什么。

这就是语义版本控制的来历。你的模块版本号需要包括主版本号、副版本号、补丁版本号,更具体说:

  • 主版本号 当有不兼容的API变更时,更新主版本号。

  • 副版本号 当你为模块添加新的功能(不破坏原有 API)时,更新副版本号。

  • 补丁版本号 当你对模块做向后兼容、BUG修复时,更新补丁版本号。

npm 也根据 semver 来安装你的依赖,因此,当你发布模块的时候,一定要按照 semver 的规则来更新版本号。否则,你会破坏其他依赖你模块的应用程序!

保证应用的安全性

在2017年,保护你的用户信息安全将会是你构建项目的着重点。仅在2016年,就有 数百万用户账户被入侵 ,出现这个现象就是因为安全措施不到位。

想要在 Node.js 安全方面入门, 可以阅读我们的博客 Node.js Security Checklist,涵盖如下话题:

  • 安全的 HTTP Header,

  • 强制保护,

  • Session管理,

  • 不安全的依赖,

  • 数据校验

当你理解了这些基础概念, 你可以观看我的 Node 互动讨论 Surviving Web Security with Node.js

学习 Serverless

Serverless 是 AWS Lambda 提出的一个理念。该理念提出后,很快成长起来,并且建立了一个开放的开源社区。

可以预见在接下来的几年里,serverless 将成为构建新应用程序的标准。如果你想立足于这一领域的前沿,你需要从现在开始学习。

一个最流行的解决方案是 Serverless Framework, 它有助于布署 AWS Lambda 函数。

参与技术大会,在会议上演讲

参加技术会议是一个学习新趋势、开发技巧和最佳实践的好方式。当然更好的是,你可以借此认识更多的人。

如果你不仅仅满足于参会,我也鼓励你在这些会议上演讲!

在公众场合演讲很难,而“把每个听众都当成小白”不是一个好建议。我推荐你去 speaking.io 学习一些演讲的小技巧。

在2017年成为一名更好的 Node.js 开发者

2017年将会是 Node.js 大放光彩的一年,我们希望大家从Node.js开发中收获更多!

我们启动了一个新的学习课程叫做“掌握Node.js”,希望从这些方面加深大家对 Node.js 的理解

  • Node.js 异步编程

  • 创建 Express 服务器

  • 使用 Node 操作数据库

  • 项目结构和构建可扩展应用

我想了解更多!


如果你对这篇文章有任何疑问,请在评论区留言。