Node.JS 是一个 JavaScript 运行时环境. 听起来不错, 但这意味着什么? 这是如何运作的?
Node 运行时环境包含着执行 JavaScript 所编写的程序所需的一切.
Java 和 Node.JS 对比
当 JavaScript 的开发者, 将 JavaScript 从浏览器开发拓展到本地计算机上开发时, Node.JS 就出现了.
现在, 您可以使用 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 和非阻塞 I/O 对比
阻塞 I/O
在阻塞方法中, 在 user1 的数据打印到屏幕之前, 不会启动 user2 的数据请求.
如果这是一个 web 服务器, 我们必须为每个新用户启动一个新线程. 但 JavaScript 是单线程的(不是真的, 但它有一个单线程的事件循环, 我们稍后会讨论). 所以这会使 JavaScript 不太适合多线程任务.
这就是非阻塞章节的用武之地.
非阻塞 I/O
另一方面, 使用非阻塞请求, 您可以为 user2 发起数据请求, 而无需等待对 user1 请求的响应. 您可以并行启动这两个请求.
这种非阻塞 I/O 消除了对多线程的需要, 因为服务器可以同时处理多个请求.
JavaScript 事件循环
如果您有 26 分钟, 请观看 node.JS 事件循环的优秀视频说明:
没有的话, 这里是 JavaScript 事件循环如何工作的快速逐步说明.
event-loop.PNG
将 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
NPM.PNG
这些是由令人敬畏的社区构建的库, 它将解决大多数常规问题. NPM(node 的包管理工具)具有可在应用程序中使用的包, 以使开发更快更有效.
Require
Require 做了三件事情:
它从 Node.JS API 加载与 Node.JS 捆绑在一起的模块, 如文件系统和 HTTP.
它加载从 NPM 安装的第三方库, 如 Express 和 Mongoose.
它加载您自己的文件并模块化项目.
Require 是一个方法, 它将 "path" 作为参数, 返回 module.exports
Node Modules
Node 模块是一个可重用的代码块, 其存在不会意外地影响其他代码.
您可以编写自己的模块并在各种应用程序中使用它. 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 标准另外指定的更多.
事件
在我们的应用程序中发生的事情, 我们可以回应. Node 中有两种类型的事件.
系统事件: 来自名为 libuv 的库的 C++ 核心. (例如, 读完文件)
自定义事件: JavaScript 核心.
用 Node.JS 写 Hello World
这是我们必须做的~
创建一个 App.JS 的文件, 文件中加上下列语句:
console.log("Hello World!");
打开 node 的终端, 将目录更改为保存文件的文件夹, 然后运行 node App.JS.
您可以使用大量资源了解有关 Node.JS 的更多信息, 包括 freeCodeCamp.org.
注: 本篇文章为译文, 原文链接
来源: http://www.jianshu.com/p/2f1fe89ab2b9