Node.js 到底是什么?

Node.js 是一个 JavaScript 的运行环境,听起来很棒,然而是什么意思呢?它又是怎么使用的呢?

Node 运行环境涵盖所有你运行用 JavaScript 编写的项目所需要的东西。

如果你知道 Java 的话,这里有很多的相似性。

当早期 JavaScript 开发者将只能运行在浏览器上拓展到可以作为独立的应用运行在计算机上时,Node 就应运而生了。

现在你可以使用 JavaScript 做更多的事情, 而不仅仅是使网站具有交互性.

JavaScript 现在有能力做其他脚本语言(比如 Python)可以做的事情.

你的浏览器 Javascript 和 Node.js 都运行在 V8 JavaScript 运行时引擎. 该引擎将 JavaScript 代码转换为更快的机器代码. 机器代码是低级代码, 计算机不需要首先解释它而直接运行.

为什么会是 Node.js?

这里给出了一些 Node 官网 的官方定义:

Node.js® 是一个基于 Chorme V8 引擎 的 JavaScript 运行环境
Node.js 使用一个事件驱动、非阻塞式 I/O 的模型,使其轻量又高效
Node.js 的包管理器,npm(https://www.npmjs.com/), 是世界上最大的开源生态社区库

我们已经解释了关于第一条的定义:「Node.js® 是一个基于 Chorme V8引擎的 JavaScript 运行环境」。现在我们研究一下其他两条中的定义从而去探寻 Node 如此流行的秘诀

I/O 指 输入/输出。它可以是从读取/写入本地文件到向 API 发送一个 HTTP 请求的任何内容

I/O 过程中需要时间,因此会阻碍到其他事件的进程

设想这样一个脚本,我们向后台数据库分别发送获取用户一和用户二相关信息的请求然后把它们打印在控制台里。虽然请求响应的过程中需要等待,但是我们可以让这两个请求在同一时间内以相互独立的方式同步进行

阻塞的 I/O

在阻塞的条款中,用户二的数据请求在用户一请求的数据没有打印出来之前是不能启动的。

如果这是一个网络服务,我们可能会给每一位新用户开启一个新的线程,但是 JavaScript 是单线程的(不完全是,但是它有一个单线程事件循环,我们稍后将会提到)。因此 JavaScript 并不适合多线程任务。

这就是非阻塞部分的来源。

非阻塞的 I/O

另一方面,使用非阻塞的请求,你可以并行的启动用户二的数据请求而不必等到用户一的请求得到响应之后。

当服务器端可以同时处理多个请求的时候,非阻塞的 I/O 的存在就消除了对多线程的依赖

JavaScript 事件环

然后,这里将一步一步地快速解释JavaScript事件循环是如何工作的。

  1. 将 main() 推到调用堆栈上。
  2. 将 console.log() 推到调用堆栈上。然后这个马上就跑,然后被爆了。
  3. 将 setTimeout(2000) 推送到堆栈上。 setTimeout(2000) 是一个节点API。当我们调用它时,我们注册事件回调对。事件将等待2000毫秒,然后回调就是函数。
  4. 在api中注册后,将从调用堆栈中弹出 setTimeout(2000)
  5. 现在,第二个 setTimeout(0)以同样的方式注册。我们现在有两个节点api等待执行。
  6. 在等待0秒之后,setTimeout(0)被移动到回调队列,同样的情况也发生在setTimeout(2000)
  7. 在回调队列中,函数等待调用堆栈为空,因为一次只能执行一个语句。这由事件循环负责。
  8. 最后一个console.log() 运行,然后从调用堆栈中弹出 main() 。
  9. 事件循环看到调用堆栈为空,回调队列不为空。所以它将回调(按先进先出的顺序)移动到调用堆栈中执行。

npm

k43MGoddJ8.png!large

这些库是由很棒的社区构建,它可以解决大多数的一般性问题。npm(Node 包管理器)包可以让你的应用开发更快捷,高效。

要求

要求做三件事:

  • 它从[Node.js API](http://nodejs.org/api/)加载与 Node.js 绑定在一起的模块,如文件系统和 HTTP 。
  • 加载从npm安装的第三方库,如 Express 和 Mongoose 。
  • 允许您引入文件并模块化项目。

Require 函数接受一个参数 “path” (路径字符串)并返回 module.exports

Node 模块

Node 模块是一个可重用的代码块,其存在不会意外地影响其他代码。

你可以编写自己的模块并在各种应用程序中使用它。 Node.js有一组内置模块,无需进一步安装即可使用。

V8 通过利用 C++ 来加速 JavaScript

V8 是一个用 C++ 编写的开源运行引擎。

JavaScript -> V8(C++) -> 机器语言

V8 实现了 ECMA-262 中指定的名为 ECMAScript 脚本。ECMAScript 是由 Ecma 国际标准化 JavaScript (组织)创建的。

V8 可以独立运行,也可以嵌入到任何 C++ 应用程序中。它有钩子,允许您编写自己的 C++ 代码,您可以对 JavaScript 提供这些代码。

这本质上允许您通过将 v8 嵌入到 C++ 代码中来向 JavaScript 添加特性,这样您的 C++ 代码在特定的内容上就比 ECMAScript 标准更易解。

注意:有很多不同的 JavaScript 运行时引擎,除了 Chrome 的 V8 外,类似的有 Mozilla 的 SpiderMonkey 、微软的 Chroka 等等。详情参见 网址.

事件

在应用中产生某些可回调逻辑。Node 中有两种事件类型。

  • 系统事件:C++核心从一个名为 libuv 的库。(例如,读取完一个文件)。

-自定义事件:javascript 核心。

在node.js中编写hello world

我们必须这么做,不是吗?

创建一个app.js文件并添加以下内容。

console.log("你好,世界!");

打开节点终端,将目录更改为保存文件的文件夹,然后运行node app.js
你刚刚在node.js中写了hello world。

原文地址:https://medium.com/free-code-camp/what-e...

译文地址:https://learnku.com/nodejs/t/33802

本文为协同翻译文章,如您发现瑕疵请点击「改进」按钮提交优化建议
讨论数量: 2

事件环讲的不是很清楚啊。

2周前 评论

我来简单说一下喽:

顺便讲讲nodejs 三个特点吧

  1. 单线程:
    是为了较少内存的开销,操作系统的内存换页(创建/销毁)
    但是,如果每个请求有I/O操作,单线程就被阻塞.
  2. 非阻塞I/O:
    不会傻等I/O操作的执行结束才继续后面的操作,而会直接执行后面的语句.
    但是,非阻塞I/O语句的问题? 小A的业务执行到一半,又有小C请求了.
  3. 事件驱动(事件环):
    不管新用户的请求,还是老用户的I/O操作,都将以事件的方式加入到事件环,等待调度.

node.js 中所有的I/O都是异步的,回调函数套回调函数.

2周前 评论

请勿发布不友善或者负能量的内容。与人为善,比聪明更重要!