Vue.js: Vue.js 简介
Vue.js 是一款用于构建用户界面的渐进式 JavaScript 框架——它能让你用声明式、组件化的方式高效地开发 Web 应用,从简单的表单到复杂的企业级 SPA 都能胜任。
本教程面向有 HTML/CSS/JavaScript 基础的初学者,从 Vue 3 的核心概念讲起,直到你能独立开发一个完整的中型电商后台系统。整个学习曲线与 W3Schools、菜鸟教程不同——我们走 Vue 3 + Composition API 优先路线,并配合真实电商项目(5,000 商户、30,000 SKU 的 SaaS 后台)练手。
1. 你将学到
- Vue.js 是什么,以及"渐进式框架"的真正含义
- Vue 3 与 Vue 2 的核心差异(为什么推荐学 Vue 3)
- Composition API 与 Options API 的对比和选择
- Vue 3 生态圈:Vite、Vue Router、Pinia、Element Plus 的角色
- 谁适合学 Vue,以及学完 Vue 后能做什么
2. 一个 SaaS 团队的前端选型故事
(1) 痛点:5 个框架,选哪个?
一家快速增长的 SaaS 公司,前端代码 200,000 行,技术负责人 Alice 在 2026 年 Q1 面临一个艰难决策:
- React 18+: 团队熟,但 Bundle size 850KB, initial load 3.2s
- Vue 3: 团队 0 经验,但 Bundle 280KB, initial load 0.9s
- Angular 17: TypeScript 友好,但学习曲线陡,新人上手要 2 个月
- Svelte 4: 编译时优化,但生态小,找工作难
- Solid.js: 性能最强,但社区 5 万人,遇到问题 Stack Overflow 没答案
产品经理 Charlie 加码施压:
"我们的后台有 30,000 SKU。当前 React 应用的筛选要 8 秒。新开发者要 3 周才能上线第一个功能。到 2026 Q3,两项都要 5 倍提升。"
(2) Vue 3 的解法
经过 4 周评估,Alice 选择了 Vue 3。原因如下:
Bundle size: 850KB → 280KB (-67%)
Initial load: 3.2s → 0.9s (-72%)
Onboarding time: 3 weeks → 1 week (-67%)
Job market: growing 35% YoY
Vue 的"渐进式"特性意味着 Alice 可以逐步采用:
- 第 1 周:用 Vue 3 替换 1 个页面(CDN script 标签,无需构建)
- 第 4 周:迁移 10 个页面到单文件组件
- 第 12 周:完整 SPA + Router + Pinia
- 第 24 周:200,000 行代码迁移完成,零停机
(3) 收益
使用 Vue 3 六个月后,团队测量了以下指标:
- 性能:仪表盘筛选时间 8s → 0.8s(快 10 倍)
- 生产力:新功能上线 3 周 → 1 周
- 招聘质量:面试 5 人,4 人有 Vue 经验(React 只有 2 人)
- Bundle:节省 570KB = 页面加载快 30% = 转化率提升 8%
3. Vue 是什么?
Vue(读作 /vjuː/,类似 "view")是一套用于构建用户界面的渐进式 JavaScript 框架。它由尤雨溪(Evan You)于 2014 年创建,目前由 Vue.js 核心团队和全球社区维护。
(1) 核心定义 + Vue 3 架构图
graph TB
subgraph Vue3生态
V[Vue 3 核心<br/>@vue/runtime-core]
R[Vue Router 4<br/>路由管理]
P[Pinia<br/>状态管理]
S[SSR/SSG<br/>Nuxt 3]
T[Vite<br/>构建工具]
U[UI 组件库<br/>Element Plus/Naive UI]
end
V --> R
V --> P
V --> S
T --> V
U --> V
style V fill:#42b883,color:#fff
style R fill:#35495e,color:#fff
style P fill:#ffd02f
style S fill:#00dc82
style T fill:#646cff,color:#fff
(2) 五大核心特点
| 特点 | 含义 | 对比 |
|---|---|---|
| 渐进式框架 | 可按需采用,从轻量库到完整框架都可 | React 强制 JSX,Angular 全家桶 |
| 响应式数据 | 数据变化自动更新 UI,无需手动操作 DOM | jQuery 需要手动 $(sel).text() |
| 组件化 | UI 拆分为独立可复用组件,单文件组件 (SFC) | HTML 标签不可复用,组件可组合 |
| 声明式渲染 | 描述"应该长什么样",而非"如何变成那样" | 命令式 DOM 操作 |
| 学习曲线平缓 | HTML/CSS/JS 基础即可上手,TS 渐进 | Angular 需先学装饰器/DI |
(3) Vue 适用场景
| 场景 | 适合度 | 说明 |
|---|---|---|
| 中小型 SPA(电商/CRM/Admin) | ⭐⭐⭐⭐⭐ | 最佳场景,Vue 主流用法 |
| 大型企业应用 | ⭐⭐⭐⭐ | 需要 Nuxt 3 + 微前端架构 |
| 移动端 H5 | ⭐⭐⭐⭐ | uni-app / Vant 框架 |
| 桌面端应用 | ⭐⭐⭐ | Electron + Vue(中等方案) |
| 静态博客 | ⭐⭐ | Astro / Nuxt Content 更合适 |
| 嵌入式 widget | ⭐⭐⭐⭐⭐ | 极小体积,CDN 直接引入 |
4. Vue 3 vs Vue 2:核心差异
(1) 主要改进一览
| 维度 | Vue 2 | Vue 3 | 影响 |
|---|---|---|---|
| 响应式系统 | Object.defineProperty | Proxy | 性能 ↑,支持数组/Map/Set |
| API 风格 | Options API 为主 | Composition API 优先 | 逻辑复用更灵活 |
| TypeScript | 需手动配 | 一等公民支持 | 类型推断 ↑ |
| 打包体积 | ~33KB | ~20KB(gzipped) | 加载 ↑ |
| 渲染速度 | 1x | 1.2-2x | 性能 ↑ |
| Tree-shaking | 不支持 | 全支持 | 未用代码不打包 |
| Fragment | 单根 | 多根节点 | 模板更灵活 |
| Teleport | 无 | 内置 | 模态框/Drawer 写法简化 |
| Suspense | 无 | 内置 | 异步组件处理优雅 |
(2) 为什么推荐 Vue 3?
✅ Vue 3 是当前主版本(2020-09 发布,2026 已稳定 5+ 年)
✅ Vue 2 已于 2023-12 EOL(End of Life),不再维护
✅ 90% 的新项目、100% 的新生态工具都基于 Vue 3
✅ Composition API 是 Vue 团队推荐的现代写法
✅ TypeScript 支持显著改善,团队代码质量 ↑
❌ Vue 2 只在维护老项目时需要
❌ 不学 Vue 3 = 错过 Vue 生态 95% 的现代工具
5. Composition API vs Options API
(1) 两种 API 风格对比
| 维度 | Options API | Composition API |
|---|---|---|
| 写法 | data / methods / computed 分块 | setup() 函数集中 |
| 逻辑复用 | mixins(不推荐) | Composables(推荐) |
| 类型推断 | 一般 | 优秀(专为 TS 设计) |
| 代码组织 | 按选项类型分块 | 按业务逻辑分块 |
| 学习曲线 | 平缓(新手友好) | 略陡(要理解 ref/reactive) |
| 适合规模 | 小到中型 | 中到大型(推荐所有规模) |
(2) Options API 示例
// Options API - 按选项分块(传给 createApp)
{
data() {
return { count: 0, name: 'Alice' }
},
computed: {
doubleCount() {
return this.count * 2
}
},
methods: {
increment() {
this.count++
}
},
mounted() {
console.log('Component mounted')
}
}
(3) Composition API 示例
// Composition API - 按逻辑分块(在 setup() 函数中)
const { ref, computed, onMounted } = Vue
setup() {
const count = ref(0)
const name = ref('Alice')
const doubleCount = computed(() => count.value * 2)
function increment() {
count.value++
}
onMounted(() => {
console.log('Component mounted')
})
return { count, name, doubleCount, increment }
}
(4) 选哪个?
| 建议 | 场景 |
|---|---|
| 新项目用 Composition API | Vue 3 项目首选 |
| 维护老项目 | 保持 Options API(不破坏现有代码) |
| 团队新人多 | Composition API 反而更易学(无 this 困惑) |
| 复杂业务逻辑 | Composition API(按业务组织代码更清晰) |
6. Vue 3 生态圈
Vue 3 不只是一个框架,而是一套完整的前端开发生态。
(1) 生态组件图
graph LR
subgraph 核心
V[Vue 3 核心]
end
subgraph 官方推荐
R[Vue Router 4]
P[Pinia]
T[Vite]
end
subgraph 社区生态
E[Element Plus]
N[Naive UI]
U[UnoCSS]
I[Vue I18n]
end
V --> R
V --> P
V --> T
V --> E
V --> N
V --> U
V --> I
style V fill:#42b883,color:#fff
(2) 关键工具速查表
| 工具 | 角色 | 必学? | 官网 |
|---|---|---|---|
| Vue 3 核心 | 框架本身 | ✅ 必学 | vuejs.org |
| Vite | 构建工具,5x 速度 | ✅ 必学 | vitejs.dev |
| Vue Router 4 | 路由管理(SPA 必备) | ✅ 必学 | router.vuejs.org |
| Pinia | 状态管理(Vuex 替代) | ✅ 必学 | pinia.vuejs.org |
| Element Plus | 桌面端 UI 库 | 选学 | element-plus.org |
| Naive UI | 桌面端 UI 库 | 选学 | naiveui.com |
| Vue I18n | 国际化 | 选学 | vue-i18n.intlify.dev |
| Nuxt 3 | SSR/SSG 框架 | 选学 | nuxt.com |
| VueUse | 实用 Composable 库 | 选学 | vueuse.org |
(3) 完整学习路径
阶段 1(本教程 Phase 1-3):Vue 3 核心 + Composition API
阶段 2(本教程 Phase 4):Vue Router + Pinia + 进阶 API
阶段 3(本教程 Phase 5):Vite + 真实项目 + 部署
进阶(推荐后续学):Nuxt 3 SSR / Vitest 测试 / 性能优化
7. 完整示例:第一个 Vue 3 应用
▶ 示例:Hello Vue 3 计数器(Composition API)
<script src="https://unpkg.com/vue@3/dist/vue.global.prod.js"></script>
<div id="app">
<h1>{{ greeting }}</h1>
<p>You clicked the button <strong>{{ count }}</strong> times.</p>
<button @click="increment">Click me</button>
<p>By {{ author }}, {{ currentYear }}</p>
</div>
<script>
const { createApp, ref, computed } = Vue
createApp({
setup() {
const count = ref(0)
const author = ref('Alice')
const currentYear = computed(() => new Date().getFullYear())
const greeting = computed(() => `Hello Vue 3! Welcome, ${author.value}!`)
function increment() { count.value++ }
return { count, author, currentYear, greeting, increment }
}
}).mount('#app')
</script>
输出(点击按钮后):
Hello Vue 3! Welcome, Alice!
You clicked the button 5 times.
[Click me]
By Alice, 2026
▶ 示例:CDN 引入方式(5 行 HTML 跑起来)
<script src="https://unpkg.com/vue@3/dist/vue.global.prod.js"></script>
<div id="app">
<h1>{{ message }}</h1>
<button @click="count++">Clicked {{ count }} times</button>
</div>
<script>
const { createApp, ref } = Vue
createApp({
setup() {
return {
message: ref('Hello Vue 3!'),
count: ref(0)
}
}
}).mount('#app')
</script>
输出:打开 HTML 文件,页面显示 "Hello Vue 3!" 和按钮,点击按钮数字 +1。
▶ 示例:Options API 写法(对比)
<script src="https://unpkg.com/vue@3/dist/vue.global.prod.js"></script>
<div id="app">
<h1>{{ message }}</h1>
<p>Count: {{ count }}, Double: {{ doubleCount }}</p>
<button @click="increment">+1</button>
</div>
<script>
Vue.createApp({
data() { return { count: 0, message: 'Hello Vue 3!' } },
computed: { doubleCount() { return this.count * 2 } },
methods: { increment() { this.count++ } }
}).mount('#app')
</script>
输出:页面显示 "Hello Vue 3!" 和 "Count: 0, Double: 0",点击按钮 Count 递增,Double 自动跟随。
▶ 示例:进度衡量表(5 分钟/30 分钟/1 小时)
| 阶段 | 时间 | 完成标志 |
|---|---|---|
| 跑通 Hello World | 5 分钟 | 浏览器看到 Vue 默认页 |
| 改 1 行代码 | 10 分钟 | 改模板中 message 变量值 |
| 加 1 个响应式数据 | 20 分钟 | 加 ref 变量 + 模板显示 |
| 加 1 个交互 | 30 分钟 | 加 @click 事件 + 计数器 |
| 部署到 Vercel | 1 小时 | 公开 URL 可访问 |
▶ 示例:5 大常见陷阱(5 分钟避坑)
| 陷阱 | 现象 | 解决 |
|---|---|---|
忘记 .value |
count++ 不生效 |
ref 在 JS 中需 count.value++ |
| template 自动解包 | 模板里不需要 .value |
{{ count }} 即可 |
| 对象响应丢失 | obj.name = 'x' 不响应 |
用 reactive() 包裹 |
| 数组直接赋值 | arr[0] = 'x' 不响应 |
用 splice 或 push |
| 异步数据丢失 | setTimeout 中赋值不响应 | ref/reactive 内部已处理 |
❓ 常见问题
📖 小节
- Vue.js 是渐进式 JavaScript 框架,2014 年由 Evan You 创建
- Vue 3 是当前主版本,2020-09 发布,2026 已稳定 5+ 年
- Vue 2 已于 2023-12 EOL,新项目必须用 Vue 3
- Vue 3 核心改进:Proxy 响应式、Composition API、TypeScript 一等公民、Tree-shaking
- Composition API 是 Vue 团队推荐的现代写法,逻辑复用更灵活
- Vue 3 生态:Vite(构建)+ Vue Router 4(路由)+ Pinia(状态)+ Element Plus(UI)
- 渐进式采用:从 CDN 引入到完整 SPA,按需演进
- 适合场景:中小型 SPA(电商/CRM/Admin)、中型企业应用
📝 作业
-
基础题(难度⭐) 访问 vuejs.org 官方文档,列出 Vue 3 的 3 个核心特性,并用 1 句话解释每个特性。
-
进阶题(难度⭐⭐) 对比 Vue 3 和 React 18 的以下维度(用表格):
维度 Vue 3 React 18 Bundle size ? ? 学习曲线 ? ? 状态管理库 ? ? 路由库 ? ? 国内市场占比 ? ? -
挑战题(难度⭐⭐⭐) 调研你身边 3 个真实项目(自己公司/朋友公司/开源项目),记录:
- 用了哪个前端框架?
- 为什么选这个框架?
- 如果换 Vue 3,需要多大成本?
写一份 300 字的调研报告发到评论区。