一文搞懂 Node.js、npm/yarn/pnpm、Vite/Webpack:前端工程化到底在干什么?
很多前端初学者会遇到一个困惑:我只是想写 HTML、CSS、JavaScript,为什么还要学 Node.js?为什么安装项目要用 npm、yarn、pnpm?为什么运行项目又会看到 Vite、Webpack?这些工具看起来很多,其实它们各自负责的事情并不一样。Node.js:让 JavaScript 可以运行在浏览器之外。:管理项目依赖和运行脚本。:负责前端项目的开发服务器、打包、构建和优化。N
前言
很多前端初学者会遇到一个困惑:
我只是想写 HTML、CSS、JavaScript,为什么还要学 Node.js?为什么安装项目要用 npm、yarn、pnpm?为什么运行项目又会看到 Vite、Webpack?
这些工具看起来很多,其实它们各自负责的事情并不一样。简单来说:
- Node.js:让 JavaScript 可以运行在浏览器之外。
- npm / yarn / pnpm:管理项目依赖和运行脚本。
- Vite / Webpack:负责前端项目的开发服务器、打包、构建和优化。
如果把前端项目比作一家餐厅:
- Node.js 是厨房环境。
- npm / yarn / pnpm 是采购系统,负责买食材。
- Vite / Webpack 是厨师和出餐流程,负责把食材加工成最终菜品。
- 浏览器是顾客,最终吃到的是 HTML、CSS、JavaScript。
这篇文章就用简单易懂的方式,把它们之间的关系讲清楚。
一、Node.js 是什么?
1. JavaScript 最开始只能运行在浏览器里
以前 JavaScript 主要运行在浏览器中,比如:
<script>
console.log("Hello JavaScript");
</script>
浏览器中有 JavaScript 引擎,比如 Chrome 的 V8 引擎,负责解析和执行 JavaScript 代码。
但是浏览器里的 JavaScript 能力有限,它主要用于操作页面,比如:
- 操作 DOM
- 处理点击事件
- 发送 Ajax 请求
- 操作浏览器缓存
它不能直接做很多服务端或本地系统相关的事情,比如:
- 读取本地文件
- 启动一个服务器
- 操作数据库
- 执行构建脚本
2. Node.js 让 JavaScript 可以运行在服务端和本地环境
Node.js 的出现,让 JavaScript 不再只能运行在浏览器里。
Node.js 基于 Chrome V8 引擎,同时提供了很多系统能力,比如:
- 文件读写
- 网络请求
- 启动 HTTP 服务
- 执行命令行工具
- 管理项目依赖
- 构建前端项目
例如:
console.log("Hello Node.js");
保存为 index.js,然后执行:
node index.js
这段 JavaScript 就可以在本地终端中运行,而不是在浏览器中运行。
3. 前端为什么要安装 Node.js?
很多人会问:
我写的是前端页面,为什么要安装 Node.js?
原因是现代前端项目已经不只是几个静态文件了。现代前端开发通常需要:
- 安装第三方库,比如 Vue、React、Axios
- 启动本地开发服务器
- 编译 TypeScript
- 处理 Less、Sass
- 压缩 JavaScript 和 CSS
- 打包项目上线
- 执行 lint、test、build 等脚本
这些事情都需要一个本地运行环境,而 Node.js 就提供了这个环境。
所以可以这样理解:
Node.js 是现代前端工程化的基础运行环境。
二、npm、yarn、pnpm 是什么?
1. 它们都是包管理工具
在前端项目中,我们经常会使用第三方库,比如:
npm install axios
安装之后,就可以在代码中使用:
import axios from "axios";
axios.get("/api/user");
这里的 axios 就是一个第三方包。
而 npm、yarn、pnpm 的作用就是:
- 安装依赖
- 删除依赖
- 更新依赖
- 管理依赖版本
- 执行项目脚本
它们都属于 JavaScript 的包管理工具。
2. npm 是什么?
npm 全称是 Node Package Manager,是 Node.js 官方自带的包管理工具。
安装 Node.js 后,一般会自动带上 npm。
常用命令:
npm install
npm install axios
npm uninstall axios
npm run dev
npm run build
npm 是最常见、最基础的包管理工具,很多项目默认都可以用 npm 来安装和运行。
3. yarn 是什么?
yarn 是 Facebook 推出的包管理工具,主要是为了解决早期 npm 的一些问题,比如:
- 安装速度慢
- 版本不够稳定
- 依赖解析不够一致
yarn 的常用命令:
yarn
yarn add axios
yarn remove axios
yarn dev
yarn build
yarn 和 npm 的功能类似,只是命令写法略有不同。
4. pnpm 是什么?
pnpm 是现在很多项目非常喜欢用的包管理工具。
它最大的特点是:
节省磁盘空间,安装速度快,依赖管理更严格。
传统 npm 或 yarn 安装依赖时,每个项目都会有自己的 node_modules。如果多个项目都安装了同一个依赖,可能会重复占用很多空间。
pnpm 会把依赖统一存储到全局仓库中,然后通过链接的方式放到项目里。
简单理解:
- npm/yarn:每个项目都复制一份依赖。
- pnpm:依赖集中存储,项目里通过链接使用。
pnpm 常用命令:
pnpm install
pnpm add axios
pnpm remove axios
pnpm dev
pnpm build
5. npm、yarn、pnpm 的区别
| 工具 | 特点 | 适合场景 |
|---|---|---|
| npm | Node.js 自带,最通用 | 普通项目、初学者 |
| yarn | 安装稳定,生态成熟 | 老项目、团队已有规范 |
| pnpm | 速度快,节省空间,依赖严格 | 现代项目、中大型项目 |
实际开发中,三者通常选一个即可,不建议在同一个项目里混用。
判断项目使用哪个包管理器,可以看锁文件:
| 锁文件 | 包管理器 |
|---|---|
package-lock.json |
npm |
yarn.lock |
yarn |
pnpm-lock.yaml |
pnpm |
三、package.json 是什么?
几乎所有现代前端项目里都有一个 package.json 文件。
它是项目的配置说明书。
一个简单的 package.json 可能长这样:
{
"name": "my-vite-project",
"version": "1.0.0",
"scripts": {
"dev": "vite",
"build": "vite build",
"preview": "vite preview"
},
"dependencies": {
"vue": "^3.0.0",
"axios": "^1.0.0"
},
"devDependencies": {
"vite": "^5.0.0"
}
}
重点看几个字段。
1. scripts
scripts 用来定义项目脚本。
比如:
"scripts": {
"dev": "vite",
"build": "vite build"
}
当我们执行:
npm run dev
本质上就是执行:
vite
当我们执行:
npm run build
本质上就是执行:
vite build
如果是 pnpm,则可以写:
pnpm dev
pnpm build
如果是 yarn,则可以写:
yarn dev
yarn build
2. dependencies
dependencies 表示项目运行时需要的依赖。
比如:
"dependencies": {
"vue": "^3.0.0",
"axios": "^1.0.0"
}
这些依赖通常会被打包进最终项目中。
3. devDependencies
devDependencies 表示开发阶段需要的依赖。
比如:
"devDependencies": {
"vite": "^5.0.0",
"typescript": "^5.0.0"
}
这些依赖主要用于开发、构建、测试,不一定会进入最终线上代码。
四、Vite 和 Webpack 是什么?
Vite 和 Webpack 都是前端构建工具。
它们主要负责:
- 启动本地开发服务器
- 处理模块导入
- 编译 Vue、React、TypeScript
- 处理 CSS、Less、Sass
- 处理图片、字体等静态资源
- 代码压缩
- 打包生成上线文件
也就是说,我们写的源代码通常不能直接上线,需要经过构建工具处理。
例如我们写:
import { createApp } from "vue";
import App from "./App.vue";
import "./style.css";
createApp(App).mount("#app");
浏览器最终拿到的可能已经是被打包、压缩、拆分后的文件。
五、Webpack 是什么?
Webpack 是一个非常经典的前端构建工具。
它的核心思想是:
一切资源都可以作为模块处理。
比如:
- JS 是模块
- CSS 是模块
- 图片是模块
- 字体是模块
- Vue 文件也是模块
Webpack 会从入口文件开始,分析所有依赖关系,然后把它们打包成浏览器可以运行的文件。
Webpack 的基本工作流程
简单来说:
- 从入口文件开始,比如
src/main.js - 分析代码中的
import和require - 找到所有依赖模块
- 使用 loader 处理不同类型的文件
- 使用 plugin 执行额外功能
- 输出最终打包文件
loader 是什么?
Webpack 本身主要认识 JavaScript 和 JSON。
如果要处理 CSS、图片、Vue、TypeScript 等文件,就需要 loader。
比如:
css-loader:处理 CSSstyle-loader:把 CSS 插入页面babel-loader:转换 JavaScriptts-loader:处理 TypeScriptvue-loader:处理.vue文件
plugin 是什么?
plugin 用来扩展 Webpack 的能力。
比如:
- 生成 HTML 文件
- 清理打包目录
- 提取 CSS 文件
- 压缩代码
- 定义环境变量
可以简单理解:
loader 负责处理文件,plugin 负责扩展构建流程。
六、Vite 是什么?
Vite 是一个现代前端构建工具,特点是开发启动快、热更新快、配置简单。
Vite 的核心设计是:
开发环境利用浏览器原生 ES Modules,生产环境使用 Rollup 打包。
1. 为什么 Vite 启动快?
传统 Webpack 开发服务器通常需要先把整个项目打包一遍,然后才能启动。
项目越大,启动越慢。
而 Vite 在开发环境中不会一开始就打包整个项目,而是直接启动服务器。
浏览器请求哪个模块,Vite 就处理哪个模块。
也就是说:
- Webpack:先整体打包,再启动。
- Vite:先启动服务,按需编译。
这就是 Vite 冷启动很快的主要原因。
2. 什么是 ES Modules?
ES Modules 是浏览器原生支持的模块系统。
比如:
import { add } from "./math.js";
console.log(add(1, 2));
现代浏览器可以直接识别这种 import 语法。
Vite 正是利用了浏览器原生 ESM 的能力,在开发环境中避免了全量打包。
3. Vite 的依赖预构建
虽然浏览器支持 ESM,但很多第三方包可能是 CommonJS 格式,或者内部模块非常多。
如果直接让浏览器加载,可能会产生大量请求,影响性能。
所以 Vite 会使用 esbuild 对依赖进行预构建。
esbuild 是用 Go 语言写的构建工具,速度非常快。
依赖预构建主要做两件事:
- 把 CommonJS 转成 ESM
- 把多个零散模块合并,减少浏览器请求数量
4. Vite 的热更新为什么快?
热更新也叫 HMR,全称 Hot Module Replacement。
当我们修改代码时,页面不需要完整刷新,只更新变化的模块。
Vite 的 HMR 很快,因为它基于 ESM 的模块关系,只需要更新受影响的模块,而不是重新打包整个项目。
七、Vite 和 Webpack 的区别
| 对比项 | Vite | Webpack |
|---|---|---|
| 开发启动 | 快,按需编译 | 相对慢,通常需要先打包 |
| 开发模式 | 基于浏览器原生 ESM | 基于打包后的 bundle |
| 热更新 | 快,模块级更新 | 项目变大后可能变慢 |
| 生产构建 | 默认使用 Rollup | 使用 Webpack 自身 |
| 配置复杂度 | 相对简单 | 更灵活但更复杂 |
| 生态 | 现代框架支持好 | 生态成熟,历史项目多 |
| 适合场景 | 新项目、现代前端项目 | 复杂项目、老项目、深度定制项目 |
需要注意:
Vite 并不是完全替代 Webpack,Webpack 也不是过时工具。它们只是设计思路和适用场景不同。
Webpack 的优势是生态成熟、配置能力强,很多大型老项目仍然使用 Webpack。
Vite 的优势是开发体验更好,启动快,配置简单,非常适合现代前端项目。
八、它们之间到底是什么关系?
现在把 Node.js、npm/yarn/pnpm、Vite/Webpack 串起来。
一个现代前端项目通常是这样的:
Node.js
↓
提供本地运行环境
npm / yarn / pnpm
↓
安装依赖、执行脚本
Vite / Webpack
↓
启动开发服务器、处理源码、打包项目
浏览器
↓
运行最终生成的 HTML、CSS、JavaScript
举个例子。
我们创建一个 Vite 项目后,可能会执行:
pnpm install
pnpm dev
pnpm build
这几条命令背后的含义是:
1. pnpm install
安装项目依赖。
它会读取 package.json,然后把项目需要的依赖安装到本地。
比如:
- Vue
- React
- Vite
- TypeScript
- Axios
2. pnpm dev
启动开发服务器。
它会执行 package.json 中的脚本:
"dev": "vite"
也就是启动 Vite 开发服务器。
然后我们就可以在浏览器访问:
http://localhost:5173
3. pnpm build
构建生产环境代码。
它会执行:
"build": "vite build"
Vite 会把项目打包到 dist 目录中。
最终上线时,服务器部署的一般就是 dist 目录里的文件。
九、一个完整的前端项目运行流程
假设我们从 GitHub 下载了一个前端项目。
通常运行步骤是:
git clone 项目地址
cd 项目目录
pnpm install
pnpm dev
或者使用 npm:
npm install
npm run dev
这几个步骤可以这样理解:
- 下载项目代码。
- 进入项目目录。
- 安装依赖。
- 启动开发服务器。
- 浏览器打开本地地址查看页面。
如果要打包上线:
pnpm build
或者:
npm run build
构建完成后,一般会生成:
dist/
这个目录就是生产环境需要部署的静态资源。
十、常见问题
1. Node.js 和浏览器里的 JavaScript 有什么区别?
它们使用的都是 JavaScript 语言,但运行环境不同。
浏览器提供 DOM、BOM 等能力。
Node.js 提供文件系统、网络、进程等能力。
所以:
- 浏览器 JS 主要操作页面。
- Node.js 主要用于服务端、本地工具、工程化脚本。
2. npm install 安装的东西在哪里?
一般在项目目录下的 node_modules 里。
同时依赖信息会记录在:
package.json
锁定版本的信息会记录在:
package-lock.json
yarn.lock
pnpm-lock.yaml
3. node_modules 可以删除吗?
可以。
如果依赖出问题,可以删除 node_modules 后重新安装。
例如:
pnpm install
或者:
npm install
不过不要手动修改 node_modules 里的源码,因为重新安装后改动会丢失。
4. 为什么不建议混用 npm、yarn、pnpm?
因为不同包管理器生成的锁文件不同,依赖解析方式也不同。
混用可能导致:
- 依赖版本不一致
- 本地能运行,别人不能运行
- CI/CD 构建失败
- 锁文件冲突
所以一个项目最好统一一种包管理器。
5. Vite 项目为什么也需要 npm 或 pnpm?
因为 Vite 本身也是一个 npm 包。
我们执行:
pnpm dev
本质上是通过 pnpm 去执行项目中安装的 Vite 命令。
所以关系是:
pnpm 负责执行命令
Vite 负责启动和构建项目
Node.js 负责提供运行环境
6. Vite 开发时不打包,那生产环境还打包吗?
会。
Vite 只是在开发环境中利用 ESM 避免全量打包。
生产环境依然需要打包,因为上线时要考虑:
- 文件压缩
- 代码分割
- Tree Shaking
- 浏览器缓存
- 静态资源优化
- 兼容性处理
Vite 生产构建默认使用 Rollup。
十一、面试中怎么回答?
如果面试官问:
1. 你了解 Node.js 吗?
可以这样回答:
Node.js 是 JavaScript 的运行环境,它基于 V8 引擎,让 JavaScript 可以运行在浏览器之外。前端工程化中,Node.js 主要用于执行构建工具、启动开发服务器、运行 npm 脚本和管理依赖。
2. npm、yarn、pnpm 有什么区别?
可以这样回答:
它们都是 JavaScript 包管理工具,都可以安装依赖和执行脚本。npm 是 Node.js 自带的工具,使用最广;yarn 解决了早期 npm 的一些性能和稳定性问题;pnpm 通过全局内容寻址存储和软链接机制来节省磁盘空间,并且依赖管理更严格。实际项目中一般根据团队规范选择一种,不建议混用。
3. Vite 和 Webpack 有什么区别?
可以这样回答:
Webpack 是传统的打包型构建工具,开发时通常需要先构建依赖图并打包后再启动服务。Vite 在开发环境中利用浏览器原生 ESM,实现按需编译,所以启动速度和热更新速度更快。生产环境下,Vite 默认使用 Rollup 打包。Webpack 的优势是生态成熟、配置能力强,Vite 的优势是开发体验好、配置简单,适合现代前端项目。
4. Vite 为什么快?
可以这样回答:
Vite 快主要有三个原因。第一,开发环境基于浏览器原生 ESM,不需要一开始全量打包。第二,第三方依赖会用 esbuild 进行预构建,esbuild 速度非常快。第三,HMR 是基于模块依赖关系的局部更新,修改文件后只更新相关模块,所以热更新速度很快。
十二、总结
本文介绍了 Node.js、npm/yarn/pnpm、Vite/Webpack 之间的关系。
简单总结:
- Node.js 是 JavaScript 的本地运行环境。
- npm、yarn、pnpm 是包管理工具,用来安装依赖和执行脚本。
- Webpack 是经典构建工具,生态成熟,配置能力强。
- Vite 是现代构建工具,开发启动快,热更新快,配置简单。
- 一个现代前端项目通常依赖 Node.js 环境,通过包管理器安装依赖,再通过 Vite 或 Webpack 启动和构建项目。
最后用一句话概括:
Node.js 提供环境,npm/yarn/pnpm 管理依赖,Vite/Webpack 负责构建,它们共同组成了现代前端工程化的基础。
openEuler 是由开放原子开源基金会孵化的全场景开源操作系统项目,面向数字基础设施四大核心场景(服务器、云计算、边缘计算、嵌入式),全面支持 ARM、x86、RISC-V、loongArch、PowerPC、SW-64 等多样性计算架构
更多推荐

所有评论(0)