学习 NodeJS 第一部分:了解基本知识
2020年秋末,我开始了一项深入理解 Node 的计划。我希望改进 Node 的使用方式,更好地利用它的更多功能,并进一步提升我的前端知识,使其达到全栈水平。本系列课程包含我在Odin 项目学习过程中整理的笔记。课程内容还包括更好地使用 Node 所需的一些 Web 基础知识。
为了顺利通过 Node 学习过程中可能遇到的挑战,掌握一些 Web 基础知识至关重要。在本节和下一节中,我将回顾一些关键主题,并将其与 Node 联系起来。让我们开始吧!
理解 Node 的真正含义
Node 是一个开源、跨平台的运行时环境,允许开发人员使用 JavaScript 创建各种服务器端工具和应用程序。
但这只是教科书上的定义——让我们来分析一下这些词的含义。
Node 有何突破性之处?
JavaScript 最初设计为在浏览器中运行。这意味着它不可能在网站以外的任何环境中运行。Node将 JS 带出了浏览器的世界,因此你可以用它完成其他服务器端语言所能完成的大部分工作。这正是 Node 的突破之处。它赋予了 JavaScript 后端功能。
为了实现这一点,Node 一定添加了原始 JS 所没有的功能,对吧?事实上,Node 赋予 JS 以下能力:
- 创建 http 连接
- 监听网络请求
- 生成动态页面内容
- 在服务器上创建/打开/读取/写入/删除/关闭文件
- 收集表单数据
- 添加/删除/修改数据库中的数据
“V8”这个术语与 Node 一起出现。什么是 V8?
JS 运行时环境需要引擎才能运行。正如我们所讨论的,Node 是一个 JS 运行时环境,因此它也需要一个引擎。Node 的引擎基于 Chrome 的开源 JS 引擎 V8 构建。V8 是用 C++ 编写的,允许你通过钩子编写自己的 C++ 代码,并将其提供给 JavaScript 使用。
还有其他运行时引擎,如Mozilla 的SpiderMonkey和 Microsoft 的Chakra。
Node 中的“hello world”是什么样子的?
- 创建一个文件(任意命名),但确保其扩展名为
.js
。 - 将以下内容放入其中:
console.log("Hello World!");
- 打开你的节点终端,
cd
进入保存文件的文件夹目录并运行node [name-of-file].js
。
看起来很熟悉?由于 Node 是 JS 的运行时环境,因此您可以使用熟悉和喜爱的 JS 语法来为其提供支持。
理解 Node 的关键概念
Node 是异步和事件驱动的,让我们分解一下这些术语:
事件驱动:计算机上的每个操作都是一个事件。它可能是一个网络请求,有人试图访问服务器的端口,点击某个按钮提交——可能性无穷无尽。事件会触发某些响应,而这正是 Node 帮助我们处理的。
同步和异步描述了代码运行的两种不同方式。
同步:意味着每个操作必须先完成,下一个操作才能开始。
异步:意味着您无需编写代码来预测每行代码何时运行,而是将其编写为响应事件而调用的较小函数的集合。
例如,假设您正在编写一个程序,并且需要它执行以下操作:它应该从文件中读取一些文本,将该文本打印到控制台,查询数据库中的用户列表并根据用户的年龄对其进行筛选。
如果同步执行这些步骤,它们将如下所示:
- 读取文件
- 打印文件内容
- 查询数据库
- 过滤数据库查询结果
为了使这些步骤异步执行,我们将分解这些任务:
- 读取文件 然后 打印文件内容
- 查询数据库 然后 过滤数据库查询结果
这样,Node 就无需等待了。在读取文件的同时,它可以查询数据库。然后,根据哪个文件先完成(一个事件!),它将转到下一个任务。
addEventListener
这个过程几乎与前端 JavaScript 中等待用户操作(例如鼠标点击或键盘按下)的方式完全相同。主要区别在于,事件可能是网络请求和数据库查询之类的。此功能通过使用回调来实现。
什么是回调?
回调是作为参数传递给另一个函数的函数:
// this has no callback
// it prints "First" then "Second"
console.log('First');
console.log('Second');
// this has a callback
// it prints "Second" then "First"
setTimeout(function() {
console.log('First');
}, 3000);
console.log('Second');
如果您不小心,这可能会导致回调地狱,您可以通过使用异步模块或Promises等做法来减少回调地狱。
那么错误优先回调怎么样?
Node 和 Express 的常见约定是使用错误优先回调。按照此约定,回调函数中的第一个值是错误值,而后续参数则包含成功数据。这确保了即使你真的在使用回调时遇到麻烦,当请求由于某个进程无法完成而被阻塞时,你也能收到通知。
解释事件循环。
这引出了本节的最后一个重要概念——事件循环。您可以观看这个关于事件循环的精彩视频讲解。但由于篇幅较长,因此本节将总结其中的亮点。
事件循环是 JavaScript 异步编程背后的秘密。JS 在单个线程上执行所有操作,但使用一些智能数据结构,它给我们一种多线程的错觉。
事件循环的工作是监视堆栈和任务队列。如果堆栈为空而任务队列不为空,它会将队列中的第一个任务推送到堆栈,从而有效地运行它。“webapis”部分是我们从环境提供的任何资源中获得的,在本例中,是浏览器为我们提供了跟踪setTimeout
.
Ajax 请求将以相同的方式处理 - 放入 webapi 部分,因为请求的代码不存在于 JS 运行时中,而是存在于浏览器 webapi 中。
之后我们还有一部分内容会讲解基础知识。快来进入第二部分!
鏂囩珷鏉ユ簮锛�https://dev.to/singhshemona/learning-nodejs-part-1-understanding-the-essentials-4h4o