Node.js 简介
Node.js 是一个开源、跨平台的 JavaScript 运行时环境,它有以下特点:
- 单线程
Node.js 应用在单个进程、单个线程中运行,无需为每个请求创建新线程。但也可以通过child_progress
模块创建子进程,worker_threads
模块创建子线程。 - 非阻塞
Node.js 提供的标准库通常是非阻塞I/O的。运行的JS代码是同步的,可能因为计算量大造成性能问题,但这是执行JS而不是等待非JS操作,因此不认为是阻塞。
V8 引擎
Node.js 的 JavaScript 引擎是V8,同 Chrome 浏览器,负责解析和执行JavaScript代码。浏览器则额外提供了 DOM、其他Web API。V8 是用 C++ 编写的,可以在Mac,Windows,Linux等系统上运行。
JavaScript 被认为是一种解释型语言(类似的有Python、Shell),可以在运行时逐条翻译为机器语言。
随着 JS 的代码量级从早期的几十行,增长到现在多达数十万行,现代 JS 引擎不再只是解释 JS,而是编译它。JavaScript 由 V8 在内部即时 (JIT)编译以加快运行速度。虽然这样做会降低 JS 的启动速度,但编译完成后的 JS 运行速度比解释型语言性能更高。
异步编程
编程语言一般是同步的,一些语言提供库来管理异步。
JavaScript 默认是同步的。在浏览器中,JavaScript通过浏览器的事件驱动回调函数,实现异步。在Node.js中,Node.js提供非阻塞I/O的标准库来实现异步。
较旧的Node.js版本中,标准库提供的是回调函数来执行异步代码,而在较新的版本(10+)中,标准库支持了Promise风格用法。
包管理器
包管理器提供了简易的方式去加载社区丰富的开源内容,Node.js 与 JavaScript 互相成就,为JS带来浏览器外开发能力的同时,在2022年9月成为最大的单一语言代码存储库。
Node.js 安装后,除了提供node
CLI命令运行JS,还提供npm
CLI命令操作包管理器。也可以安装 npm
的替代品 yarn
、pnpm
。
能力
Node.js 的作用:
- 网络应用服务器,快速实现HTTP等类型的网络服务
- 操作文件系统、数据库
常见用途:
- SSR、接口服务(如GraphQL)
- 脚手架、测试框架
- 命令行工具(如 nvm、nrm)
可能是由于JS存在性能、计算精度问题,Node.js适用场景有限。
为了解决这些问题,Node.js可以通过 node-gyp
库编译C++模块来实现扩展,也可以使用全局对象 WebAssembly
来加载wasm文件。