通俗易懂:Vue3的代码执行逻辑,如何构建出一个完整的网页
Vue3盖房子全流程解析 地基准备:浏览器通过index.html加载入口main.js,<div id="app">是渲染锚点。 施工蓝图:main.js用createApp(App)创建Vue应用,App.vue作为根组件,通过mount('#app')挂载到DOM。 模块化建造: 每个.vue文件是独立房间(组件),含三部分: ▶ <template&g
通俗易懂,完整详细地讲解vue3的代码执行逻辑,如何构建出一个完整的网页。下面用“盖房子”的比喻,把 Vue3 从“一块砖头”到“一栋精装别墅”的整个流程,用 100% 通俗、完整、可落地的语言讲一遍。看完你就能拿着代码跑起来,也能明白每一步到底干了啥。
================================================================
一、故事开始:我们想盖一栋“别墅”
- 地基:index.html
- 设计图纸:main.js(入口文件)
- 砖块:单文件组件(*.vue)
- 施工队:Vite / Webpack(打包器)
- 入住:浏览器渲染出最终网页
================================================================
二、第 0 步:搭脚手架(用 Vite,最快)
npm create vite@latest my-house -- --template vue
cd my-house
npm install
npm run dev
此时文件结构长这样:
my-house
├─ index.html ← 地基
├─ src
│ ├─ main.js ← 施工队长
│ ├─ App.vue ← 大客厅
│ └─ components ← 卧室、厨房、卫生间
└─ vite.config.js ← 施工配置
================================================================
三、第 1 步:地基 index.html(浏览器唯一真正认识的文件)
<!doctype html>
<html>
<body>
<div id="app"></div> <!-- 别墅插槽 -->
<script type="module" src="/src/main.js"></script>
</body>
</html>
- 浏览器读到
<script type="module">
,立刻去拉main.js
。 - 注意:浏览器原生支持 ES Module,Vite 只是帮你把路径处理好。
================================================================
四、第 2 步:施工队长 main.js(创建真正的 Vue 应用)
import { createApp } from 'vue' // 1. 请施工队
import App from './App.vue' // 2. 拿图纸
import './style.css' // 3. 统一装修风格
const app = createApp(App) // 4. 把图纸交给施工队
app.mount('#app') // 5. 在 id="app" 的地基上开工
- createApp 返回一个“施工队实例”,你可以给它装插件、全局组件、全局指令等等。
- 调用 mount(‘#app’) 时,Vue 会把 App.vue 渲染出来的 DOM 插到
<div id="app">
里。
================================================================
五、第 3 步:图纸 App.vue(单文件组件的解剖)
一个 .vue
文件就像“一个房间”的完整施工图,有三层:
┌─ <template> 3D 模型(HTML 结构)
├─ <script setup> 电路水管(JS 逻辑)
└─ <style scoped> 墙纸地毯(CSS 样式)
例子:
<template>
<header>
<h1>{{ title }}</h1>
<button @click="addRoom">再加一间房</button>
</header>
<main>
<Room v-for="r in rooms" :key="r.id" :name="r.name" />
</main>
</template>
<script setup>
import { ref } from 'vue'
import Room from './components/Room.vue'
const title = ref('我的三层别墅')
const rooms = ref([
{ id: 1, name: '主卧' },
{ id: 2, name: '书房' }
])
function addRoom () {
rooms.value.push({ id: Date.now(), name: '客房' })
}
</script>
<style scoped>
h1 { color: skyblue; }
</style>
================================================================
六、第 4 步:组件 Room.vue(可复用的房间模块)
<template>
<div class="room">
<p>这是 {{ name }}</p>
</div>
</template>
<script setup>
defineProps(['name'])
</script>
<style scoped>
.room { border: 1px solid #ccc; margin: 8px; padding: 8px; }
</style>
================================================================
七、第 5 步:打包器 Vite 的工作流程(黑盒施工队)
-
冷启动
Vite 把index.html
直接扔给浏览器,浏览器自己去拉main.js
。因为用了原生 ESM,所以不需要像 Webpack 那样先全部打包。 -
单文件组件编译
- 碰到
App.vue
,Vite 调用@vitejs/plugin-vue
,把<template>
编译成render
函数。 <script setup>
直接变成setup()
函数里的逻辑。<style scoped>
加上data-v-xxxx
属性,实现样式隔离。
- 碰到
-
热重载(HMR)
你改了一行字,Vite 只替换这个组件的 JS/CSS,不刷新整页,速度飞快。 -
生产构建
npm run build
Vite 会把所有文件压缩、拆包、加 hash,输出到dist/
目录。
最终浏览器看到的其实就是一堆.js
、.css
和图片。
================================================================
八、Vue3 运行时的完整链路(从源码到像素)
-
编译阶段(开发时由 Vite 实时完成,生产时预编译)
.vue → template → render 函数
script setup → setup() → closure(闭包)
style scoped → CSS Modules -
运行时阶段
(1) createApp(App) 创建一个应用实例。
(2) mount(‘#app’) 触发以下步骤:
- 把 App.vue 的 render 函数跑一遍,生成虚拟 DOM(VNode)树。
- 递归遍历 VNode,调用浏览器 DOM API 创建真实节点,插到 #app 里。
- 建立响应式系统:用 Proxy 把title
、rooms
等数据代理起来。
- 收集依赖:模板里用到了title
,就记下来“这里依赖 title”。
- 当title
改变 → 触发 setter → 通知依赖 → render 函数重新跑 → diff 算法 → 最小化更新真实 DOM。 -
组件生命周期(只记最常用的)
setup() → onBeforeMount → onMounted → onBeforeUpdate → onUpdated → onUnmounted -
组件通信
- 父传子:props(上面 Room.vue 的
:name="r.name"
) - 子传父:emit($emit)
- 全局:provide/inject、Pinia、eventBus
- 父传子:props(上面 Room.vue 的
================================================================
九、完整跑起来的文件清单(可直接复制)
index.html
<!doctype html>
<html lang="zh-CN">
<head>
<meta charset="UTF-8" />
<title>Vue3 别墅</title>
</head>
<body>
<div id="app"></div>
<script type="module" src="/src/main.js"></script>
</body>
</html>
src/main.js
import { createApp } from 'vue'
import App from './App.vue'
import './style.css'
createApp(App).mount('#app')
src/App.vue
<template>
<h1>{{ title }}</h1>
<button @click="add">再加一间</button>
<Room v-for="r in rooms" :key="r.id" :name="r.name" />
</template>
<script setup>
import { ref } from 'vue'
import Room from './components/Room.vue'
const title = ref('我的三层别墅')
const rooms = ref([{ id: 1, name: '主卧' }])
function add () {
rooms.value.push({ id: Date.now(), name: '客房' + rooms.value.length })
}
</script>
<style scoped>
h1 { color: #42b883; }
</style>
src/components/Room.vue
<template>
<div class="room">这是 {{ name }}</div>
</template>
<script setup>
defineProps(['name'])
</script>
<style scoped>
.room { border: 1px solid #42b883; margin: 8px; padding: 8px; }
</style>
================================================================
十、总结一句话
Vue3 = 响应式系统(Proxy)+ 组件化(SFC)+ 编译器(template→render)+ 运行时调度(diff + patch)。
Vite 只是帮你把“盖房子”这件事自动化:图纸→砖块→工人→装修→拎包入住。
掌握上面 6 个文件、3 个指令(npm create / install / run dev),你就能在 30 秒内启动一个可扩展、可上线的 Vue3 网页。
更多推荐
所有评论(0)