Node.js 是一个 JavaScript 运行时环境. 听起来不错, 但这是什么意思? 这是如何运作的?
Node 运行时环境包含执行用 JavaScript 编写的程序所需的一切.
当 JavaScript 的原始开发者将它从只能在浏览器中运行的东西扩展到可以作为独立应用程序在机器上运行的东西时, Node.js 就已经存在.(译者注: 大意是说 JavaScript 不仅仅能够再浏览器中运行, 还可以作为独立应用程序在机器上运行)
现在, 您可以使用 JavaScript 做更多的事情, 而不仅仅是让网站互动.
JavaScript 现在有能力做 Python 等其他脚本语言可以做的事情.
浏览器 JavaScript 和 Node.js 都运行在 V8 JavaScript 运行时引擎上. 该引擎会将您的 JavaScript 代码转换为更快的机器代码. 机器代码是计算机无需先解释即可运行的低级别代码.
为什么 Node.js?
这是官方 Node.js 上给出的一个正式定义 网站 https://nodejs.org/en/ :
Node.js® 是一个基于 Chrome 的 V8 JavaScript 引擎构建的 JavaScript 运行.
Node.js 使用事件驱动的非阻塞 I / O 模型, 使其轻量且高效.
Node.js 的软件包生态系统 https://www.npmjs.com/ 是全球最大的开源库生态系统.
我们已经讨论过这个定义的第一行:"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://nodejs.org/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.
您可以通过 freeCodeCamp.org https://www.freecodecamp.org/ 来获取使用大量的资源来了解关于 Node.js 的更多信息.
来源: http://www.mzh.ren/what-exactly-is-node-js.html