找回密码
 立即注册
查看: 114|回复: 3

Vue2 new Vue()内部运行机制

[复制链接]

9

主题

37

回帖

151

积分

注册会员

积分
151
发表于 2022-9-19 22:16:27 | 显示全部楼层 |阅读模式
来自官网的一张图,整体流程:
  • new Vue() 时, init 初始化过程
  • compile() 模板编译到 render 渲染函数
  • 响应式系统



Vue.js的 init 过程,是比较复杂的. 经常书写下面的代码:
  1. new Vue({
  2.     el:"#app",
  3.     data:{
  4.         test:"这是一个测试"
  5.     }
  6.   })
复制代码

  



本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?立即注册

×
回复

使用道具 举报

9

主题

37

回帖

151

积分

注册会员

积分
151
 楼主| 发表于 2022-9-19 22:17:07 | 显示全部楼层
接下来看看Vue的构造函数

   
  1. /*Vue的构造函数,options是我们在new Vue({}) 传递进来的一个对象*/
  2.     function Vue (options) {
  3.         /*进行了Vue函数调用的安全监测*/
  4.         /*Vue的构造函数只能通过new Vue()来调用*/
  5.         /*不能通过 Vue()调用, 这样调用 this指向window*/
  6.         if (!(this instanceof Vue)) {
  7.             /*封装了warn函数,  用于报错提示信息等*/
  8.             warn('Vue is a constructor and should be called with the `new` keyword');
  9.         }
  10.         /* 调用原型上的_init方法, 进行初始化  */
  11.         this._init(options);
  12.     }
复制代码

从上面的代码可以看出:

对Vue构造函数的进行限制, 只有通过 new Vue() 才可调用, 而直接调用 Vue(),里面的 this 会指向 window 会有报错提醒
调用了自身原型上的 _init 函数
回复

使用道具 举报

9

主题

37

回帖

151

积分

注册会员

积分
151
 楼主| 发表于 2022-9-19 22:17:41 | 显示全部楼层
下面是Vue原型上的 _init 函数的代码

  1. var uid$3 = 0; /* 用于统计Vue构造函数被new多少次*/
  2. /*initMixin主要是对对options选项的合并和规范*/
  3. function initMixin (Vue) {
  4.     Vue.prototype._init = function (options) {
  5.         var vm = this;
  6.         /* 统计 Vue被new了多少次*/
  7.         vm._uid = uid$3++;

  8.         var startTag, endTag;
  9.         /* istanbul ignore if */
  10.         if (config.performance && mark) {
  11.             startTag = "vue-perf-start:" + (vm._uid);
  12.             endTag = "vue-perf-end:" + (vm._uid);
  13.             mark(startTag);
  14.         }


  15.         /*设置了一个标识, 避免被vm实例加入响应式系统 */
  16.         vm._isVue = true;
  17.         /*合并选项*/
  18.         if (options && options._isComponent) {
  19.             // optimize internal component instantiation
  20.             // since dynamic options merging is pretty slow, and none of the
  21.             // internal component options needs special treatment.
  22.             initInternalComponent(vm, options);
  23.         } else {
  24.             /*选项合并的入口代码*/
  25.             vm.$options = mergeOptions(
  26.                 resolveConstructorOptions(vm.constructor),
  27.                 options || {},
  28.                 vm
  29.             );
  30.         }
  31.         /* istanbul ignore else */
  32.         {
  33.             initProxy(vm); /*初始化Proxy, 检测ES6的Proxy函数是否支持等*/
  34.         }
  35.         // expose real self
  36.         vm._self = vm;
  37.         initLifecycle(vm);  /* 初始时生命周期*/
  38.         initEvents(vm); /* 初始化事件*/
  39.         initRender(vm);  /* 渲染页面 */
  40.         callHook(vm, 'beforeCreate');   /*生命周期钩子函数beforeCreate被的调用*/
  41.         initInjections(vm); // resolve injections before data/props
  42.         initState(vm);    /*初始化状态 props data computed watch methods*/
  43.         initProvide(vm); // resolve provide after data/props
  44.         callHook(vm, 'created');   /*生命周期钩子函数created被的调用*/

  45.         /* istanbul ignore if */
  46.         if (config.performance && mark) {
  47.             vm._name = formatComponentName(vm, false);
  48.             mark(endTag);
  49.             measure(("vue " + (vm._name) + " init"), startTag, endTag);
  50.         }
  51.          /*如果配置了el选项, 去挂载*/
  52.         if (vm.$options.el) {
  53.             vm.$mount(vm.$options.el);
  54.         }
  55.     };
  56. }
复制代码
回复

使用道具 举报

9

主题

37

回帖

151

积分

注册会员

积分
151
 楼主| 发表于 2022-9-19 22:18:03 | 显示全部楼层
_init 函数的流程:

最重要的事情 mergeOptions() 函数, 进行选项的合并和规范化
初始化页面, 初始化事件, 渲染页面, 初始化 data、props、computed、watcher 等等
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

手机版|小黑屋|粤嵌技术交流空间

GMT+8, 2025-7-7 12:55 , Processed in 0.720771 second(s), 19 queries .

Powered by Discuz! X3.5

© 2001-2024 Discuz! Team.

快速回复 返回顶部 返回列表