背景介绍
- Node.js® is a JavaScript runtime built on Chrome's V8 JavaScript engine. 这是来自 Node.js 官网的一段介绍,翻译成中文意为 Node.js 是一个基于 Chrome V8 引擎的 JavaScript 运行时。从这里可以看出 Node.js 并不是一门新的编程语言,做为初学者这点先要弄清楚,它是 JavaScript 的运行环境,更进一步的说是在服务端的运行环境,因此这里的编程语言指的是 JavaScript。
- 时间回到2009年,Node.js 之父 Ryan Dahl当时还是一名高中生,JavaScript还是一个跑在浏览器环境的脚本语言,在这时间之后,JavaScript不只能够运行在客户端,还可以运行在服务端,这都归功于Ryan Dahl,为什么在众多的编程语言中选择了JavaScript呢?
为什么选择JavaScript?
- Node.js使用了一个事件驱动、非阻塞I/O的模型,使其既轻量又高效。这是Node.js的另一个介绍。关键词是 事件驱动、非阻塞I/O
- JavaScript是单线程语言,单线程语言的有点是不会像Java多线程语言那样在编程时出现线程同步线程锁问题的同时,也避免了切换上下文带来的性能的消耗问题。那么其实在浏览器环境中也只能是单线程,可以想象一下多线程同时操作同一个DOM是什么场景,不是乱套了么?对于单线程,我们可以想到的一个问题是,当前一个任务执行不完的话,下一个任务怎么执行,不就卡住了么?这种情况会经常遇到;JavaScript是一种采用了事件驱动、异步回调的模式,对于异步回调,相信大家都明白,对于耗时较长的任务,我们会将它设为一个异步方法,等到任务完成时,再执行回调;异步的方法并不会阻塞下一个任务的执行的。另外 JavaScript 在服务端不存在什么历史包袱,在虚拟机上由于又有了 Chrome V8 的支持,使得 JavaScript 成为了 Node.js 的首选语言。
Node.js架构
Node.js 由 Libuv、Chrome V8、一些核心 API 构成,如下图所示:
-
Node Standard Library:Node.js的标准库,对外提供的JavaScript的接口,例如模块:http、fs、buffer、stream等
-
Node Bindings:这里是JavaScript和c++的桥梁,对下层模块进行封装,对上层提供API接口
-
V8:Google 开源的高性能 JavaScript 引擎,使用 C++ 开发,并且应用于谷歌浏览器。
-
Libuv:是一个跨平台的支持事件驱动的 I/O 库。它是使用 C 和 C++ 语言为 Node.js 所开发的,同时也是 I/O 操作的核心部分,例如读取文件和 OS 交互
-
C-ares:C-ares 是一个异步 DNS 解析库
-
Low-Level Components:提供了 http 解析、OpenSSL、数据压缩(zlib)等功能。
Node.js的特点
关于Node.js,大家听说的最多的就是很擅长处理I/O密集型的高并发场景,这也是它最有特色的一点:提供一种简单安全的方法在JavaScrip中构建高性能和可扩展的网络应用程序
- 单线程 Node.js使用单线程来运行,而不是像Apache HTTP之类的其他服务器,每个请求都将产生一个线程,这种方法避免了CPU上下文的切换和内存中大量的执行堆栈,这也是 Nginx 和其它服务器为解决 “上一个 10 年,著名的 C10K 并发连接问题” 而采用的方法。
- 非阻塞I/O Node.js避免了由于需要等待输入或者输出(数据库、文件系统、服务器)响应而造成的CPU时间损失,这得益于libuv强大的异步I/O
- 事件驱动编程 事件与回调在 JavaScript 中已是屡见不鲜,同时这种编程对于习惯同步思路的同学来说可能一时很难理解,但是这种编程模式,确是一种高性能的服务模型。Node.js 与 Nginx 均是基于事件驱动的方式实现,不同之处在于 Nginx 采用纯 C 进行编写,仅适用于 Web 服务器,在业务处理方面 Node.js 则是一个可扩展、高性能的平台。
- 跨平台 起初 Node.js 只能运行于 Linux 平台,在 v0.6.0 版本后得益于 Libuv 的支持可以在 Windows 平台运行。
Node.js适用于什么场景?
-
I/O密集型场景
Node.js的优势主要在于事件循环,非阻塞异步I/O,只开启一个线程,不会每次请求都会创建一个线程,从而资源的开销。 -
Resutful API
通常我们可以使用 Node.js 来做为中间层,负责组装数据提供 API 接口给到前端调用,这些数据源可能来自第三方接口或者数据库,例如,以前可能我们通过后端 Java、PHP 等其它语言来做,现在我们前端工程师通过 Node.js 即可完成,后端则可以更专注于业务开发。 -
RPC服务
RPC(Remote Procedure Call)中文名「远程过程调用」,也许你对它很陌生,但是在当今微服务模式下,我们可能是针对功能或者具体的业务形态进行服务化,那么服务之间的通信一种常见的模式我们都知道通过 HTTP 来实现,了解网络模型的同学可能知道,如果我们现在通过 TCP 的方式是不是会更高效呢?当然是的,HTTP 属于应用层协议,在这之下就是传输层,显然以 TCP 形式是很有优势的,RPC 服务也就是采用的 TCP,现在出名的 RPC 服务例如,Google 的 gRPC、阿里的 Dubbo。
-
基础工具 可以做为基础工具,前端领域中的编译器、构建工具、搭建脚手架等。比较出名的例如 Webpack、Gulp 都是很成功的。
-
论坛社区
Nodeclub 是使用 Node.js 和 MongoDB 开发的社区系统,界面优雅,功能丰富,小巧迅速,可以用它搭建自己的社区。Cnode 社区就是一个成功的例子,Cnode 地址:cnodejs.org/ -
Backend For Frontend Backend For Frontend,简称 BFF,服务于前端的后端,并非是一种新技术只是一种逻辑上的分层,在这一层我们可以做一些资源的整合,例如:原先前端需要从三个不同的地方来获取资源,那么,有了这一层之后,我们是不是可以做个聚合,统一处理之后返回给前端,同时也不授后端系统的变迁,导致也要去更改。
-
Serverless 这将是未来经常会听到的一个词,ServerLess 是一种 “无服务器架构”,它不需要开发者去关心运维、流量处理这些工作,开发者则可以更关注于业务本身。
函数即服务,那么写一个函数就可以实现一个 API 接口给到前端,显然对开发工作是减轻了很多,在 JavaScript 中函数则是一等一的公民,在 ServerLess 这一场景下 Node.js 本身也很轻量级,还是拥有着很大的优势。
总结
Node.js是现在前端必要的技能,想要提升自己的技术栈,就必须要学习Node.js。为未来全栈和架构师打造基础。希望大家和我一起学习Node.js