Node:是一个基于 V8 引擎的 JavaScript 运行的环境。
V8 引擎可以嵌入到任何 C++ 应用程序中,无论是 Chrome 浏览器还是 Node,事实上都是嵌入了 V8 引擎来执行 JavaScript 代码的。
Node 架构:
- 编写的 JavaScript 代码首先经过 V8 引擎进行翻译。
- 然后由 Node 绑定到 libuv,由 libuv 绑定操作系统中的某个操作,去调用执行。
- 执行成功后,经过事件循环,将回调函数加入到任务队列中。
- 然后由 Node 绑定到 V8 引擎中,由 V8 引擎来执行相应的 JavaScript 代码。
Node 架构和浏览器架构的区别:
在 Node 中,除了使用 V8 引擎来运行 JavaScript 代码,还包含有其他的程序来进行系统层面的一些操作,例如文件系统读写、网络 IO、加密、压缩/解压文件等。
在 Chrome 浏览器中, 除了使用 V8 引擎来运行 JavaScript 代码外,还包含有解析、渲染 HTML、CSS 等的相关渲染引擎,另外还包含有支持浏览器操作的 API、浏览器的事件循环等。
在 Node 中,提供给 JS 调用的 API 是用 JS 编写的,V8 引擎是用 C++ 编写的,用来调用操作系统的 libuv 是用 C 语言编写的,因此,严格来说,Node 程序是用 JS/C++/C 语言编写的。
Node 的应用场景:
- 目前前端开发的库,都是以 node 包的形式进行管理的。
- 越来越多的公司使用 Node 来进行 Web 服务器、中间件、代理服务器开发。
- 大量项目需要借助 Node 完成前后端渲染的同构应用。
- 资深前端工程师需要为项目编写脚本工具。
- 很多企业在使用 Electron(基于 Node 来运行)来开发桌面应用程序。
安装 Node:
- 在官网
https://nodejs.org/en
中,下载对应系统的 node 安装包。 - 双击 node 安装包进行安装,安装成功后就可以使用 Node 了。
使用 Node 运行 JavaScript 文件:
- 新建一个
test.js
文件,并编写一些代码。 - 在命令行中进入该文件所在的文件夹,输入
node test.js
,即可使用 Node 来运行该 JavaScript 文件。
Node 的 REPL:
REPL 是一个简单的、交互式的编程环境。
Node 提供了一个 REPL 环境,可以在其中演练简单的代码。在命令行中输入 node
即可进入 REPL 环境,输入 .exit
即可退出 REPL 环境。
浏览器的 console 就可以看成是一个 REPL。
Node 的输出和输入:
输出:
- 在 JavaScript 文件中可以使用 console 打印内容,通过 Node 运行 JavaScript 文件后即可看到输出的结果。
输入:
- 通过 Node 运行 JavaScript 文件时,可以在后面以空格隔开输入内容;在 JavaScript 文件中即可通过 process 内置对象的 argv 属性即可查看到输入的内容。
可以看到,打印process.argv
,输入的是一个数组,第一项是 Node 所在的位置,第二项是 JavaScript 文件所在的位置,后面项就是输入的内容。
Node 中的全局对象:
Node 提供了很多全局对象,可以直接使用。一些常见的全局对象有:
- global:类似于浏览器中的 window,其他的全局对象都有被添加到 global 对象上。
- process:当前的 Node 进程信息。
- console:提供了简单的调试控制台。
- 定时器函数:
setTimeout()
、setInterval()
、setImmediate()
特殊的全局对象:
有一些全局对象很特殊,它们实际上是模块中的变量,只不过每个模块都有,因此看起来像是全局变量。这些全局对象在命令行交互中是不可以使用的。
-
__dirname
:获取当前文件所在的路径。
-
__filename
:获取当前文件所在的路径及文件名。 -
exports。
-
module。
-
require()
。
Node 中的内置模块:
path:
path 模块用于对文件和路径进行处理。
例如:在 MacOS、Linux 和 Windows 上的路径是不一样的。MacOS、Linux 操作系统上使用 /
作为路径的分隔符,Windows 操作系统上使用 \
或者 \\
作为路径的分隔符,当然目前也支持 /
。那么如果在 Windows 上使用 \
作为分隔符开发了一个应用程序,部署到 Linux 上的话,路径就会出现问题。所以为了屏蔽不同操作系统之间路径的差异,可以使用 path 模块。
方法:
-
path.extname(filepath)
:从文件路径中获取文件的后缀名。 -
path.basename(filepath)
:从文件路径中获取完整的文件名。 -
path.dirname(filepath)
:从文件路径中获取文件所在的目录。 -
path.join(filepath1, filepath2, ...)
:拼接路径。
-
path.join(filepath1, filepath2, ...)
:拼接路径,最终返回的一定是绝对路径。如果没有传递路径参数,那么会返回当前工作目录的绝对路径。最终返回的路径会被规范化:删除尾部斜杠、零长度的路径会被忽略。
拼接路径的原则:
- 传入的路径参数会被从右往左依次处理,直到构造成一个绝对路径,就停止并返回。
- 如果处理完所有的路径参数之后,还没有生成绝对路径,那么为其拼接当前工作目录的绝对路径。