初识 Node.js

315 阅读2分钟

本文正在参与技术专题征文Node.js进阶之路,点击查看详情

介绍

官网定义

如果你打开 Node.js 的官网,你会发现整个首页有且只有一句话是用来描述 Node.js 的:

Node.js is a JavaScript runtime built on Chrome's V8 JavaScript engine.

官网的中文版翻译为:

Node.js 是一个基于 Chrome V8 引擎 的 JavaScript 运行时环境。

官方的定义,想来是熔炼出来的多一个废字算它输的精华。那么我就再给翻译翻译,到底什么叫“运行时”?什么又是“V8 引擎”?

  • 运行时

运行时是指一个程序在运行(或者在被执行)的依赖。
那么 js 的运行为何需要有依赖呢?

  • V8 引擎

因为 js 是一门高级编程语言,而计算机本身只能识别机器指令,并不认识高级语言,所以 js 需要通过 js 引擎转换成机器指令,才能最终在 cpu 运行。而 V8 引擎就是由谷歌研发,并用于 Chrome 浏览器的一款 js 引擎,关于 V8 引擎更多的细节,可以移步《浏览器从下载网页到渲染的过程与 V8 引擎介绍》

工作流程与架构图

工作流程

下面是我依据网上的图画的一张 Node.js 的工作流程图:

我们用 js 编写的应用程序交由 V8 引擎执行编译,V8 通过 Node.js Bindings,调用一些 Node API 将任务放到 Libuv 的事件循环中。Libuv 是使用 C 语言编写的库(lib),uv 是一种下图所示的独角迅猛龙:

image.png

通过 Libuv,去控制操作系统中的一些功能,比如文件系统读写、网卡或显卡等。

架构

了解完工作流程图,再看一张同样依据网络上资料画的 Node.js 架构图: image.png
其中,Node.js API 和 Node.js Bindings 基本上是使用 js 编写的,V8 采用 c++ 编写,Libuv 则是用 c 编写的。所以我们在 github 上看 nodejs 源码的语言分析图,可以看到其采用了多种语言编写:

image.png

应用场景

  • 比如现在流行前端工程化之后,我们使用的一些第三方库,都是通过 npm、yarn 或 pnpm 安装的,因为它们都是以 node 包的形式进行的管理;
  • 比如开发 VS Code 用到的 Electron,就有嵌入 Node.js;
  • 比如一些同构应用程序(服务器端渲染+客户端导航),也可借由 Node.js 完成;

感谢 Node.js 的出现,让 Jeff Atwood 在 2007 年说出的那句 "Any application than can be written in JavaScript, will eventually be written in JavaScript" (能被 js 改写的终将被 js 改写),一步步成为现实。

感谢.gif 点赞.png