一年前, 我发表的 在 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 https://github.com/feross/standard 构建我们的项目.
使用代码规范, 你不需要使用 .eslintrc, .jshintrc, 或 .jscsrc 不需要加载其他文件到项目中. 如果你对代码规范没有思路, 你可以参考 Standard rules here.
使用 Docker
你可以把 Docker 镜像当成部署容器的工具. Docker 就是部署软件运行环境的一个容器, 它包含了你软件运行的大部分的基础环境: 代码, 运行时间, 系统工具, 系统程序库, 任何你能想到需要安装的东西.
为什么应该使用 Docker?
隔离了运行环境和项目代码
作为一个安全工具, 让你的代码更加安全
轻量的 Docker 镜像
稳定的部署
通过 Docker 你可以在本地看到你软件的运行环境
你可以参照网站 official getting started tutorial https://docs.docker.com/engine/getstarted/ 完成你的第一个 Docker, 另外推荐 Kubernetes best practices 作为补充.
监视你的程序
当你的 Node 进程出现故障时, 第一个知道的人应当是开发者, 而不是用户.
一个开源的解决方案 Prometheus https://prometheus.io/ 可以帮助你解决进程崩溃的问题. Prometheus 是 SoundCloud 的一个开源工具箱, 监听并提示进程崩溃问题. 唯一的缺点是你需要手动挂载在自己开发的域下.
如果你在寻找一个开箱即用的方案, 可以关注我们开发的 Trace by RisingStack https://trace.risingstack.com/ , 也是一个不错的解决方案.
Trace 能为我们做的
警告
记录收集项目的 CPU 数据
分布式追踪, 查找错误
性能监测,
保护你的 NPM 包安全
进行后台日志管理
如果你用 HTTP 发送请求, 只要接受停止, 整个消息都会丢失. 但是, 如果逆选择一个持久的传输层, 像一个消息队列一样传输消息, 你就不会有这个困扰.
如果接收服务停止, 消息传输还会继续, 将会在稍后发出. 如果服务没有挂掉, 它会有一个提示, 服务器将会重试, 因此没有数据会丢失.
一个例子: 假如你发送了几千封邮件, 在每一封里, 你都会写一些基础信息, 像邮件地址, 姓名, 签名, 这时后台就好像工人一样, 整理出一样地址的几百封, 一起发到同一个地址.
这样的好处是, 你可以随时查看每一封的状态, 没有邮件会被寄丢. 如果你发现几百封邮件同时丢了, 你可以进行后期操作, 让他们使用同一队列.
你可以使用借鉴如下日志管理工具:
- RabbitMQ https://www.rabbitmq.com/
- Kafka https://kafka.apache.org/
- NSQ http://nsq.io/
- AWS SQS https://aws.amazon.com/sqs/
使用最新的稳定的 Node.JS 版本
为了最好的开发体验, 我们最推荐的版本是最新版本和最新稳定版本, 在本文中, 我们更推荐最新长期稳定版本. 就是写这篇文章时的最新版本 6.9.2.
为了更轻松的切换 Node 版本, 你可以使用 https://github.com/creationix/nvm . 你安装一次, 输入这两个命令:
- nvm install 6.9.2
- nvm use 6.9.2
使用语义化的版本
在几个月前我们进行了一次关于 Node.JS Developer Survey 的分享, 我们呼吁并帮助大家认识并使用语义化的 Node 版本.
不幸的是, 我发现只有 71% 的调查对象使用语义化的版本, 在构建他们的项目. 这个比例应当更高, 我们的观点是, 每个项目都应当使用版本控制. 为什么这么说, 当我们更新包的时候, 如果没有版本控制, 很容易把整个项目搞崩溃.
对你的项目和模块做版本控制是很关键的, 你的用户必须知道, 什么时候发布了新版本, 他们需要做什么, 来获取新版本.
这就是为什么图片中展示的, 为什么这么多人使用语义化的版本控制, 你需要在版本控制中包含如下信息重点, 监听, 补丁
重点 当有不兼容的 API 更新时, 需要通过版本控制兼容
监听 在不终止服务的情况下增加新的 API
补丁 向下兼容, BUG 修复
NPM 也用了版本管理来管理你项目的依赖, 因此, 当你发布模块的时候, 一定要确认 NPM 包是否有相应的更新. 换个说法, 如果不看, 你也许会把其他系统弄崩溃.
维护应用的安全性
在 2017 年, 保护你的用户信息安全将会是你构建项目的着重点. 仅在 2016 年, 就有 数百万用户被账户入侵 , 出现这个现象就是因为安全措施不到位.
作为 Node.JS 安全的初学者, 你可以读我们的博客 Node.JS Security Checklist, 包含如下观点:
安全的 HTTP Header,
强制保护,
Session 管理,
处理依赖关系,
数据管理
当你理解了这些基础概念, 你可以在 Surviving web Security with Node.JS https://www.youtube.com/watch?v=80LbyikAUqI ! 留下你的观点
学习 Serverless
Serverless 是 AWS Lambda 提出的一个理念. 从此以后, 这种理念流行起来, 并且有了开放的讨论社区.
明年, serverless 将成为一个关于构建项目的专门的方向. 如果你想更上一层楼, 你需要从现在开始学习.
一个最流行的解决方案就是 Serverless Framework https://serverless.com/ , 这是由 AWS Lambda 部署的一个方案.
参加研讨会和见面会
参加研讨会和见面会是一个学习新趋势, 开发技巧和最佳实践的好机会. 当然也可以认识更多的人.
作为开始的第一步, 我建议你参加并在 one of these events 上演讲.
做一个公开的演讲很难, 吸引到每一个人的注意力更是难上加难, 而且这不是一个好的想法. 我推荐去 http://speaking.io/ 查看演讲的一些小技巧.
在 2017 年成为一名更好的 Node.JS 开发者
2017 年作为 - Node.JS 发力的一年, 我们希望大家从 Node.JS 开发中收获更多
我们启动了一个新的项目叫做掌握 Node.JS, 希望从这些方面加深大家对 Node.JS 的理解
Node.JS 异步编程
创建 Express 服务器
创建 Node 数据库
使用 Node 构建结构化, 可扩展的 App