Node.js:深入解析

发表时间: 2018-04-19 11:05

Node.js是一个JavaScript运行时环境。听起来不错,但这是什么意思?这是如何运作的?

Node运行时环境包含执行用JavaScript编写的程序所需的一切。

如果你了解Java,这里有点类比

当JavaScript的原始开发者将它从只能在浏览器中运行的东西扩展到可以作为独立应用程序运行的东西时,Node.js才会存在。

现在,您可以使用JavaScript进行更多操作,而不仅仅是操作DOM。

JavaScript现在有能力做Python等其他脚本语言可以做的事情。

浏览器JavaScript和Node.js都运行在V8 JavaScript运行时引擎上。该引擎会将您的JavaScript代码转换为更快的机器代码。机器代码是计算机无需解释就可以运行的低级代码。

了解V8

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

JavaScript - > V8(C ++) - >机器代码

V8按照ECMA-262中的规定实现了一个名为ECMAScript(ES)的脚本。ECMAScript由Ecma International创建,用于标准化JavaScript。V8可以独立运行,也可以嵌入到任何C ++应用程序中。

V8有钩子,可以让我编写自己的C ++代码,使其可以提供给JavaScript。这使编写可导致我的C ++代码运行的JavaScript代码成为可能。

这基本上允许我通过在我的C ++代码中嵌入V8来为JavaScript添加功能,这样我的C ++代码就可以理解ECMAScript标准指定的内容。

为什么Node.js?

这是官方Node.js 网站上给出的正式定义。

  • Node.js®是在Chrome的V8 JavaScript引擎上构建的JavaScript运行时。

  • Node.js使用事件驱动的非阻塞I / O模型,使其轻量且高效。

  • Node.js的软件包生态系统npm是全球最大的开源库生态系统。

我们已经讨论了第一行,让我们了解其他两行,以了解为什么Node.js如此受欢迎。

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

  • I / O需要时间并因此阻止其他功能。

考虑一个senario,我们要求后端数据库提供user1和user2的详细信息,然后在屏幕/控制台上打印它们。对此请求的响应需要时间,但两个用户数据请求都可以独立并同时执行。

阻塞

在阻塞方法中,user2数据请求不会启动,直到user1数据被打印到屏幕上。

如果这是一个Web服务器,我们将不得不为每个新用户启动一个新线程。但是JavaScript是单线程的(不是真的,但是后面会讨论单线程事件循环),所以这会使JavaScript不适合该任务。

非阻塞

另一方面,使用非阻塞请求,启动对用户1的数据请求,并且不等待响应,并行地启动对用户2的请求。

这将消除多线程的需要,因为服务器可以处理多个用户请求。

JavaScript事件循环

  1. 按下调用堆栈上的main()。

  2. 在堆栈上推console.log()。然后,它立即运行并被弹出。

  3. 在堆栈上按setTimeout(2秒)。setTimeout()是一个Node API。当我们调用它时,我们注册事件回调对。该事件将等待2秒,回调函数。

  4. 在API中注册之后,setTimeout(2秒)从堆栈弹出。

  5. 现在第二个setTimeout(0秒)的注册方式相同,我们有两个Node API等待执行。

  6. 在等待0秒后,setTimeout(0秒)移动到回调队列中,setTimeout(2秒)也发生同样的情况。

  7. 在回调队列中,函数等待调用堆栈为空,因为只有一个语句可以执行一次。这由事件循环来处理。

  8. 最后一个console.log()运行,并且main()从堆栈中获取。

  9. 事件循环看到调用堆栈是空的,回调队列不是。所以它将回调(FIFO)移动到堆栈中执行。

NPM

这些是由awesome 社区建立的库,它将解决大部分通用问题。npm(节点包管理器)具有可在您的应用中使用的包,以使您的开发更快更高效。

Require

Require做三件事:

  • 加载与Node.js捆绑在一起的模块,如Node.js API中的文件系统(fs)和http 。

  • 加载从npm安装的Express,Mongoose等第三方库。

  • 要求我们自己的文件和模块化项目。

Require是一个函数,它接受参数'path'并返回module.exports

Modules

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

您可以编写自己的模块并将其用于各种应用程序。Node.js有一组内置模块,您可以使用它们而无需进一步安装。

Events

我们的应用中发生了一些我们可以回应的事情。节点中有两种类型的事件。

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

  • 自定义事件:JavaScript核心。