前言🔖
package.json 是 Node.js 生态的项目配置清单。
Vue / React / Angular 这类现代前端工程,都是基于 Node 工具链构建的,没有它,包管理器(npm/yarn/pnpm)不知道这是什么项目、要装什么依赖、怎么运行、怎么打包。
早期纯静态网页(直接打开 html)不需要 package.json;
但现在三大框架都属于工程化前端,离不开 Node 构建环境,因此必须要有。
一、【静态原生网页】vs【框架工程化前端】🔖
🔹早期纯静态网页(直接双击打开 index.html)
文件结构示例
index.html js/main.js css/style.css images/bg.jpg
运行方式:双击 index.html,浏览器直接打开。
工作原理
浏览器原生能力:
- 解析 HTML
- 遇到
<script src="js/main.js">去加载 js - 遇到
<link>加载 css
✅ 特点:
- 源码 = 浏览器可识别代码
- 不需要任何额外工具、不需要 Node、不需要 npm
- 没有依赖管理需求:想用第三方库,直接
<script src="cdn地址">引入
<!-- 老式引入jQuery,不需要安装,不需要package.json --> <script src="https://cdn.jquery.com/jquery.min.js"></script>
❌ 巨大痛点(也是框架诞生的原因)
- 没有版本管理:CDN 换版本要手动改 url;多个库版本冲突很难处理
- 无法模块化:早期浏览器没有标准
import,变量全部暴露在全局,极易命名冲突 - 不能使用高级语法:ES6+/TypeScript 浏览器不全部支持;不能写
.vue/.tsx - 没有组件化:代码复用只能靠复制粘贴
- 无压缩、无代码混淆、无自动加浏览器兼容前缀、无按需加载
- 图片、字体等资源路径管理混乱
简单概括:浏览器能直接读懂源码,不需要中间加工,自然不需要构建工具,也就不需要 package.json
🔹Vue / React / Angular 工程化项目
先说一句关键:
你写的源代码,浏览器看不懂!必须依靠 Node 环境下的构建工具进行翻译、加工,最终输出浏览器能识别的 HTML/JS/CSS。 举例子,看懂「源码」和「最终上线代码」的鸿沟
1)React 源码 .tsx 文件
// App.tsx 浏览器直接打开会报错!浏览器不认识 JSX
function App() {
return <h1>Hello React</h1>
}
export default App;
浏览器:"<h1>xxx" 语法非法,无法解析 JSX。
2)Vue 单文件组件 .vue
<!-- App.vue 浏览器原生完全不识别这种文件格式 -->
<template>
<div>{{ msg }}</div>
</template>
<script setup>
const msg = 'hello vue'
</script>
3)Angular 的 Component、装饰器
@Component({
selector: 'app-root',
templateUrl: './app.component.html'
})
export class AppComponent {}
浏览器原生 JS 不存在 @Component 装饰器语法。
👉 结论:框架源代码 ≠ 浏览器可执行代码,中间必须经过【构建流程】
构建工具:Vite / Webpack / Angular CLI / Rollup,全部运行在 Node.js 环境中。
整条完整工作流程
- 开发者写
.vue/.tsx/ TS 源码 - 执行
npm run dev- npm 读取 package.json,找到脚本命令
- 调用本地安装的构建工具
- 构建工具(运行在 Node)做一系列处理:
- 解析
.vue/.tsx,编译成标准 ES Javascript - TypeScript → JS
- 处理 scss/less → css
- 处理图片、字体资源
- 开启本地开发服务器、热更新
- 解析
- 浏览器访问
http://localhost:5173,接收转换之后的标准 JS 代码
打包上线 npm run build:构建工具进一步:代码压缩、Tree-Shaking、代码分割、资源哈希、兼容语法转译,输出 dist 文件夹。
只有 dist 里面的文件,才等价于早年那种「纯静态网页」。
很多人误区:
❌ 误以为 Vue/React 项目运行需要服务器安装 Node
✅ 纠正:Node只在开发构建阶段使用;打包后的 dist 产物,可以直接放到 Nginx、静态 CDN,不需要 Node 运行。
三、关键对比总结一张表 🔖
| 维度 | 老式纯静态网页(直接打开 html) | Vue/React/Angular 工程化项目 |
|---|---|---|
| 源码格式 | html、原生 js、css,浏览器直接识别 | .vue/.tsx/ TS,浏览器无法识别 |
| 第三方库引入 | script 标签引入 CDN,手动管理 | npm 安装,package.json 统一管理依赖 |
| 是否需要构建 | 不需要 | 必须构建,源码要转译、编译 |
| 是否依赖 Node | 不需要 | 开发 / 打包阶段依赖 Node 环境 |
| package.json | 不存在,不需要 | 必备文件,整个工程化体系入口 |
| 启动方式 | 双击 html /nginx 直接托管源码 | npm run dev 启动构建服务;build 后部署 dist |
四、补充两个高频疑问🔖
疑问 1:能不能写一个 React 页面,不使用 package.json?
可以写极简版本,全部用 CDN 引入 React + 直接在 html 写 JSX,配合 browser.js 实时编译。
但是只能做 demo,不能用于正式项目:
- 不支持组件拆分、模块化
- 不支持 TS
- 开发性能极差(浏览器实时编译 JSX)
- 无法代码压缩、工程规范、自动化部署 行业里正规项目没人这么干。
疑问 2:打包后的 dist 文件夹为什么没有 package.json?
dist 就是编译完成的纯静态资源,已经脱离 Node 构建流程,等同于老式静态网页。
package.json 是工程源码阶段的配置文件,不属于上线产物。
五、最通俗总结🔖
早年网页:写出来的代码浏览器看得懂,直接跑,不需要翻译官 (Node 构建工具),自然不需要清单 (package.json)。
三大框架项目:你写的是高级 “源代码”,浏览器看不懂,必须请来翻译官(运行在 Node 上的 Vite/Webpack)。
package.json 就是:给翻译官看的任务清单 —— 要安装哪些工具、哪些类库、执行什么翻译命令。