news 2026/6/10 14:46:45

Vue 实例挂载的过程是怎样的?

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
Vue 实例挂载的过程是怎样的?


一、整体流程概览

当我们执行new Vue({ ... })时,Vue 会经历初始化 → 编译模板 → 挂载 DOM三个阶段。整个过程由_init方法驱动,最终通过$mount完成视图渲染。

核心路径:
new Vue()_init()initState()$mount()mountComponent()_render()_update()→ 真实 DOM


二、详细步骤解析

1. 构造函数与_init初始化

源码位置:src/core/instance/index.js

functionVue(options){if(!(thisinstanceofVue)){warn('Vue is a constructor and should be called with the `new` keyword')}this._init(options)}
  • 调用_init是整个实例化的起点。
  • 在此之前,Vue 原型上已通过 mixin 注入了各类方法:
    • initMixin→ 定义_init
    • stateMixin$set,$delete,$watch
    • eventsMixin$on,$emit
    • lifecycleMixin_update,$destroy
    • renderMixin_render

2._init中的关键操作

源码位置:src/core/instance/init.js

Vue.prototype._init=function(options){constvm=this;vm._uid=uid++;vm._isVue=true;// 合并配置(处理 mixins / extends)if(options&&options._isComponent){initInternalComponent(vm,options);}else{vm.$options=mergeOptions(resolveConstructorOptions(vm.constructor),options||{},vm);}// 初始化代理(开发环境)if(process.env.NODE_ENV!=='production'){initProxy(vm);}else{vm._renderProxy=vm;}vm._self=vm;// 初始化生命周期、事件、渲染initLifecycle(vm);initEvents(vm);initRender(vm);callHook(vm,'beforeCreate');// 初始化依赖注入(inject / provide)initInjections(vm);// 在 data/props 之前initState(vm);// 初始化 props, methods, data, computed, watchinitProvide(vm);// 在 data/props 之后callHook(vm,'created');// 如果有 el,自动挂载if(vm.$options.el){vm.$mount(vm.$options.el);}}

关键结论

  • beforeCreate时:data / props 尚未初始化,无法访问;
  • created时:数据已响应式化,但DOM 还未生成,不能操作$el
  • 挂载由$mount触发。

3. 数据初始化:initStateinitData

源码位置:src/core/instance/state.js

exportfunctioninitState(vm){vm._watchers=[];constopts=vm.$options;if(opts.props)initProps(vm,opts.props);if(opts.methods)initMethods(vm,opts.methods);if(opts.data)initData(vm);if(opts.computed)initComputed(vm,opts.computed);if(opts.watch)initWatch(vm,opts.watch);}functioninitData(vm){letdata=vm.$options.data;data=vm._data=typeofdata==='function'?getData(data,vm):data||{};// 校验 data 为纯对象if(!isPlainObject(data)){/* warn */}constkeys=Object.keys(data);constprops=vm.$options.props;constmethods=vm.$options.methods;// 属性名冲突检查(data vs props/methods)for(leti=keys.length-1;i>=0;i--){constkey=keys[i];if(props&&hasOwn(props,key)){/* warn */}elseif(!isReserved(key)){proxy(vm,'_data',key);// 通过 this.key 访问 vm._data[key]}}// 响应式化observe(data,true/* asRootData */);}

重点

  • 组件中data必须是函数(避免多实例共享对象);
  • 通过proxy实现this.messagethis._data.message
  • 最终调用observe将 data 转为响应式(基于Object.defineProperty)。

4. 挂载阶段:$mount与模板编译

源码位置:src/platforms/web/entry-runtime-with-compiler.js

Vue.prototype.$mount=function(el,hydrating){el=el&&query(el);if(el===document.body||el===document.documentElement){warn('Do not mount Vue to <html> or <body>');returnthis;}constoptions=this.$options;if(!options.render){lettemplate=options.template;if(template){// 处理 string / element 类型的 template}elseif(el){template=getOuterHTML(el);// 从 el 提取 HTML}if(template){// 编译 template → render 函数const{render,staticRenderFns}=compileToFunctions(template,{},this);options.render=render;options.staticRenderFns=staticRenderFns;}}// 调用真正的 mountreturnmount.call(this,el,hydrating);}

关键点

  • 若无render函数,则尝试从templateel提取模板;
  • 通过compileToFunctions将模板编译为render函数;
  • 编译三步:HTML → AST → render 字符串 → render 函数

5. 渲染组件:mountComponent

源码位置:src/core/instance/lifecycle.js

exportfunctionmountComponent(vm,el,hydrating){vm.$el=el;if(!vm.$options.render){vm.$options.render=createEmptyVNode;// 警告:运行时版本缺少编译器}callHook(vm,'beforeMount');// 定义更新函数letupdateComponent=()=>{vm._update(vm._render(),hydrating);};// 创建渲染 Watcher(核心!)newWatcher(vm,updateComponent,noop,{before(){if(vm._isMounted&&!vm._isDestroyed){callHook(vm,'beforeUpdate');}}},true/* isRenderWatcher */);hydrating=false;if(vm.$vnode==null){vm._isMounted=true;callHook(vm,'mounted');}returnvm;}

核心机制

  • 创建一个渲染 Watcher,监听响应式数据变化;
  • 初次执行updateComponent→ 触发首次渲染;
  • 数据变更时,自动触发beforeUpdate→ 重新_render_update

6. 生成 VNode 与更新 DOM

_render:生成虚拟 DOM
Vue.prototype._render=function(){const{render}=this.$options;letvnode;try{vnode=render.call(this._renderProxy,this.$createElement);}catch(e){/* error handling */}// 校验 vnode 合法性returnvnode;}
_update:将 VNode 转为真实 DOM
Vue.prototype._update=function(vnode,hydrating){constvm=this;constprevVnode=vm._vnode;vm._vnode=vnode;if(!prevVnode){// 初次挂载vm.$el=vm.__patch__(vm.$el,vnode,hydrating,false);}else{// 更新vm.$el=vm.__patch__(prevVnode,vnode);}}
  • __patch__是平台相关方法(Web 端为patch函数),负责VNode diff + DOM 操作

三、总结:挂载全过程

阶段关键动作生命周期钩子
初始化合并配置、初始化 props/data/methods/watchbeforeCreatecreated
编译template → AST → render 函数
挂载创建渲染 Watcher,首次执行_render+_updatebeforeMountmounted
更新数据变化 → 触发 Watcher → 重新渲染beforeUpdateupdated

💡一句话概括
Vue 实例挂载的本质是——将响应式数据通过 render 函数生成 VNode,再通过 patch 算法高效更新到真实 DOM 上,整个过程由一个渲染 Watcher驱动。


参考文献

  • 博客园:Vue 实例化过程
  • Vue 2.x 源码 GitHub
  • Vue 3 中文文档(对比参考)


版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/6/10 11:27:37

基于springboot和vue的社区助老志愿服务系统(毕设源码+文档)

课题说明 本课题聚焦社区助老服务供需匹配失衡、服务流程不规范及管理效率低下等痛点&#xff0c;设计并实现基于SpringBoot和Vue的社区助老志愿服务系统。系统依托SpringBoot框架的高效稳定与Vue前端框架的灵活交互优势&#xff0c;整合助老需求对接、志愿服务调度、服务过程管…

作者头像 李华
网站建设 2026/6/10 11:29:35

基于微信小程序的生猪养殖信息化管理系统毕设源码+文档+讲解视频

前言 本课题聚焦生猪养殖过程管理粗放、数据追溯困难及养殖信息碎片化等痛点&#xff0c;设计并实现基于微信小程序的生猪养殖信息化管理系统。系统依托微信生态高普及率与便捷操作优势&#xff0c;整合生猪养殖全流程管理、数据记录、溯源追踪等核心场景&#xff0c;涵盖猪舍环…

作者头像 李华
网站建设 2026/6/9 22:21:40

大数据领域数据服务的数据分析算法应用

大数据领域数据服务的数据分析算法应用 关键词:大数据、数据服务、数据分析算法、应用场景、算法原理 摘要:本文主要探讨了大数据领域数据服务中数据分析算法的应用。首先介绍了大数据和数据服务的背景知识,接着详细解释了几种常见的数据分析算法,如聚类算法、分类算法、关…

作者头像 李华
网站建设 2026/6/9 20:51:24

模具设计 | UG软件官方正式版下载与安装教程指南

如大家所熟悉的&#xff0c;UG&#xff08;Unigraphics NX&#xff09;是一款功能强大且应用较为广泛的集成化产品工程解决方案&#xff0c;广泛应用于数字化造型、产品设计、仿真验证及制造过程&#xff0c;旨在优化产品开发周期&#xff0c;提升效率并缩短上市时间。‌目前比…

作者头像 李华
网站建设 2026/6/10 11:45:46

python+vue的大学生创客创业项目申请答辩平台的设计与实现_4a271

目录已开发项目效果实现截图开发技术路线相关技术介绍核心代码参考示例结论源码lw获取/同行可拿货,招校园代理 &#xff1a;文章底部获取博主联系方式&#xff01;已开发项目效果实现截图 同行可拿货,招校园代理 pythonvue的大学生创客创业项目申请答辩平台的设计与实现_4a2…

作者头像 李华
网站建设 2026/6/10 11:42:30

华为鸿蒙智家新特性推动行业变革,重塑智能家居生态新格局

华为鸿蒙harmonyos官网 在智能家居市场持续发力的当下&#xff0c;华为鸿蒙智家以其优异的创新能力和深厚的技术积淀&#xff0c;再次成为市场焦点。 根据奥维云网最新分析数据&#xff0c;2025年全国1-10月精装部品智能化楼盘中&#xff0c;华为鸿蒙智家在国内精装房智能家居市…

作者头像 李华