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);

        }

    };
相关推荐
黄智勇5 分钟前
xlsx-handlebars 一个用于处理 XLSX 文件 Handlebars 模板的 Rust 库,支持多平台使
前端
brzhang1 小时前
为什么 OpenAI 不让 LLM 生成 UI?深度解析 OpenAI Apps SDK 背后的新一代交互范式
前端·后端·架构
brzhang2 小时前
OpenAI Apps SDK ,一个好的 App,不是让用户知道它该怎么用,而是让用户自然地知道自己在做什么。
前端·后端·架构
爱看书的小沐2 小时前
【小沐学WebGIS】基于Three.JS绘制飞行轨迹Flight Tracker(Three.JS/ vue / react / WebGL)
javascript·vue·webgl·three.js·航班·航迹·飞行轨迹
程序员王天2 小时前
【开发AGIC】Vue3+NestJS+DeepSeek AI作业批改系统(已开源)
vue.js·ai编程·nestjs
井柏然2 小时前
前端工程化—实战npm包深入理解 external 及实例唯一性
前端·javascript·前端工程化
昔冰_G3 小时前
Vue内置组件KeepAlive——缓存组件实例
vue.js·缓存·vue3·vue2·keep-alive·vue组件缓存·vue内置组件
IT_陈寒3 小时前
Redis 高性能缓存设计:7个核心优化策略让你的QPS提升300%
前端·人工智能·后端
aklry3 小时前
elpis之动态组件机制
javascript·vue.js·架构
井柏然3 小时前
从 npm 包实战深入理解 external 及实例唯一性
前端·javascript·前端工程化