w3ctech

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

本文转载自:众成翻译 译者:净化 链接:http://www.zcfy.cc/article/2174 原文:https://blog.risingstack.com/node-js-best-practices-2017/?utm_source=RisingStack+Engineering&utm_campaign=bac8ae4234-EMAIL_CAMPAIGN_2016_12_28&utm_medium=email&utm_term=0_02a6a69990-bac8ae4234-474920353

一年前,我发表的 在2016年如何成为一名更好的Node.js开发者 获得了广泛的欢迎,因此今年我想延续去年的主题,讲讲在2017年,如何成为一名更好的Node.js开发者。

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

使用 ES2015

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

当时,Node.js v4版本作为长期支持版本,仅支持57% ES2015的语法,经过了一年,Node.js v6版本作为长期支持版本,支持了99% ES2015的语法。

也就是说,如果你正在使用最新的长期支持版本的Node,你不需要添加任何的babel,也可以使用ES2015编辑整个项目。

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

使用 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的模块,给它运行的环境。

使用代码规范

当代码规范被称为代码规范时,就意味着,至少在公司范围内推行,所以,当你想要改变你的项目时,意味着从0开始,不需要为之前的人的代码而懊恼。

我们RisingStack使用了我们的代码规范 JavaScript Standard Style 构建我们的项目。

Node.js best practices - The Standard JS Logo

使用代码规范,你不需要使用 .eslintrc, .jshintrc, 或 .jscsrc 不需要加载其他文件到项目中。 如果你对代码规范没有思路,你可以参考 Standard rules here.

使用Docker

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

为什么应该使用 Docker?

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

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

  • 轻量的Docker镜像

  • 稳定的部署

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

你可以参照网站 official getting started tutorial完成你的第一个Docker,另外推荐 Kubernetes best practices 作为补充。

监视你的程序

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

一个开源的解决方案Prometheus 可以帮助你解决进程崩溃的问题。 Prometheus是SoundCloud的一个开源工具箱,监听并提示进程崩溃问题。 唯一的缺点是你需要手动挂载在自己开发的域下。

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

Trace能为我们做的

  • 警告

  • 记录收集项目的CPU数据

  • 分布式追踪,查找错误

  • 性能监测,

  • 保护你的npm包安全

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

进行后台日志管理

如果你用HTTP发送请求,只要接受停止,整个消息都会丢失。但是,如果逆选择一个持久的传输层,像一个消息队列一样传输消息,你就不会有这个困扰。

如果接收服务停止,消息传输还会继续,将会在稍后发出。如果服务没有挂掉,它会有一个提示, 服务器将会重试,因此没有数据会丢失。

一个例子: 假如你发送了几千封邮件,在每一封里,你都会写一些基础信息,像邮件地址,姓名,签名,这时后台就好像工人一样,整理出一样地址的几百封,一起发到同一个地址。

这样的好处是,你可以随时查看每一封的状态,没有邮件会被寄丢。如果你发现几百封邮件同时丢了,你可以进行后期操作,让他们使用同一队列。

你可以使用借鉴如下日志管理工具:

使用最新的稳定的Node.js版本

为了最好的开发体验,我们最推荐的版本是最新版本和最新稳定版本,在本文中,我们更推荐最新长期稳定版本。就是写这篇文章时的最新版本 6.9.2

为了更轻松的切换Node版本, 你可以使用 nvm。 你安装一次, 输入这两个命令:

nvm install 6.9.2  
nvm use 6.9.2

使用语义化的版本

在几个月前我们进行了一次关于 Node.js Developer Survey 的分享, 我们呼吁并帮助大家认识并使用语义化的Node版本。

不幸的是,我发现只有71%的调查对象使用语义化的版本,在构建他们的项目。这个比例应当更高,我们的观点是,每个项目都应当使用版本控制。为什么这么说,当我们更新包的时候,如果没有版本控制,很容易把整个项目搞崩溃。

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

对你的项目和模块做版本控制是很关键的,你的用户必须知道,什么时候发布了新版本,他们需要做什么,来获取新版本。

这就是为什么图片中展示的,为什么这么多人使用语义化的版本控制,你需要在版本控制中包含如下信息重点,监听,补丁

  • 重点 当有不兼容的API更新时,需要通过版本控制兼容

  • 监听 在不终止服务的情况下增加新的API

  • 补丁 向下兼容,BUG修复

npm也用了版本管理来管理你项目的依赖,因此,当你发布模块的时候,一定要确认npm包是否有相应的更新。换个说法,如果不看,你也许会把其他系统弄崩溃。

维护应用的安全性

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

作为Node.js安全的初学者, 你可以读我们的博客Node.js Security Checklist, 包含如下观点:

  • 安全的 HTTP Header,

  • 强制保护,

  • Session管理,

  • 处理依赖关系,

  • 数据管理

当你理解了这些基础概念, 你可以在 Surviving Web Security with Node.js!留下你的观点

学习Serverless

Serverless是AWS Lambda提出的一个理念。从此以后,这种理念流行起来, 并且有了开放的讨论社区。

明年, serverless 将成为一个关于构建项目的专门的方向。如果你想更上一层楼,你需要从现在开始学习。

一个最流行的解决方案就是Serverless Framework, 这是由 AWS Lambda部署的一个方案。

参加研讨会和见面会

参加研讨会和见面会是一个学习新趋势,开发技巧和最佳实践的好机会。当然也可以认识更多的人。

作为开始的第一步,我建议你参加并在one of these events 上演讲。

做一个公开的演讲很难,吸引到每一个人的注意力更是难上加难,而且这不是一个好的想法。我推荐去 speaking.io 查看演讲的一些小技巧。

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

2017年作为- Node.js发力的一年,我们希望大家从Node.js开发中收获更多

我们启动了一个新的项目叫做掌握Node.js,希望从这些方面加深大家对Node.js的理解

  • Node.js异步编程

  • 创建Express服务器

  • 创建Node数据库

  • 使用Node构建结构化,可扩展的APP

我想了解更多!


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

w3ctech微信

扫码关注w3ctech微信公众号

共收到1条回复

  • 赞!

    回复此楼