Nodejs产生的背景
了解JavaScript
1995年,JavaScript 出现,最初用于增强网页的交互性。
我们知道,传统JavaScript依赖html语言,而html语言被浏览器渲染为网页上的元素节点,在这个前提下,html的代码必定是要被传递给客户端也就是浏览器。同样,JavaScript代码也会随之一起在客户端运行,这也体现了JavaScript的语言特性,它是一门脚本语言,依赖宿主环境(也就是浏览器)。
这就造成了一个安全性问题,如果一个网页通过JavaScript能够随意操作我们的计算机,那我们的网络将毫无安全性可言。因此,JavaScript最初并没有开发操作系统的能力,这里“开发操作系统的能力”并不是说开发一个操作系统,而是指的直接与硬件交互、管理硬件资源、实现操作系统核心功能的能力。
V8引擎
V8 引擎
由 Google 开发,最初用于 Chrome 浏览器,目的是提高 JavaScript 的执行效率。
V8 引擎通过即时编译(JIT)技术,将 JavaScript 代码直接编译为机器码,从而显著提升了执行速度。
Nodejs诞生
2009 年,Ryan Dahl 基于 V8 引擎创建了 Node.js。我们猜测,这个叫Ryan Dahl
的开发者可能跟我们一样只会JavaScript
,但是他又想开发自己的服务端。
实际上,Ryan Dahl 的目标是让 JavaScript 能够在服务器端运行,从而摆脱浏览器环境的限制。他将 V8 引擎从 Chrome 浏览器中提取出来,并将其与事件驱动和非阻塞 I/O 模型结合,创建了 Node.js。
- V8 引擎:负责执行
JavaScript
代码。 - libuv:一个跨平台的异步
I/O
库,提供事件循环和非阻塞I/O
支持。 - 其他组件:包括
HTTP 服务器
、文件系统模块
等,共同构成了Node.js
的运行时环境。
这些模块组成了Nodejs的核心架构。
Node.js
的出现使得JavaScript
成为一种全栈开发语言,开发者可以使用同一门语言编写前端和后端代码。
同时推动了npm(Node Package Manager)
的发展,形成了庞大的开源生态系统。
Nodejs的功能
npm包管理
NPM(Node Package Manager)是全球最大的开源包生态系统,提供超过 100 万个模块。
我们可以通过npm install
轻松安装第三方库,如 Express、Socket.io、MongoDB 等。
文件系统
Node.js 提供了fs
模块,用于与操作系统文件系统交互,支持同步和异步操作。文件系统解决了浏览器上JavaScript无法操作文件的缺点。
模块化
Node.js 采用CommonJS模块规范,通过require
和module.exports
实现模块的加载和导出。
通过模块化我们可以将功能封装为模块,便于维护和扩展。
每个模块有独立的作用域,避免全局变量污染,模块在第一次加载后会被缓存,避免重复加载。
网络编程
Node.js 提供了强大的网络编程能力,支持 TCP、UDP、HTTP 等协议。
我们可以通过http
模块创建Web 服务器
,处理 HTTP 请求和响应,也可以通过第三方库(如 ws)实现实时双向通信。
我们在开发Vue
项目时使用的脚手架就是基于Nodejs的网络编程能力,让代码直接运行在服务器上。
路径系统
Node.js 提供了path 模块
,用于处理和转换文件路径。
通过路径系统我们可以更加封闭地解析或者拼接路径,无须考虑不同操作系统下的路径格式。
异步机制
Node.js 的异步机制基于事件驱动和非阻塞 I/O,通过回调函数、Promise 和 async/await 实现。
Node.js 使用事件循环(Event Loop)处理异步操作,避免阻塞主线程。
基于此异步机制,Nodejs可以同时处理大量 I/O 操作(如文件读写、网络请求)。