如何在2016年成为一个更好的 Node.js 开发者

简介:

如何在2016年成为一个更好的 Node.js 开发者



本文主要讨论一些进行Node.js开发的最佳实践和建议,这些建议不仅仅适合开发者, 还适合那些管理与维护Node.js基础架构的工作人员。遵循本文提供的这些建议, 能够让你更好的进行日常的开发工作。

使用ES2015

在2015年的夏天,ES2015的最终草案(即ES6)正式发布了。该版本为JavaScript语言增加了大量的新的语言特性,主要包括:

  • 箭头函数
  • 模版字符串
  • 不定参数rest operator, argument spreading
  • 生成器
  • promises
  • maps, sets
  • symbols

以及很多其他特性。一个更加完整的新特性的列表你可以从Kyle SimpsonES6 and Beyond中进行了解。 并且它们中的绝大部分特性已经被加入到了Node.js v4中。

在客户端,你也可以借助Babel来使用ES6的所有新特性,Babel是一个JavaScript转译器。目前在服务器端, 我们只倾向于使用那些被加入到最新的稳定版本的特性,这样无需转译代码,这可以避免出现那些令我们头疼的潜在问题。

对于Node.js中的ES6的更多信息,你可以访问官方站点:https://nodejs.org/en/docs/es6/

回调约定 - 同时支持Promise

在去年,我们可能会推荐你为你的模块暴露错误优先的回调接口。但是随着生成器函数的正式标准化,并且异步函数也即将到来, 因此我们现在建议你在编写模块的接口时应该暴露支持Promise的的错误优先的回调函数。

为什么需要这样?首先回调接口是为了提供向后兼容性,为了能够在未来能够获得更好的兼容性,需要同时提供Promise支持。

你可以参考下面的例子来进一步的理解具体应该如何进行编程。在这个例子中readPackage函数读取了package.json文件, 并同时通过Promise和回调接口返回了它的内容。


  
  
  1. const fs = require('fs');
  2. function readPackage (callback) {
  3. // as of now we do not have default values in Node.js
  4. callback = callback || function () {}
  5. return new Promise((resolve, reject) => {
  6. fs.readFile('./package.json', (err, data) => {
  7. if (err) {
  8. reject(err);
  9. return callback(err);
  10. }
  11. resolve(data);
  12. return callback(null, data);
  13. })
  14. })
  15. }
  16. module.exports.readPackage = readPackage;

异步模式

在Node.js中,很长一段时间你只有两种方法来管理异步流:回调或者Stream。对于回调函数而言, 你可以使用类似于async这类库, 对于流而言,有throughblhighland等库可以选择。

但是随着Promise、生成器、异步函数等被逐渐引入进标准的ECMAScript,JS中的流程控制也得到了极大的改善。

关于异步JavaScript的发展历史,你可以参考异步JavaScript的发展历程这篇博文。

错误处理

错误处理在应用开发过程中起着至关重要的作用:确定应用崩溃的时间,或者仅仅是打印错误信息,确保应用继续运行都是有一定难度的。

为了能够更简单的说明这个问题,我们决定将其分为两种:程序员错误programmer errors运算错误operational errors

程序员错误就是我们所说的bug,由于你不知道程序运行的确切状态因此当出现错误时你最好立刻停止应用的运行crash the process

另一方面,运算错误是由于系统或者远程服务本身所导致的问题。例如:请求超时和内存不足等。基于错误发生的特点,你可以对症下药, 然后重试,例如文件丢失,你可以去创建相应的文件。

在回调中进行错误处理

如果一个错误发生在异步操作的过程中,错误对象应该作为异步函数的第一个参数进行传递。你必须始终要检查该错误对象并进行错误处理。

在前面的有关回调约定的例子里面已经展示了如何在回调函数中进行错误的优先处理。

在Promise中进行错误处理

如果是下面的代码片段会发生什么情况?


  
  
  1. Promise.resolve(() => 'John')
  2. .then(() => {
  3. throw new Error('ops');
  4. })
  5. .catch((ex) => {
  6. console.log(ex);
  7. })
  8. .then(() => {
  9. throw new Error('ups');
  10. console.log(Doe');
  11. })
  1. 在第3行会抛出一个异常。
  2. catch会处理它,并且在stdout中打印出:[Error: ops]
  3. 执行继续,并且在第9行会抛出一个新的错误
  4. 没有了

的确没有什么了 - 最后一个被抛出的错误将会是静默的。你需要注意,你应该始终以一个catch语句作为promise链的最后一环。 这会为你解决很多头疼的问题。像下面这样:


  
  
  1. Promise.resolve(() => 'John')
  2. .then(() => {
  3. throw new Error('ops');
  4. })
  5. .catch((ex) => {
  6. console.log(ex);
  7. })
  8. .then(() => {
  9. throw new Error('ups');
  10. console.log(Doe');
  11. })
  12. .catch((ex) => {
  13. console.log(ex);
  14. });

现在会输出如下内容:


  
  
  1. [Error: ops]
  2. [Error: ops]

使用JavaScript标准风格

在过去几年中,我们会使用JSHint、JSCS、ESLint等非常有用的代码质量工具来尽可能的自动化检查我们的代码。

最近,当谈到代码风格的时候,我们使用ferossJavaScript标准风格

原因是它非常的简单:无需任何配置文件,只需要将其放到项目中。主要包括如下一些规则:

  • 使用2个空格作为缩进
  • 字符串使用单引号 - 除了为了避免转义
  • 不要包括没有被使用的变量
  • 没有分号
  • 永远不要以 ( 或者 [ 作为一行的开始
  • 关键字后加空格 if (condition) { ... }
  • 函数名后加空格 function name (args) { ... }
  • 始终使用===代替==,但是可以使用obj == null来检查null || undefined
  • 始终要处理Node.js的err函数参数
  • 始终要为浏览器全局变量增加window前缀,除了documentnavigator
  • 尽可能避免使用类似于openlengthevetname等走位浏览器全局变量。

当然,如果你的 编辑器只支持ESLint的话,这里有一个ESLint的规则库用于使用标准风格,即eslint-plugin-standard。 安装了这个插件后,你的.eslintrc文件可以是下面这样的:


  
  
  1. {
  2. "plugins": [
  3. "standard"
  4. ],
  5. }

12-Factor应用The Twelve-Factor Application

如今,软件通常会作为一种服务来交付,它们被称为网络应用程序,或软件即服务(SaaS)。 12-Factor应用宣言描述了进行Web应用开发的最佳实践:

  1. 基准代码:一份基准代码,多份部署
  2. 依赖:显示声明依赖
  3. 配置:在环境中存储配置
  4. 后端服务:把后端服务当作附加资源
  5. 构建、发布、运行:严格分离构建和运行
  6. 进程:以一个或多个无状态进程运行应用
  7. 端口绑定:通过端口绑定提供服务
  8. 并发:通过进程模型进行扩展
  9. 易处理:快速启动和优雅终止可最大化健壮性
  10. 开发环境与线上环境等价:尽可能的保持开发、预发布、线上环境相同
  11. 日志:把日志当作事件流
  12. 管理进程:后端管理任务当作一次性进程运行

这套理论适用于任意语言和后端服务(数据库、消息队列、缓存等)开发的应用程序。

开始新的项目

始终通过npm init命令来开始一个新项目。这可以为你的项目创建一个初始的package.json

如果你想跳过初始的提问并直接使用默认的配置,只需要运行npm init --yes即可。

监控你的应用

当发生某个故障或是故障即将发生时,及时的通知你,能够为你挽回损失。

为了进行应用的监控,你可以使用类似的SaaS产品或是开源软件。在开源软件方面,主要包括:ZabbixCollectedElasticSearchLogstash

如果你不想要自己进行部署,可以考虑使用线上的服务,你可以尝试使用Trace, 它是我们公司开发的Node.js和微服务监控解决方法。

使用构建系统

尽可能的自动化一切东西。没有什么比让开发来做应该让grunt做的事情更无聊和令人恼火的了,这不仅浪费时间,而且没有意义。

现如今JavaScript的这类工具已经非常的丰富了,包括Grunt, Gulp, 和Webpack,你知道几个就行。

在RisingStack,绝大部分的前端开发新项目都是使用Webpack来进行自动化构建,其他类型的则使用gulp实现自动化任务。 对于新手而言,Webpack可能会花费大量的时间去理解,所以我强烈建议你去阅读一下Webpack Cookbook

使用最新的长期支持LTS的Node版本

为了能够更好的获取稳定性和新特性,我们建议你使用最新的Node的LTS(长期支持)版本,它们是使用偶数发布编号的版本。 当然,你也可以自由的使用最新的实验版本,即称为稳定发布版本的使用奇数发布编号的。

如果你需要为多个项目工作,并且使用了不同的Node.js版本,建议你最好使用一个Node版本管理器——nvm

更多信息你可以参考Node.js官方网站的发布信息:

What You Should Know about Node.js v5 and More

每周更新你的项目依赖

养成每周更新一次你的项目依赖的习惯。这方面,你可以使用npm outdated或者是ncu包。

选择合适的数据库

当我们谈到Node.js和数据库的时候,可能你想到的第一个技术是MongoDB。当然这并没有什么错,但是你不应该直接就去使用它。 在这么做之前你需要问你自己和你的团队几个问题。包括下面几个:

  • 应用会有结构化数据吗?
  • 应用会进行交易处理吗?
  • 数据需要存放多长时间?

可能你需要的仅仅是Redis,或者是如果你有结构化数据,那么你要用的可能是PostgrelSQL。 如果你需要在Node.js中使用SQL的话,你可以看看knex

使用语义版本控制Semantic Versioning

语义版本控制是一种为了兼容性空啊率的使用三段式版本号的正式约定,即:major.minor.patch,分别为主版本,次版本,补丁。

如果是一个不会向后兼容(backward-compatible)的API变化使用主版本号。当添加新的特性且API变化是向后兼容的时候使用次版本号。 如果只是对Bug进行修复可以使用包版本号。

幸运的是,你可以使用semantic-release这个模块自动化你的JavaScript的模块发布。

坚持阅读

在JavaScript和Node.js世界,坚持保持对最新的新闻和技术进展的关注是件具有挑战的事情。 为了能够让这件事变得简单,确保你订阅了如下几个媒体:


本文来自云栖社区合作伙伴“Linux中国”
原文发布时间为:2013-04-02.

相关文章
|
7月前
|
JavaScript 前端开发 Java
掌握 JavaScript:从初学者到高级开发者的完整指南(一)
掌握 JavaScript:从初学者到高级开发者的完整指南(一)
|
7月前
|
JSON JavaScript 前端开发
掌握 JavaScript:从初学者到高级开发者的完整指南之JavaScript对象(二)
掌握 JavaScript:从初学者到高级开发者的完整指南之JavaScript对象(二)
|
4月前
|
运维 JavaScript Serverless
Serverless革命:一键上云,Egg.js开发者的超级加速器!
【8月更文挑战第8天】本教程介绍如何结合Egg.js与Serverless技术简化Web应用部署。首先确保已安装Node.js及npm,并使用`egg-init`脚手架创建新应用。接着添加`egg-serverless`插件支持Serverless部署,编写基本的应用代码及路由规则。通过配置`fc.yml`文件集成阿里云Function Compute作为Serverless平台,并借助`@alicloud/fun`工具完成部署。最后,通过部署生成的URL验证应用是否成功上线。采用Serverless架构,开发者可以专注于业务逻辑,大幅提高部署效率和资源利用。
63 5
|
4月前
|
JavaScript 前端开发 测试技术
Vue.js开发者必看!Vue Test Utils携手端到端测试,打造无懈可击的应用体验,引领前端测试新风尚!
【8月更文挑战第30天】随着Vue.js的普及,构建可靠的Vue应用至关重要。测试不仅能确保应用质量,还能提升开发效率。Vue Test Utils作为官方测试库,方便进行单元测试,而结合端到端(E2E)测试,则能构建全面的测试体系,保障应用稳定性。本文将带你深入了解如何使用Vue Test Utils进行单元测试,通过具体示例展示如何测试组件行为;并通过Cypress进行E2E测试,确保整个应用流程的正确性。无论是单元测试还是E2E测试,都能显著提高Vue应用的质量,让你更加自信地交付高质量的应用。
83 0
|
4月前
|
JavaScript 开发者 UED
Vue.js组件库大对决:Element UI与Vuetify,开发者的罗密欧与朱丽叶!
【8月更文挑战第30天】Element UI和Vuetify是Vue.js开发中的热门组件库,前者简洁高效,后者遵循Material Design,国际化程度高。两者均提供丰富的组件支持,但Vuetify组件更多样,设计更灵活;Element UI在性能和中文支持上更优。文档方面,Element UI更直观易懂,而Vuetify配置灵活但学习成本稍高。选择时需综合考虑项目需求、团队背景及设计风格,以达到最佳开发效果。
220 0
|
6月前
|
JavaScript 前端开发 编译器
探讨TypeScript如何帮助JavaScript开发者避免这些常见错误,从而提高代码质量和开发效率
【6月更文挑战第13天】TypeScript,JavaScript的超集,通过添加静态类型检查和面向对象特性,帮助开发者避免常见错误,提升代码质量和开发效率。它能检测类型错误,防止运行时类型转变引发的问题;使用可选链和空值合并避免引用错误;通过枚举减少逻辑错误中的魔法数字;接口和泛型等特性提高代码可维护性。学习TypeScript对提升JavaScript开发质量有显著效果。
66 4
|
7月前
|
JavaScript 前端开发 安全
【JavaScript与TypeScript技术专栏】TypeScript如何帮助JavaScript开发者避免常见错误
【4月更文挑战第30天】TypeScript,JavaScript的超集,通过静态类型检查和面向对象特性,帮助开发者避免类型错误、引用错误和逻辑错误,提升代码质量和可维护性。它引入类型注解、接口、可选链和空值合并,使代码更清晰、安全。对于大型项目,TypeScript的接口、类和泛型有助于代码结构化和模块化。学习TypeScript能提高JavaScript开发效率。
56 0
|
7月前
|
前端开发 JavaScript API
网页开发者必看!5种JS跳转页面技巧,提升用户交互体验
欢迎来到前端入门之旅!这个专栏是为那些对Web开发感兴趣、刚刚开始学习前端的读者们打造的。无论你是初学者还是有一些基础的开发者,我们都会在这里为你提供一个系统而又亲切的学习平台。我们以问答形式更新,为大家呈现精选的前端知识点和最佳实践。通过深入浅出的解释概念,并提供实际案例和练习,让你逐步建立起一个扎实的基础。无论是HTML、CSS、JavaScript还是最新的前端框架和工具,我们都将为你提供丰富的内容和实用技巧,帮助你更好地理解并运用前端开发中的各种技术。
|
7月前
|
前端开发 JavaScript 安全
JavaScript 中的宿主对象和原生对象:开发者必知的基础知识(下)
JavaScript 中的宿主对象和原生对象:开发者必知的基础知识(下)
JavaScript 中的宿主对象和原生对象:开发者必知的基础知识(下)
|
7月前
|
XML 存储 JavaScript
JavaScript 中的宿主对象和原生对象:开发者必知的基础知识(上)
JavaScript 中的宿主对象和原生对象:开发者必知的基础知识(上)
JavaScript 中的宿主对象和原生对象:开发者必知的基础知识(上)