通俗易懂,完整详细地讲解vue3的代码执行逻辑,如何构建出一个完整的网页。下面用“盖房子”的比喻,把 Vue3 从“一块砖头”到“一栋精装别墅”的整个流程,用 100% 通俗、完整、可落地的语言讲一遍。看完你就能拿着代码跑起来,也能明白每一步到底干了啥。

================================================================
一、故事开始:我们想盖一栋“别墅”

  1. 地基:index.html
  2. 设计图纸:main.js(入口文件)
  3. 砖块:单文件组件(*.vue)
  4. 施工队:Vite / Webpack(打包器)
  5. 入住:浏览器渲染出最终网页

================================================================
二、第 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 的工作流程(黑盒施工队)

  1. 冷启动
    Vite 把 index.html 直接扔给浏览器,浏览器自己去拉 main.js。因为用了原生 ESM,所以不需要像 Webpack 那样先全部打包。

  2. 单文件组件编译

    • 碰到 App.vue,Vite 调用 @vitejs/plugin-vue,把 <template> 编译成 render 函数。
    • <script setup> 直接变成 setup() 函数里的逻辑。
    • <style scoped> 加上 data-v-xxxx 属性,实现样式隔离。
  3. 热重载(HMR)
    你改了一行字,Vite 只替换这个组件的 JS/CSS,不刷新整页,速度飞快。

  4. 生产构建
    npm run build
    Vite 会把所有文件压缩、拆包、加 hash,输出到 dist/ 目录。
    最终浏览器看到的其实就是一堆 .js.css 和图片。

================================================================
八、Vue3 运行时的完整链路(从源码到像素)

  1. 编译阶段(开发时由 Vite 实时完成,生产时预编译)
    .vue → template → render 函数
    script setup → setup() → closure(闭包)
    style scoped → CSS Modules

  2. 运行时阶段
    (1) createApp(App) 创建一个应用实例。
    (2) mount(‘#app’) 触发以下步骤:
    - 把 App.vue 的 render 函数跑一遍,生成虚拟 DOM(VNode)树。
    - 递归遍历 VNode,调用浏览器 DOM API 创建真实节点,插到 #app 里。
    - 建立响应式系统:用 Proxy 把 titlerooms 等数据代理起来。
    - 收集依赖:模板里用到了 title,就记下来“这里依赖 title”。
    - 当 title 改变 → 触发 setter → 通知依赖 → render 函数重新跑 → diff 算法 → 最小化更新真实 DOM。

  3. 组件生命周期(只记最常用的)
    setup() → onBeforeMount → onMounted → onBeforeUpdate → onUpdated → onUnmounted

  4. 组件通信

    • 父传子:props(上面 Room.vue 的 :name="r.name"
    • 子传父:emit($emit)
    • 全局:provide/inject、Pinia、eventBus

================================================================
九、完整跑起来的文件清单(可直接复制)

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 网页。

Logo

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

更多推荐