らんだむな記憶

blogというものを体験してみようか!的なー

Vue.js (3)

new Vue({...}) で起こることについてはhttps://github.com/vuejs/vue/blob/v2.6.11/dist/vue.js#L5073-L5079を見るのが素直かもしれない。
https://github.com/vuejs/vue/blob/v2.6.11/dist/vue.js#L5081で準備済みの Vue.prototype._init が実行される。→ https://github.com/vuejs/vue/blob/v2.6.11/dist/vue.js#L4961-L5014
callHook についてはvue/vue.js at v2.6.11 · vuejs/vue · GitHubより、イベントハンドラの実行のようである。これを踏まえると

  • initLifecycle 実行
  • initEvents 実行
  • initRender 実行
  • beforeCreate ハンドラ実行
  • initInjections 実行
  • initState 実行
  • initProvide 実行
  • created ハンドラ実行
  • if (vm.$options.el) { vm.$mount(vm.$options.el); } 実行

となる。つまり new Vue({el: "#app", ...}) とかの場合、その #app をもって Vue.prototype.$mount が実行されますと。
Vue.prototype.$mount の定義はhttps://github.com/vuejs/vue/blob/v2.6.11/dist/vue.js#L9039-L9045で、https://github.com/vuejs/vue/blob/v2.6.11/dist/vue.js#L4018-L4090mountComponent の呼び出しに繋がる。ここでは

  • render 関数の存在がチェックされて、存在しないなら createEmptyVNode が仮の render 関数に設定され、
    • 次に new Vue({template: "<div>...</div>", ...}) みたいに template の存在がチェックされる。
      • render 関数も template もないのはダメっぽい。
  • 次に beforeMount ハンドラが実行される。
  • Watcher とかいう「必要に応じてコールバックを実行する」仕組みを使って、updateComponent 内部関数が実行され、その中で Vue.prototype._render が実行される。
  • mounted ハンドラ実行

となるようだ。
Vue.prototype._render の定義はhttps://github.com/vuejs/vue/blob/v2.6.11/dist/vue.js#L3527-L3589で、いわゆる render 関数、つまり new Vue({ render: function(createElement) {...} }) の部分が実行されて、vnode が作成される。
render 関数の引数 createElement の実体はhttps://github.com/vuejs/vue/blob/v2.6.11/dist/vue.js#L3500で、https://github.com/vuejs/vue/blob/v2.6.11/dist/vue.js#L3344-L3361createElement 関数を呼び出す(ややこしい)。これは直下で定義されている _createElement 関数を呼び出す。tag に応じた VNode が作成される。
render 関数で作成された VNodehttps://github.com/vuejs/vue/blob/v2.6.11/dist/vue.js#L3936-L3965Vue.prototype._update に渡される。そして、https://github.com/vuejs/vue/blob/v2.6.11/dist/vue.js#L9036Vue.prototype.__patch__ として patch 関数が呼ばれる。その実体は・・・たぶんhttps://github.com/vuejs/vue/blob/v2.6.11/dist/vue.js#L8449createPatchFunction 関数が作成して返す関数であり、https://github.com/vuejs/vue/blob/v2.6.11/dist/vue.js#L5845-L6561を見る限りでは最終的にはhttps://github.com/vuejs/vue/blob/v2.6.11/dist/vue.js#L6458-L6560という関数である。