前言

随着多年的发展,Node.js覆盖了从业务开发到工程基础设施的完整链路:Web 后端,WebSocket,CLI 工具等等, 甚至连当今流行 WEB3工程与AI 工程都与其有深深关联

基础概念

nodeJs 各技术点如下

  • JavaScript (JS):编程语言
  • ECMAScript (ES):JS 的标准规范(例如 ES5、ES2015、ES2020…)
  • V8:JavaScript 引擎(负责执行 JS)
  • Chrome:浏览器运行时(V8 + Web API,如 DOM)
  • Node.js:服务端/命令行运行时(V8 + Node API,如 fsprocess
  • TypeScript (TS):JS 超集(微软参考ES规范并增加类型系统,最终编译成 JS)
  • npm:Node.js 包管理器(装依赖、跑脚本、发包)
  • nvm:Node 版本管理器(多版本切换)

第二层:执行层

第一层:标准与语言

定义语法/语义

作为语法基础

编译/转译为

交给引擎执行

浏览器底层API

系统底层API

ECMAScript
(语言标准)

JavaScript
(语言实现)

TypeScript
(JS + 类型系统)

V8 引擎

Chrome 运行时
(V8 + Web API)

Node.js 运行时
(V8 + Node API)

结合依赖关系开发者可通过

  • nvm选择nodejs的版本
  • 通过npm管理依赖包
  • 再结合代码要运行的环境,选择对应的编译工具

ES5、ES6、ES2020 到底是什么
它们是 ECMAScript 标准的版本名,不是不同语言。

  • ES5(2009):传统老项目常见基线。
  • ES6 = ES2015:现代 JS 分水岭(let/const、class、模块、Promise)。
  • 后续按年份命名:ES2016、ES2017、ES2020、ES2025…

注意:浏览器/Node 不是“按 ES 整包支持”,而是“按特性逐步支持”。
所以工程里会说“某特性兼容性如何”,而不是简单说“支持 ES2025 ”。


浏览器和 Node 是不是同一个环境
不是。 但它们是“同级别”:都是 JS 运行时。

  • 浏览器有:window、document、DOM、同源策略。
  • Node 有:fs、path、process、文件系统/进程能力。

发展历史

技术 大致时间 为什么出现 主要解决问题
JavaScript 1995 网页需要交互,不想每次都依赖后端刷新 前端动态交互能力
ECMAScript 1997 各浏览器实现差异大,生态混乱 给 JS 一个统一标准
V8 2008 JS 性能瓶颈,难支撑复杂应用 高性能执行(JIT)
Chrome 2008 浏览器性能/稳定性不够 更快更稳的浏览器运行时
Node.js 2009 JS 只能在浏览器跑,前后端割裂 JS 进入服务端/CLI,I/O 友好
npm 2009 后快速发展 Node 缺统一依赖生态 包分发、版本管理、复用
nvm(社区工具) 2011 前后 Node 版本冲突严重 一机多版本切换
TypeScript 2012 大型 JS 项目可维护性差 类型检查、重构安全、工程化

NPM基础

npm做为node项目的工程管理工具,是必须了解的.可以从package.json切入,以下是核心字段

  • name:包唯一标识;这里是 openclaw,影响 npm install openclaw、node_modules/openclaw、打包名(如 openclaw-版本.tgz)。
  • version:当前版本号;这里是 2026.2.25,用于发布、依赖解析、产物命名和升级判断。
  • description:包简介;用于 npm/GitHub 展示,不影响运行逻辑。
  • keywords:检索关键词;作用在npm search。
  • homepage:项目主页链接;展示/跳转用途。
  • bugs:问题反馈地址;npm 页面会用它指向 issue 入口。
  • license:许可证声明;合规和开源分发所需。
  • author:作者信息;当前为空,纯元数据。
  • repository:源码仓库信息;用于溯源、npm 展示、工具联动。
  • bin:CLI 命令映射;这里把 openclaw 命令绑定到 openclaw.mjs,安装后可直接执行 openclaw。
  • files:发布白名单;决定 npm publish 时哪些文件/目录会被打进包(比如 dist/、extensions/、docs/ 等)。
  • type:模块系统声明;这里是 “module”,表示 .js 按 ESM 规则解析(用 import/export)。没写按 CommonJS 解析(用 require/module.exports)
  • main:默认入口; exports字段的默认值
  • exports:对外导出映射;外部可 import 的入口和类型声明路径。如果没有exports 没值,走main字段
  • scripts:项目命令入口;这里集中定义了构建、开发、测试、发布检查等命令.
  • dependencies:生产依赖;运行时必须安装(。
  • devDependencies:开发依赖;用于类型检查、测试、lint、构建工具(如 typescript、vitest、oxlint)。
  • peerDependencies:宿主依赖约束;就是运行时依赖,即provided依赖
  • optionalDependencies:可选依赖;安装失败不一定阻塞整体安装。
  • engines:运行时版本要求;这里要求 Node >=22.12.0,低版本可能告警/不兼容。
  • packageManager:推荐包管理器及版本;这里是 pnpm@10.23.0,用于团队环境一致性
  • pnpm 字段是 pnpm 专用配置区,用于控制安装策略和依赖解析规则。它只对 pnpm 生效,npm 基本会忽略。

与maven的对比

功能维度 npm(package.json) Maven(pom.xml) 主要差异
项目身份与版本 name, version groupId, artifactId, version npm 常以 name 作为安装名;Maven 用 GAV 坐标唯一标识
项目展示与溯源 description, keywords, homepage, bugs, author, repository, license name, description, url, issueManagement, developers, scm, licenses Maven 元数据更结构化;npm 更偏页面展示/搜索
依赖管理 dependencies, devDependencies, peerDependencies, optionalDependencies + scope(compile/test/provided/runtime)+ optional npm 有 peerDependencies(宿主约束)这一强语义
构建与命令编排 scripts 生命周期 + 插件(mvn test/package/deploy) npm 更自由脚本化;Maven 更标准流程化
发布内容控制 files(发布白名单) 插件 includes/excludes(jar/assembly/shade 等) npm 直接白名单;Maven 多靠插件配置
包入口与导出 main, exports 无直接等价字段 npm 原生定义包导出边界;Maven 不在 POM 定义模块导出
CLI 暴露 bin 无直接等价(通常借助插件/打包脚本) npm 对命令行入口是原生能力
运行环境约束 engines Enforcer/Toolchain/Compiler 插件配置 npm 字段直观;Maven 常靠插件规则
包管理器一致性 packageManager(如 pnpm@10.x) Maven Wrapper(mvnw) 都可锁工具版本,但机制不同

生命周期

npm 内置命令触发(生命周期)

  • npm install / npm ci 常见顺序:
    preinstall -> install -> postinstall -> preprepare -> prepare -> postprepare
  • npm pack:
    prepack -> prepare -> postpack
  • npm publish:
    prepublishOnly -> prepack -> prepare -> postpack -> publish -> postpublish
  • npm start:
    prestart -> start -> poststart
  • npm test:
    pretest -> test -> posttest

你可以在scripts中去定义额外的命令,例如

{
    "scripts": {
      "preinstall": "echo preinstall",
      "install": "echo install",
      "postinstall": "echo postinstall"
    }
  }

执行 npm install 时会按顺序触发这些脚本。注意:

  1. 你定义的 install 脚本是“附加钩子”,不是替代安装逻辑
  2. 如果你的 install 脚本报错退出(非 0),整个 npm install 会失败。
手动命令

除了内置生命周期, npm支持手动命令

  1. npm run <script>
  2. pnpm <script>

其也支持对应的勾子规则:pre<name> -> <name> -> post<name>

  • 你执行 npm run build
  • 若存在会按 prebuild -> build -> postbuild

TODO

Node.js 源码剖析
package.json官方文档

Logo

有“AI”的1024 = 2048,欢迎大家加入2048 AI社区

更多推荐