Node.js 是什么?我为什么选择它?

本文主要为您介绍 Node.js 的背景及它能做什么,擅长什么,不会涉及到复杂的代码层面的知识讲解,如果你觉得自己很熟悉了,也可以忽略它 。
作者简介:五月君,Nodejs Developer,热爱技术、喜欢分享的 90 后青年,「Nodejs技术栈」,Github 开源项目 https://www.nodejs.red
文末附上笔者最近整理的 Node.js 技术栈学习指南路线图 供大家学习参考!
背景介绍
Node.js® is a JAVAScript runtime built on Chrome’s V8 JavaScript engine. 这是来自 Node.js 官网 https://nodejs.org/en/ 的一段介绍,翻译成中文意为 Node.js 是一个基于 Chrome V8 引擎的 JavaScript 运行环境 。这里重点几个关键词 V8、JavaScript 后续会讲解,从这里可以看出 Node.js 并不是一门新的编程语言,做为初学者这点先要弄清楚,它是 JavaScript 的运行环境,更进一步的说是在服务端的运行环境,因此这里的编程语言指的是 JavaScript 。
时间回归到 2009 年,在当时 JavaScript 还是一个跑在浏览器环境里的一门脚本语言,当时的笔者还是一名高中生,接触的编程语言是 VB 并不知 JavaScript 为何物,但随后接触 JavaScript 之后了解到这之前用它可以写一些浏览器脚本,做一些动态特效,主要用于前端页面交互 。在 2009 这一时间线之后 Javascript 不只运行于浏览器,还可以运行于服务端,简直打通了前端与后端的任督二脉,当然这要归功于 Node.js 之父 Ryan Dahl 。一度认为这是很伟大的,在众多编程语言里,为什么会选择 JavaScript 呢?且看下面介绍 。
为什么是 JavaScript?
Node.js 使用了一个事件驱动、非阻塞式 I/O 的模型,使其轻量又高效 。这是来自于 Node.js 的另一个介绍,关键词 事件驱动、非阻塞式 I/O 因此,在基于这些条件之下 Node.js 作者 Ryan Dahl 在评估了 C、Lua、Haskell、Ruby、JavaScript 等语言之后,最终选择了 JavaScript,为什么呢?
JavaScript 是一个单线程的语言,单线程的优点是不会像 Java 这些多线程语言在编程时出现线程同步、线程锁问题同时也避免了上下文切换带来的性能开销问题,那么其实在浏览器环境也只能是单线程,可以想象一下多线程对同一个 DOM 进行操作是什么场景?不是乱套了吗?那么单线程可能你会想到的一个问题是,前面一个执行不完,后面不就卡住了吗?当然不能这样子的,JavaScript 是一种采用了事件驱动、异步回调的模式,另外 JavaScript 在服务端不存在什么历史包袱,在虚拟机上由于又有了 Chrome V8 的支持,使得 JavaScript 成为了 Node.js 的首选语言 。
为什么选择 JavaScript 作者 Ryan Dahl 应该是最有发言权的,这里查了一些资料及参考了 深入浅出 Node.js 一书,供大家有个初步的认知 。
Node.js 架构
Node.js 由 Libuv、Chrome V8、一些核心 API 构成,如下图所示:

Node.js 是什么?我为什么选择它?

文章插图
 
以上展示了 Node.js 的构成,下面做下简单说明:
  • Node Standard Library:Node.js 标准库,对外提供的 JavaScript 接口,例如模块 http、buffer、fs、stream 等Node bindings:这里就是 JavaScript 与 C++ 连接的桥梁,对下层模块进行封装,向上层提供基础的 API 接口 。V8:google 开源的高性能 JavaScript 引擎,使用 C++ 开发,并且应用于谷歌浏览器 。如果您感兴趣想学习更多的 V8 引擎知识,请访问 What is V8?Libuv:是一个跨平台的支持事件驱动的 I/O 库 。它是使用 C 和 C++ 语言为 Node.js 所开发的,同时也是 I/O 操作的核心部分,例如读取文件和 OS 交互 。来自一份 Libuv 的中文教程C-ares:C-ares 是一个异步 DNS 解析库Low-Level Components:提供了 http 解析、OpenSSL、数据压缩(zlib)等功能 。
以上只是做一个初步的认知,如果你想深入了解 Node.js 那么多每个点都是值得你深入研究的 。
来自 stack overflow 的一个参考:which-is-correct-node-js-architecture
Node.js 特点
在了解了 Node.js 的一些背景及架构模型之后,已经解决了它来自哪里?是什么?这个问题,现在我们来看看能解决什么问题?它适合做什么?
在这之前不知道您有没有听说过,Node.js 很擅长 I/O 密集型任务,应对一些 I/O 密集型的高并发场景还是很有优势的,事实也如此,这也是它的定位:提供一种简单安全的方法在 JavaScript 中构建高性能和可扩展的网络应用程序 。
  • 单线程
Node.js 使用单线程来运行,而不是向 Apache HTTP 之类的其它服务器,每个请求将生产一个线程,这种方法避免了 CPU 上下文切换和内存中的大量执行堆栈,这也是 Nginx 和其它服务器为解决 “上一个 10 年,著名的 C10K 并发连接问题” 而采用的方法 。


推荐阅读