> For the complete documentation index, see [llms.txt](https://node.course.90byte.com/llms.txt). Markdown versions of documentation pages are available by appending `.md` to page URLs; this page is available as [Markdown](https://node.course.90byte.com/basic/01_know_node.md).

# 01 走进 Node 的世界，认识 Node

这一课的内容，带你走进 Node 的世界，相对而言，它是一门比较年轻的技术，而非编程语言。与 Java 和 PHP 的概念不一样，Node 使用的的编程语言是 JavaScript ，这么一说，更让人糊涂了，那 Node 到底是什么样的一个存在？且听我慢慢道来。

## Node 的定义

看一下维基百科上的定义。

> Node.js 是一个能够在服务器端运行 JavaScript 的开放源代码、跨平台 JavaScript 运行环境。Node.js 由 Node.js 基金会持有和维护，并与 Linux 基金会有合作关系。Node.js 采用 Google 开发的 V8 运行代码，使用事件驱动、非阻塞和 异步输入输出模型等技术来提高性能，可优化应用程序的传输量和规模。

根据上述的定义，我们提出如下概念：

* Node 是 JavaScript 的服务器运行环境（runtime）
* Node 采用 Google 开发的 V8 引擎运行代码
* Node 采用事件驱动，非阻塞和异步 I/O 模型

一句话总结一下，Node 是采用**事件驱动**，**非阻塞异步 I/O** 模型，运行在 V8 引擎下， JavaScript 语言在服务器端的运行环境。关于事件驱动，非阻塞异步 I/O 等概念，会在后续的课程中详细介绍到。

## Node 的诞生

Node 诞生于 2009 年，他的作者 Ryan Dahl 起初想要创建一个高性能的 Web 服务器并提供一套库。想要创建高性能的 Web 服务器，至少要具备两个条件：**事件驱动**，**非阻塞异步 I/O**。

于是，他的目标就是要写一这样的 Web 服务器，而他并不想重新再创造一门编程语言，那么使用什么编程语言呢，这是一个问题。他本身是 C/C++ 程序员，然而他认为 C++ 的门槛太高了，很多开发者可能并不想去做实际的业务开发，而基于 **事件驱动**，**非阻塞异步 I/O** 这两点的考虑，衡量了 Ruby，Haskell 等语言后，他最终选择了 JavaScript 作为它的语言。

在此之前，JavaScript 只是一门在浏览器环境下运行的语言，它的学习门槛非常低，而在服务器端几乎没有市场，可以说「这是一片净土」，为它倒入一套「非阻塞异步 I/O 库」要容易得多了。另外一个重要的原因，JavaScript 在浏览器环境下，就已经广泛的使用了「事件驱动」，像页面按钮的监听点击动作，页面加载完成事件等等，都是「事件驱动」方面的应用。

正是因为 JavaScript 这三个方面的优势： 1. 学习门槛低 2. 无太多阻力构建非阻塞异步 I/O 模型 3. 事件驱动的天然优势

让 JavaScript 成为了 Node 的实现语言。而在浏览器大战中，Google 的 Chrome 浏览器 JavaScript V8 引擎一战成名，于是 Node 采用高性能的 V8 作为运行环境，也就顺理成章了。

说到这里，相信你已经大概了解 Node 定义中的那段话，接下来的问题是，它能做什么呢？

## Node 的用途

其实，我比较反感去回答，某个语言能做什么？我认为这是一个特别没有意思的问题，比如，有点人可能会说，我要做爬虫，所以我要学 Python，我要学开发网站，所以我要学 PHP 和 Java。这其中，其实没有任何的因果关系，有关系的只是你掌握的程度。

就如 Ryan Dahl 想要一个高性能的 Web 服务器，他的选择是创造了 Node，使用了 JavaScript 语言。在此之前，你如果要问 JavaScript 能做什么？得到的答案应该是：让网页动起来。**而如今，你几乎可以使用 JavaScript 做任何事情**。

好了，我们换个问法，Node 适合做什么？前面介绍了，它是一个高性能的 Web 服务器， 采用的是事件驱动，异步I/O模型，那么它的优势就在 Web，高性能 I/O 上面，于是它擅长做如下应用：

* Web 服务 API（ REST ）
* 服务端 Web 应用，高并发请求
* 即时通信应用
* 静态文件服务器（ I/O 类）
* ......

擅长的应用可能多了去了，那么，它不擅长什么？

发展之初的时候，由于单线程的弱点，我可能会说，它不适合在多 CPU 架构服务器上运行（因为他是单线程的），不适合做大规模计算类的应用（因为单线程，一旦 CPU 被计算阻塞，异步也就白扯了），但是，如今这些曾经的问题，都已经不是问题了，Node 引入了 child\_process 子进程模块，解决单线程问题。

所以，Node 的用途是非常广泛的，想做爬虫，使用 Node 也是可以实现的，想做 Web ，Node 更是可以胜任。

在我看来，其他编程语言也都一样，他们只是一个工具，为我们服务的工具，问题是我们能不能用好这个工具，而不是工具本身的问题，当然，也不可否认工具是否合适的问题。**在有了 Node 之后，如今的 JavaScript 几乎可以做任何事情**。

## 闲聊：JavaScript 的那些规范

你已经知道了，Node 只是 JavaScript 在服务器端的运行环境，所以，在使用 Node 开发过程中，我们使用的是 JavaScript 这门语言，鉴于它的特殊性，以及历史渊源，我觉得还是有必要聊一聊，关于 JavaScript 的一些规范。

JavaScript 语言的缔造者「网景」公司，希望 JavaScript 语言能够成为国际标准，最开始交给标准化组织 ECMA 去制作规范，由于与 Java 商标等因素，ECMA 组织发布的这套规范，不叫 JavaScript ，而是叫 ECMAScript，这就是 ECMAScript 的由来，也是最初的 JavaScript 语言的官方规范。

ECMAScript 5.1 到 6.0 版本的时候，ECMA 标准化组织想让发布标准变成一个常规流程，于是规定每年 6 月份的时候发布一次正式版本，不再沿用旧版本号来记录，直接以当年年份作为名称，例如：ECMAScript 2018，简称 ES2018，就是在 2018 年 6 月发布的最新一版。以这种规则发布的第一个版本是在 2015 年 6 月，它是 5.1 到 6.0 的第一个版本，称作 ES2015 ，也称作 ES6，由于这一次的变化非常大，所以，ES6 泛指下一代 JavaScript 标准。

我们都知道，在 Node 诞生之前，JavaScript 一直主要应用于浏览器端，它在服务器端的作为，几乎可以忽略不计。所以 ES6 标准之前，JavaScript 的规范都受限于浏览器端的环境，所以，它的官方规范是相当薄弱的，都不能称作为一个完整的语言。

而 CommonJS 就在这种背景下，由 JavaScript 开发者社区共同制定出来了，它定义了 JavaScript 语言的模块系统，Buffer，I/O处理，Web 服务器接口等等规范，填补了 JavaScript 在服务器端的空缺，Node 正是借助了 CommonJS 的一些规范，迅速在服务器端打开市场。

随着时间推移，各大浏览器对 ES6 的支持以及 Node 的发展，ES6 正式成为下一代 JavaScript 语言的国际标准。

> 查看浏览器对 ES6 的支持程度 访问：<http://ruanyf.github.io/es-checker/>

![](https://3832092430-files.gitbook.io/~/files/v0/b/gitbook-legacy-files/o/assets%2F-LjOWJWIMZo_JloU3CR3%2F-LvGKjb0HBUaBnehdQYY%2F-LvGKmRnDz6Gwrk_E7xM%2F2019-03-12-21-46-23.png?generation=1575470181181249\&alt=media)

> 查看你当前 Node 环境对 ES6 的支持程度
>
> * `npm i -g es-checker` 安装检测模块
> * `es-checker` 运行模块

![](https://3832092430-files.gitbook.io/~/files/v0/b/gitbook-legacy-files/o/assets%2F-LjOWJWIMZo_JloU3CR3%2F-LvGKjb0HBUaBnehdQYY%2F-LvGKmRpgX8XMIAehbWw%2F2019-03-12-21-45-06.png?generation=1575470181173243\&alt=media)

参考资源：[ECMAScript 6 入门 - 阮一峰](http://es6.ruanyifeng.com/)
