原创:牛津小马哥web前端工程师陈小妹妹。
Node.js是一个JavaScript运行时环境。听起来不错,但这意味着什么?这是如何运作的?
Node运行时环境包括执行用JavaScript编写的程序所需的一切。
当JavaScript的原始开发人员将Node.js从只能在浏览器中运行的内容扩展到可以作为独立应用程序在计算机上运行的内容时,Node.js便应运而生。
现在,您可以使用JavaScript进行更多的工作,而不仅仅是使网站具有交互性。
JavaScript现在具有执行其他脚本语言(如Python)可以执行的功能的能力。
浏览器JavaScript和Node.js均在V8 JavaScript运行时引擎上运行。该引擎将您的JavaScript代码转换为更快的机器代码。机器代码是计算机可以运行的低级代码,无需先对其进行解释。
那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是指输入/输出。从读取/写入本地文件到向API发出HTTP请求,范围很广。
I / O需要时间,因此会阻塞其他功能。
考虑以下情形:我们请求后端数据库获取user1和user2的详细信息,然后将它们打印在屏幕/控制台上。对这个请求的响应需要时间,但是两个用户数据请求都可以独立且同时执行。
阻塞I / O
在阻塞方法中,用户2的数据请求直到用户1的数据打印到屏幕后才启动。
如果这是一个Web服务器,我们将不得不为每个新用户启动一个新线程。但是JavaScript是单线程的(不是真的,但是它有一个单线程的事件循环,可以说出执行javascript代码的时候是单线程的,并不代码它本身是单线程)。因此,这将使JavaScript不太适合多线程任务。
这就是非阻塞部分的所在。
非阻塞I / O
另一方面,使用非阻塞请求,您可以启动对user2的数据请求,而无需等待对user1的请求的响应。您可以并行发起两个请求。
这种无阻塞的I / O消除了对多线程的需求,因为服务器可以同时处理多个请求。
JavaScript事件循环
文字解释:
1、将main()推入调用堆栈。
2、将showtext()推入调用堆栈。发现它调用settimeout(2000)
3、将setTimeout(2000)推入堆栈。 setTimeout(2000)是Node API。调用它时,我们将注册事件回调。发现它是异步的,放入callback queue队列。
4、在API中注册后,setTimeout(2000)从调用堆栈中弹出。
现在,如果有第二个setTimeout(0),它以相同的方式注册时间回调。现在,我们有两个等待执行的Node API在callback queue中。
setTimeout(2000)从放入callback queue的两秒后,开始被事件栈调用其回调事件,并执行
setTimeout(0),等待0秒后,再等待上一个setTimeout(2000)的回调事件被执行完,才会开始被事件栈调用其回调事件,并执行。
解释:
1、在回调队列中,这些函数等待调用堆栈为空,因为只有一条语句可以执行一次。这由事件循环处理。
2、js代码执行的时候是单线程的,按顺序执行到的事件,都会进入事件栈Stack,不同的是:如果是执行到同步代码例如console的话,进入事件栈Stack,立刻执行完;
而异步代码如下的话,进入事件栈Stack后,发现是异步事件,会注册事件回调,告诉引擎说等待一秒后就可以执行它的回调事件,然后进入callback queue等待引擎调用。
setTimeout(function(){
console.log('this is a single dog')
},1000)
3、当所有同步代码,例如(console语句)执行完,
事件循环发现调用堆栈为空,而回调队列不为空,还有setTimeout事件。因此,它将回调(以先进先出的顺序)移至调用堆栈以执行。
npm
NPM是随同NodeJS一起安装的包管理工具。 npm(节点程序包管理器)具有可在您的应用程序中使用的程序包,以使您的开发更快,更高效。
require
它从Node.js API加载与Node.js捆绑在一起的模块,例如文件系统和HTTP。 它会加载您从npm安装的第三方库,例如Express和Mongoose。 它允许您需要自己的文件并模块化项目。Require是一个函数,它接受参数“ path”并返回
Node Modules
Node Modules为可重用的代码块,其存在不会意外影响其他代码。
您可以编写自己的模块,并在各种应用程序中使用它。 Node.js具有一组内置模块,您无需进一步安装即可使用它们。
V8通过利用C ++为JavaScript加速
V8是用C ++编写的开源运行时引擎。
JavaScript-> V8(C ++)->机器代码
V8实现了ECMA-262中指定的称为ECMAScript的脚本。 ECMAScript由Ecma International创建,以标准化JavaScript。
V8可以独立运行,也可以嵌入到任何C ++应用程序中。它具有钩子,可让您编写自己的C ++代码,以供JavaScript使用。
这实际上使您可以通过将V8嵌入到C ++代码中来向JavaScript添加功能,从而使您的C ++代码了解的内容比ECMAScript标准另行规定的要多。
附注:正除了V8(由Chrome浏览器)外,还有许多不同的JavaScript运行引擎,例如Mozilla的SpiderMonkey,Microsoft的Chakra等。