Node.js 的简单认识

本文最后更新于 2026年4月16日 下午

本文主要参考:

什么是 Node.js

首先理解 + 回顾一下 JavaScript 的运行机制:

JavaScript 代码需要运行时才能运行,而运行时=引擎+API+ 事件循环机制

  • 引擎:相当于执行编译、解释、内存管理的程序
  • API:比如浏览器提供 WebAPI,其中最典型的是 DOM API
  • 事件循环机制:我们之前说过 JavaScript 是单线程的,所谓事件循环机制就是实现异步的方式

所谓 Node.js,就是一个基于 V8 引擎的运行时

Node.js 的使用场景

后端

使用 Node.js,就可以使用 JavaScript / TypeScript 语言写后端,因为 Node.js 提供了诸如fs(文件系统)、net(网络)、http(服务器)等模块,同时,V8 引擎的高效使得基于 Node.js 的程序可以有极高的运行效率。

前端

当然,Node.js 也可以用于前端开发,尽管前端的运行环境是浏览器而不是 Node.js,但 Node.js 提供了与浏览器基本相同的机制,同时提供了编译、打包等能力,因此在前端开发中,往往使用 TypeScript 进行开发,在 Node.js 环境中完成编译和打包后,将生成的打包文件部署在前端。常用的框架有 React.js、Vue.js 等。

客户端

Node.js 还可以通过 React Native、Electron 等框架编写原生应用,提供与网页开发相似的开发体验。

Node.js 运行

Node.js 的运行和 Python 十分相似,可使用 REPL (read-eval-print-loop) 的方式。

  • REPL:命令行输入node,可以打开一个类似输入python的交互式界面。
  • 脚本:node xxx.js运行一个脚本

Node.js 模块化

为什么之前的 JavaScript 章节没有提及包管理之类的东西?

是因为前端开发中,引入模块的方式:

  • 将用到的模块通过 Node.js 全部打包

  • 通过 CDN 引入

    <script src="https://xxx.js"></script>

    但是这样的引入会在浏览器全局对象window里面加入xxx这么一个属性,有点污染,因此我们使用 ES6 Module 进行包管理。

ES6 Module

一些 API,看例子即可:

// 文件名 export.js
// 导出值 value
export { value };
// 导出值 value 并重命名为 aliasNameOfValue
export { value as aliasNameOfValue };
// 以下两句等价
export { value as default };
export default value;

// 对于 TypeScript,可以通过以下方式导出类型
// 二者的区别是前一个可以确保这一行内容不会出现在编译结果中
export type { type };
export { type };

npm

Node.js package manager,是 Node.js 默认的包管理工具。

Node.js 的模块查找

import fs from 'fs';           // 内置文件系统模块
import express from 'express'; // 一个 web 服务器模块

这里涉及一些查找的优先级和逻辑:

  • 对于内置模块,在编译阶段已经确定了它们的位置,因此没有寻址的问题;
  • 对于指定路径的模块:
    1. 首先查找该文件,缺省的后缀名按照 .js, .node, .json 的顺序尝试;
    2. 然后尝试作为文件夹名查找该文件夹下的 package.json 并引用其中 main 字段指定的文件;
    3. 最后尝试作为文件夹名查找该文件夹下的 index 文件,缺省后缀名逻辑与 c. 相同。
  • 对于其他没有指定路径的模块,也即通过包管理器安装的模块,会尝试在当前文件夹下的 node_modules 文件夹下查找,如果查找失败,则依次从上级文件夹中(可能的) node_modules 文件夹下查找。

其他包管理器

操作 npm yarn pnpm
自动安装依赖 npm install yarn install / yarn pnpm install
添加依赖 npm install lodash yarn add lodash pnpm add lodash
添加开发依赖(不用于生产环境) npm install -D typescript yarn add -D typescript pnpm add -D typescript
移除依赖 npm uninstall lodash yarn remove lodash pnpm remove lodash
执行 start 脚本 npm run start yarn start pnpm start