vue原理分析(六)--研究new Vue()

今天我们来分析使用new Vue()

之前研究时,只是说是在创建一个实例。并没有深入进行研究

在vue的源码中找下Vue的构造函数

复制代码
function Vue(options) {

    if (!(this instanceof Vue)) {

        warn$2('Vue is a constructor and should be called with the `new` keyword');

    }

    this._init(options);

}

if判断语句是指,需要用new 关键字来构造实例对象

后面就是 this._init(options) 调用了_init方法,参数是options

找到_init(options)方法

接下来我们逐句分析

复制代码
Vue.prototype._init = function (options) {

        // 1. 定义变量对象vm  后续需要给vm添加属性,再将vm作为参数调用一系列函数

        const vm = this;

        // a uid

        // 2. vm添加_uid属性, 自增

        vm._uid = uid++;

        let startTag, endTag;

        // 3. istanbul ignore if 是一个注释指令,用于在代码覆盖率工具 Istanbul 中标记某段代码,以便在生成代码覆盖率报告时忽略该段代码的覆盖率计算

        // 从英文名猜下是关于performance性能的,暂时先不管它。后续有遇到再继续研究

        /* istanbul ignore if */

        if (config.performance && mark) {

            startTag = `vue-perf-start:${vm._uid}`;

            endTag = `vue-perf-end:${vm._uid}`;

            mark(startTag);

        }

        // a flag to mark this as a Vue instance without having to do instanceof

        // check

        // 4. vm添加_isVue属性

        vm._isVue = true;

        // avoid instances from being observed

        // 5. vm添加__v_skip属性

        vm.__v_skip = true;

        // effect scope

        // 6. vm添加_scope属性 _scope是new EffectScope()

        vm._scope = new EffectScope(true /* detached */);

        // #13134 edge case where a child component is manually created during the

        // render of a parent component

        // 7. vm._scope设置属性

        vm._scope.parent = undefined;

        vm._scope._vm = true;

        // merge options

        // 8. 核心代码,对于入参options进行判断

        // initInternalComponent(vm, options)  这个我们暂时还没有遇到过,先跳过

        // 或者mergeOptions()     一会儿研究

        if (options && options._isComponent) {

            // optimize internal component instantiation

            // since dynamic options merging is pretty slow, and none of the

            // internal component options needs special treatment.

            initInternalComponent(vm, options);

        }

        else {

            vm.$options = mergeOptions(resolveConstructorOptions(vm.constructor), options || {}, vm);

        }

        /* istanbul ignore else */

        // 9. initProxy(vm)  一会儿研究

        {

            initProxy(vm);

        }

        // expose real self

        // 10. vm添加_self属性

        vm._self = vm;

        // 11. 调用一堆方法 一会儿研究

        initLifecycle(vm);

        initEvents(vm);

        initRender(vm);

        callHook$1(vm, 'beforeCreate', undefined, false /* setContext */);

        initInjections(vm); // resolve injections before data/props

        initState(vm);

        initProvide(vm); // resolve provide after data/props

        callHook$1(vm, 'created');

        /* istanbul ignore if */

        // 12. 感觉又是跟性能有关的内容

        if (config.performance && mark) {

            vm._name = formatComponentName(vm, false);

            mark(endTag);

            measure(`vue ${vm._name} init`, startTag, endTag);

        }

        // 13.如果vm.$options有el参数,后续执行了$mount挂载

        if (vm.$options.el) {

            vm.$mount(vm.$options.el);

        }

    };
相关推荐
mldong6 小时前
你的 Vue3 项目也能有钉钉同款审批流设计器:npm 装包,10 分钟画出第一条审批流
前端·vue.js
2分钟速写快排6 小时前
什么是 RAG?如何用 RAG 实现一个用户记忆?
前端·后端·ai编程
passerby60617 小时前
如何自己造一个时间处理库
前端·javascript·github
走到天涯海角8 小时前
react里面的长列表渲染优化
前端·react.js·前端框架
小羊没烦恼!8 小时前
Hello Web API系列教程——Web API与国际化
java·服务器·前端·javascript·php
北岛贰8 小时前
迷茫焦虑期,我做了一个带支付带官网的 AI 聊天虚拟恋人 App
前端·人工智能·后端
mayaairi10 小时前
Vue2 组件通讯(三):全局事件总线、PubSub、插槽与组件实例属性
前端·javascript·vue.js
kyriewen10 小时前
面试官问我:AI 都能写代码了,前端凭什么还值 25K
前端·javascript·人工智能
风骏时光牛马11 小时前
AI源码分析:拆解模型底层实现逻辑
前端
BillKu11 小时前
全局样式变量:CSS 自定义属性(--border-color)和SCSS 变量($border-color)的说明
javascript·css·scss