关闭 x
IT技术网
    技 采 号
    ITJS.cn - 技术改变世界
    • 实用工具
    • 菜鸟教程
    IT采购网 中国存储网 科技号 CIO智库

    IT技术网

    IT采购网
    • 首页
    • 行业资讯
    • 系统运维
      • 操作系统
        • Windows
        • Linux
        • Mac OS
      • 数据库
        • MySQL
        • Oracle
        • SQL Server
      • 网站建设
    • 人工智能
    • 半导体芯片
    • 笔记本电脑
    • 智能手机
    • 智能汽车
    • 编程语言
    IT技术网 - ITJS.CN
    首页 » Node.js »如何在2016年成为一个更好的 Node.js 开发者

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

    2016-01-20 00:00:00 出处:ITJS
    分享

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

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

    使用ES2015

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

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

    以及很多其他特性。一个更加完整的新特性的列表你可以从Kyle Simpson的ES6 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和回调接口返回了它的内容。

    const fs = require('fs');
    
    function readPackage (callback) {
      // as of now we do not have default values in Node.js
      callback = callback || function () {}
      return new Promise((resolve, reject) => {
        fs.readFile('./package.json', (err, data) => {
          if (err) {
            reject(err);
            return callback(err);
          }
          resolve(data);
          return callback(null, data);
        })
      })  
    }
    
    module.exports.readPackage = readPackage;

    异步模式

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

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

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

    错误处理

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

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

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

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

    在回调中进行错误处理

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

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

    在Promise中进行错误处理

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

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

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

    Promise.resolve(() => 'John')
      .then(() => {
        throw new Error('ops');
      })
      .catch((ex) => {
        console.log(ex);
      })
      .then(() => {
        throw new Error('ups');
        console.log(Doe');
      })
      .catch((ex) => {
        console.log(ex);
      });

    现在会输出如下内容:

    [Error: ops]
    [Error: ops]

    使用JavaScript标准风格

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

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

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

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

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

    {
        "plugins": [
            "standard"
        ],
    }

    12-Factor应用(The Twelve-Factor Application)

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

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

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

    开始新的项目

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

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

    监控你的应用

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

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

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

    如何在2016年成为一个更好的 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世界,坚持保持对最新的新闻和技术进展的关注是件具有挑战的事情。 为了能够让这件事变得简单,确保你订阅了如下几个媒体:

    Node.js新闻通信周刊 微服务新闻通信周刊 Changelog周刊 —— 开源新闻
    上一篇返回首页 下一篇

    声明: 此文观点不代表本站立场;转载务必保留本文链接;版权疑问请联系我们。

    别人在看

    抖音安全与信任开放日:揭秘推荐算法,告别单一标签依赖

    ultraedit编辑器打开文件时,总是提示是否转换为DOS格式,如何关闭?

    Cornell大神Kleinberg的经典教材《算法设计》是最好入门的算法教材

    从 Microsoft 下载中心安装 Windows 7 SP1 和 Windows Server 2008 R2 SP1 之前要执行的步骤

    Llama 2基于UCloud UK8S的创新应用

    火山引擎DataTester:如何使用A/B测试优化全域营销效果

    腾讯云、移动云继阿里云降价后宣布大幅度降价

    字节跳动数据平台论文被ICDE2023国际顶会收录,将通过火山引擎开放相关成果

    这个话题被围观超10000次,火山引擎VeDI如此解答

    误删库怎么办?火山引擎DataLeap“3招”守护数据安全

    IT头条

    平替CUDA!摩尔线程发布MUSA 4性能分析工具

    00:43

    三起案件揭开侵犯个人信息犯罪的黑灰产业链

    13:59

    百度三年开放2.1万实习岗,全力培育AI领域未来领袖

    00:36

    工信部:一季度,电信业务总量同比增长7.7%,业务收入累计完成4469亿元

    23:42

    Gartner:2024年全球半导体营收6559亿美元,AI助力英伟达首登榜首

    18:04

    技术热点

    iOS 8 中如何集成 Touch ID 功能

    windows7系统中鼠标滑轮键(中键)的快捷应用

    MySQL数据库的23个特别注意的安全事项

    Kruskal 最小生成树算法

    Ubuntu 14.10上安装新的字体图文教程

    Ubuntu14更新后无法进入系统卡在光标界面解怎么办?

      友情链接:
    • IT采购网
    • 科技号
    • 中国存储网
    • 存储网
    • 半导体联盟
    • 医疗软件网
    • 软件中国
    • ITbrand
    • 采购中国
    • CIO智库
    • 考研题库
    • 法务网
    • AI工具网
    • 电子芯片网
    • 安全库
    • 隐私保护
    • 版权申明
    • 联系我们
    IT技术网 版权所有 © 2020-2025,京ICP备14047533号-20,Power by OK设计网

    在上方输入关键词后,回车键 开始搜索。Esc键 取消该搜索窗口。