Node.js是一个JavaScript运行时环境。听起来不错,但这是什么意思?这是如何运作的?
Node运行时环境包含执行用JavaScript编写的程序所需的一切。
当JavaScript的原始开发者将它从只能在浏览器中运行的东西扩展到可以作为独立应用程序在机器上运行的东西时,Node.js就已经存在。(译者注:大意是说JavaScript不仅仅能够再浏览器中运行,还可以作为独立应用程序在机器上运行)
现在,您可以使用JavaScript做更多的事情,而不仅仅是让网站互动。
JavaScript现在有能力做Python等其他脚本语言可以做的事情。
浏览器JavaScript和Node.js都运行在V8 JavaScript运行时引擎上。该引擎会将您的JavaScript代码转换为更快的机器代码。机器代码是计算机无需先解释即可运行的低级别代码。
为什么Node.js?
这是官方Node.js上给出的一个正式定义 网站:
Node.js®是一个基于Chrome的V8 JavaScript引擎构建的JavaScript运行。Node.js使用事件驱动的非阻塞I / O模型,使其轻量且高效。
Node.js的软件包生态系统npm是全球最大的开源库生态系统。
我们已经讨论过这个定义的第一行:“Node.js®是一个基于Chrome的V8 JavaScript引擎构建的JavaScript运行。”现在让我们来了解另外两条线,以便我们了解为什么Node.js非常流行。
I / O是指输入/输出。它可以是从读取/写入本地文件到发出HTTP请求到API的任何内容。
I / O需要时间并因此阻塞其他功能。
考虑一个场景,我们需要一个后台数据库来获取user1和user2的详细信息,然后将其打印在屏幕/控制台上。对此请求的响应需要时间,但两个用户数据请求可以独立并同时执行。
阻塞型 I / O
在阻塞方法中,用户2的数据请求不会启动,直到用户1的数据被打印到屏幕上。
如果这是一个Web服务器,我们将不得不为每个新用户启动一个新线程。但是JavaScript是单线程的(不是真的,但是它有一个单线程的事件循环,稍后我们会讨论它)。所以这会使JavaScript不太适合多线程任务。
这就是需要非阻塞部分进来的地方。
非阻塞 I / O
另一方面,使用非阻塞请求,您可以在不等待响应user1请求的情况下为user2启动数据请求。您可以并行发起两个请求。
这种非阻塞I / O消除了多线程的需要,因为服务器可以同时处理多个请求。
JavaScript事件循环
如果您有26分钟,请观看节点事件循环的出色视频说明:
如果你没时间,那么以下是关于JavaScript事件循环如何工作的快速分步说明。
将main()推入调用堆栈。
将console.log()推入调用堆栈。然后马上运行,然后弹出。
将setTimeout(2000)推入堆栈。 setTimeout(2000)是一个Node API。当我们调用它时,我们注册事件回调对。该事件将等待2000毫秒,然后回调函数。
在API中注册之后,setTimeout(2000)会从调用堆栈中弹出。
现在第二个setTimeout(0)以相同的方式被注册。我们现在有两个Node API等待执行。
在等待0秒后,setTimeout(0)被移到回调队列中,setTimeout(2000)也会发生同样的情况。
在回调队列中,函数等待调用堆栈为空,因为只有一个语句可以执行一次。这由事件循环来处理。
最后一个console.log()运行,并且main()从调用栈中弹出。
事件循环看到调用堆栈是空的,并且回调队列不是空的。因此它将回调(按先入先出的顺序)移动到调用堆栈中执行。
npm
These are libraries built by the awesome community which will solve most of your generic problems. npm (Node package manager) has packages you can use in your apps to make your development faster and efficient.
这些是由_awesome community_建立的库,它将解决大部分通用问题。 npm(节点包管理器)包含了可以在您的应用中使用的包,以使您的开发更快更高效。
Require
Require 做了以下三件事:
它加载与Node.js捆绑的模块,如文件系统和来自Node.js API 的HTTP。
它加载从npm安装的第三方库,如Express和Mongoose。
它可以require你自己的文件和模块化项目。
Require是一个函数,它接受一个参数“path”并返回module.exports。
Node Modules
节点模块是可重用的代码块,其存在不会意外地影响其他代码。
您可以编写自己的模块并将其用于各种应用程序。 Node.js有一组内置模块,您可以使用它们而无需进一步安装。
V8通过利用C ++来增强JavaScript的性能
V8是一个用C ++编写的开源运行时引擎。
JavaScript -> V8(C++) -> Machine Code
V8按照ECMA-262的规定实现一个名为ECMAScript的脚本。 ECMAScript由Ecma International创建,用于标准化JavaScript。
V8可以独立运行,也可以嵌入到任何C ++应用程序中。它有一些钩子,可以让你编写自己的C ++代码,使其可以提供给JavaScript。
这基本上可以让您通过将V8嵌入到C ++代码中来为JavaScript添加功能,以便您的C ++代码理解的不仅仅是ECMAScript标准另有指定。
Events
我们的应用中发生了一些我们可以回应的事情。节点中有两种类型的事件。
系统事件:来自libuv库的C ++核心。 (例如,读完一个文件)。
自定义事件:JavaScript核心。
在Node.js中编写Hello World
我们必须这样做,不是吗?
制作一个文件app.js并添加以下内容。
console.log("Hello World!");
打开节点终端,将目录更改为保存文件的文件夹并运行节点app.js. Bam - 你刚刚在Node.js中编写了Hello World。