new Vue(obj)の時、底層は何を経験しましたか?


new Vue(obj)の時、底層は何を経験しましたか?
newまでの準備、TARGET:web-full-dev
  • src/core/instance/index.js
  • ES 5構文を使用したVueコンストラクタ
  • の作成
  • は続いて順次実行するが、以下はいずれもVueプロトタイプオブジェクトへの混入方法や属性、あるいはアクセサ属性などである:
  • .
    initMixin(Vue) //  _init()
    
    stateMixin(Vue) //  $delete,$set,$watch  ,$data,$props  ,$data,$props     
    
    eventsMixin(Vue) //  $emit,$off,$on,$once  
    
    lifecycleMixin(Vue) //  $forceUpdate,$destroy,_update  
    
    renderMixin(Vue) //  $nextTick,_render, 
    installRenderHelpers         _n,_o,_s,_l,_t,_q,_i,_m,_f,_k,_b,_v,_e,_u,_g,_d,_p
    
  • src/core/index.js
  • initGlobalAPIいくつかのグローバルAPI
  • に混入
    Object.defineProperty(Vue, 'config', configDef)
    config
    //util       ,    。
    Vue.util = {
        warn,
        extend,
        mergeOptions,
        defineReactive
    }
    
    Vue.set
    Vue.delete
    Vue.nextTick
    Vue.observable 
    Vue.options
    initUse(Vue) //Vue.use
    initMixin(Vue) //Vue.mixin
    initExtend(Vue) //Vue.cid, Vue.extend
    initAssetRegisters(Vue)//  'component','directive','filter'  
    
  • 他の
  • に混入.
        Vue.prototype.$isServer
        Vue.prototype.$ssrContext
        Vue.FunctionalRenderContext
        Vue.version
    
  • src/platforms/web/runtime/index.js
  • 属性
  • を追加
    Vue.config.mustUseProp
    Vue.config.isReservedTag
    Vue.config.isReservedAttr
    Vue.config.getTagNamespace
    Vue.config.isUnknownElement
    Vue.prototype.__patch__
    Vue.prototype.$mount
    
  • src/platforms/web/entry-runtime-with-compiler.js
  • 属性
  • を追加
    Vue.prototype.$mount //    ,    $mount       ,         ,     $mount
    
    Vue.compile
    
  • は最終的にこのようなオブジェクト
  • を形成する.
    Vue {
        $data: undefined,
        $isServer: false,
        $props: undefined,
        $route: '',
        $router: '',
        $ssrContext: undefined,
        __proto__: {
            $delete: ƒ del(target, key),
            $destroy: ƒ (),
            $emit: ƒ (event),
            $forceUpdate: ƒ (),
            $mount: ƒ ( el, hydrating ),
            $nextTick: ƒ (fn),
            $off: ƒ (event, fn),
            $on: ƒ (event, fn),
            $once: ƒ (event, fn),
            $set: ƒ (target, key, val),
            $watch: ƒ ( expOrFn, cb, options ),
            __patch__: ƒ patch(oldVnode, vnode, hydrating, removeOnly),
            _b: ƒ bindObjectProps( data, tag, value, asProp, isSync ),
            _d: ƒ bindDynamicKeys(baseObj, values),
            _e: ƒ (text),
            _f: ƒ resolveFilter(id),
            _g: ƒ bindObjectListeners(data, value),
            _i: ƒ looseIndexOf(arr, val),
            _init: ƒ (options),
            _k: ƒ checkKeyCodes( eventKeyCode, key, builtInKeyCode, eventKeyName, builtInKeyName ),
            _l: ƒ renderList( val, render ),
            _m: ƒ renderStatic( index, isInFor ),
            _n: ƒ toNumber(val),
            _o: ƒ markOnce( tree, index, key ),
            _p: ƒ prependModifier(value, symbol),
            _q: ƒ looseEqual(a, b),
            _render: ƒ (),
            _s: ƒ toString(val),
            _t: ƒ renderSlot( name, fallback, props, bindObject ),
            _u: ƒ resolveScopedSlots(),,
            _update: ƒ (vnode, hydrating),
            _v: ƒ createTextVNode(val),
            $data: (...),
            $isServer: (...),
            $props: (...),
            $route: (...),
            $router: (...),
            $ssrContext: (...),
            constructor: ƒ Vue(options),
            get $data: ƒ (),
            set $data: ƒ (),
            get $isServer: ƒ (),
            get $props: ƒ (),
            set $props: ƒ (),
            get $route: ƒ (),
            get $router: ƒ (),
            get $ssrContext: ƒ (),
        },
        __proto__: {
            constructor: ƒ Object(),
            hasOwnProperty: ƒ hasOwnProperty(),
            isPrototypeOf: ƒ isPrototypeOf(),
            propertyIsEnumerable: ƒ propertyIsEnumerable(),
            toLocaleString: ƒ toLocaleString(),
            toString: ƒ toString(),
            valueOf: ƒ valueOf(),
            __defineGetter__: ƒ __defineGetter__(),
            __defineSetter__: ƒ __defineSetter__(),
            __lookupGetter__: ƒ __lookupGetter__(),
            __lookupSetter__: ƒ __lookupSetter__(),
            get __proto__: ƒ __proto__(),
            set __proto__: ƒ __proto__(),
        }
    }
    

    初期化Vueが完了し、ユーザーnew Vueを待つ
  • new Vueがオブジェクトに入力されたときに実行される_init
  • 内部vmを生成する.uid,uid 0から
  • を加算
  • vm._isVueはtrue//a flag to avoid this being observed
  • vm.$を更新options
  • vm.の更新renderProxy
  • 循環参照vmを追加self = vm
  • 次の一連の関数は
  • を実行する.
        initLifecycle(vm) 
        /* 
                        
            vm.$parent
            vm.$root
            vm.$children
            vm.$refs
            vm._watcher 
            vm._inactive 
            vm._directInactive 
            vm._isMounted 
            vm._isDestroyed 
            vm._isBeingDestroyed 
         */
        initEvents(vm)
        /* 
                 
                         vm $once, $on,$off,$emit    ,
                               。
                            null     
            vm._events = Object.create(null)
            vm._hasHookEvent = false
         */
        initRender(vm)
        /* 
                 
            vm._vnode
            vm._staticTrees
            vm.$vnode
            vm.$slots
            vm.$scopedSlots 
            vm._c vm.$createElement
                  createElement   。
            createElement          _createElement
                     VNode 
    
               vm, '$attrs'
               vm, '$listeners'
         */
        callHook(vm, 'beforeCreate')
        /* 
                      beforeCreate
         */
        initInjections(vm) // resolve injections before data/props
        /* 
                 ,    vm.$options.inject       from  vm._provided             null   result ,    result     ,   defineReactive(vm, key, result[key]);
              defineReactive      Object.defineProperty。
         */
        initState(vm)
        /* 
                   
                 vue   ,                 ,  :
               props,initProps
               methods,initMethods
               data,initData//     ,      ,  Object.defineProperty       
               computed,initComputed
               watch,initWatch
         */
        initProvide(vm) // resolve provide after data/props
        /* 
            vm.$options.provide      ,             vm._provided,          vm._provided
         */
        callHook(vm, 'created')
        /* 
                    created
         */
    
  • 初期化vm.name
  • vm. o p t i o n s . e lに値がある、v mを実行する.options.elに値がある場合はvmを実行する.options.elに値がある場合はvmを実行する.mount(vm.$options.el)
  • src/platforms/web/entry-runtime-with-compilerを実行する.jsは,render関数があるか否かを判断し,ないと1つ生成する.vm. o p t i o n s . r e n d e r , v m . options.render,vm. options.render,vm.options.staticRenderFns. templateのテンプレート文字列を取得し、templateがなければel内のテンプレート文字列を取得し、astツリーを生成し、astを最適化し、最終的にrenderに匿名関数を生成し、関数内部フォーマットはwith(this){return${code}`、ここでcodeはこのcreateElementのパッケージ
  • を含む
  • ライフサイクルフックbeforeMount
  • を実行
  • watcherを作成し、コンポーネントをwatcherに追加し、updateComponent
  • を実行します.
  • updateComponentパッケージvm.render()、この関数はvm.$をカプセル化しています.options.render最終生成VNode
  • はvmを実行する.patch、src/core/vdom/patchに進みます.jsによるdiffコントラストによるdomのレンダリング
  • ライフサイクルフックmountedを実行します.
  • 全体フロー実行完了