一文了解 Node.js
前言
本篇文章将用于了解 Node.js
,现在社区有很多介绍它的文章,因此我主要把我觉得需要去理解的进行一个总结,借用部分内容也会通过链接链接到原文(有的别人已经写的很清楚了,也是事实的陈述,这种会引用原文,但会添加自己的见解)。
整体思路:
- Node.js 是什么?
- 简单介绍 Node.js 的定义
- 理解运行( runtime )时概念
- 理解跨平台概念
- 结论
- Node.js 能做什么?
Node.js 是什么?
介绍
Node.js 是一个开源、跨平台的 JavaScript 运行时环境。
这是官网首页上的描述。详细的理解就是:
Node.js 不是一门新的编程语言,也不是一个 JavaScript 框架,它是一套 JavaScript 运行环境,用来支持 JavaScript 代码的执行。用编程术语来讲,Node.js 是一个 JavaScript 运行时(Runtime)。
这段话摘自于Node.js是什么?Node.js简介
理解运行时
上面提到了 Node.js
给 JavaScript
提供了一个运行环境,提供这个运行环境是用来做啥呢?
我们都知道浏览器本身也给 JavaScript
提供了一个运行环境,在这个环境中,JS 可以调用浏览器提供的一些 API
,来调用浏览器的一些功能,比如 DOM
操作、window
对象、如定时器等等,这些 API 都是浏览器的 JavaScript 运行时环境提供的,而在 chrome
浏览器,这个运行时环境是 Chromium
,它会通过执行引擎 V8
在 JavaScript
执行过程中注入这些 API(运行时环境Chromium和执行引擎V8是从趣学 Node.js中看到的这个说法,查询到的其他资料很少会明确指出)。
注意,V8 引擎
会解析和执行 Chromium
运行时环境提供的 API
。
这里就可以理解了运行时的概念:运行时是编程语言执行过程中的环境。
扩展一下就是:JavaScript 运行时
指的是提供给 API
给 JavaScript
来调用外界程序功能的运行环境。
Node.js
也是使用 V8 引擎
进行解析和执行 JavaScript
,然后给其注入其指定的 API
,然后提供 JavaScript
运行的环境,在这个环境中, JavaScript
就可以通过 V8引擎
调用 Node.js 运行时环境
提供的 API
来调用服务器的一些功能,比如文件读取、网络请求等功能。
理解跨平台
官网描述的一个重要点就是 跨平台
,这说明 Node.js
可以它独立于操作系统,可以在 Linux
、Windows
和 macOS
等多个操作系统上运行。
为了跨平台的特性,Node.js
内部的库一般都会处理多平台的兼容性问题,比如 libuv
。
结论
菜鸟教程 上对 Node.js
的定义:
Node.js
就是运行在服务端的JavaScript
。Node.js
是一个基于Chrome JavaScript 运行时
建立的一个平台。Node.js
是一个事件驱动 I/O 服务端 JavaScript 环境,基于Google
的V8 引擎
,V8 引擎
执行Javascript
的速度非常快,性能非常好。
我觉得从不同角度来看也可以这样定义。
- 第 1 点,可以用于区分它和浏览器端运行的
JavaScript
。 - 第 2 点,可以说明它是一个应用程序,用于支持
JavaScript
运行时建立的一个应用程序。因为Node.js
本身也是一个开源软件,它在服务器上的安装提供了Node
程序,该程序本身可以使JavaScript
文件在该服务器上执行。 - 第 3 点,就是简单描述
Node.js
,和官方的定义最接近。
Node.js 能做什么?
需要知道 Node.js
能做什么,就需要知道它本身提供了什么功能,下面我们来根据 Node.js
的部分内部模块分析一下 Node.js
提供了哪些功能(引用于Node.js是什么?Node.js简介):
模块 | 说明 |
---|---|
libuv | 一个强调异步I/O的多平台支持库。但是 libuv 不仅限于 I/O,它还提供了进程管理、线程池、信号处理、定时器等其它功能。Linux 中一切皆文件,这里的 I/O 不仅仅包括文件读写,还包括数据库读写、网络通信(socket)等。 |
npm | Node.js 包管理器,可以下载包、安装包、卸载包、更新包、上传包等。 |
http_parser | 一款由C语言编写的轻量级 HTTP 解析器,用以支持 Web 应用开发。 |
zlib | 工业级的数据压缩/解压模块,Nodejs 借助 zlib 来创建同步、异步或者流式的压缩/解压接口。 |
OpenSSL | 该模块提供了经过严密测试的许多加密/解密功能,现代 Web 依赖这些功能来实现安全性,比如 SSL 协议和 https 协议。 |
c-ares | 异步 DNS 查询和解析库。 |
最核心的功能都由 libuv
提供,其官方文档介绍的也很详细,有兴趣可以去看看。
从上面提供的功能我们可以分析出来,Node.js
中主要核心是为了让 JavaScript
可以像 Python
、Ruby
、 PHP
等其它脚本语言一样,可以直接计算机上运行,因此这些语言可以做的很多事 Node.js
也都可以做。比如:
- 开发 web 服务器;
- 开发 GUI 程序,比如
Electron
嵌入了Chromium
和Node.js
,使 Web 开发人员能够创建桌面应用程序; - CLI 工具,也就是不带界面的命令行程序。
- 网络爬虫等各类脚本工具。
而我们平时的工作也离不开 Node.js
,因为它基本上构建了现代前端的整个生态,前端的方方面面都会涉及到它,比如:
- 命令行工具,比如
React
、Vue
等各类脚手架。 - 代码辅助工具,比如
eslint
、prettier
等等。 - 代码打包/编译工具,比如
webpack
、babel
等。 - Node.js 进程管理工具 pm2 等等
- BFF 接口开发
上面只是一些例子,当然还有很多事情可以做,基本上 node.js 可以玩的很好的话,全栈都可以一个人玩。
最后
Node.js
的诞生后给前端的蓬勃发展带来了基础,这也是一个新的方向的开始,才导致了后续新的类似的 JavaScript 运行时
诞生,比如 Deno
、Bun
,而且因为 Node.js
生态繁荣的原因, Deno
、Bun
也会兼容大部分基于 Node.js 规范开发的 npm 包,因此这几个专注于其中之一即可,底层的原理是类似的。
再引入一篇文章的片段来说明一下 Node.js 的起源:
Node.js
是2009
的时候由Ryan Dahl
开发的。Ryan
的本职工作是用C++
写高性能的Web服务器,后来他总结出一个经验,一个高性能服务器应该是满足“事件驱动,非阻塞 I/O”模型的。C++
开发起来比较麻烦,于是Ryan
就想找一种更高级的语言,以便快速开发。
Ryan
发现JavaScript
语言本身的特点就是事件驱动并且是非阻塞 I/O 的,而Chrome
的JavaScript
引擎,也就是V8 引擎
是开源的,而且性能特别棒。于是Ryan
就基于 V8 开发了Node.js
。
最后欢迎👏大家关注➕点赞👍➕收藏✨支持一下,有问题欢迎评论区提出。
参考
转载自:https://juejin.cn/post/7205208559264792632