成人国产在线小视频_日韩寡妇人妻调教在线播放_色成人www永久在线观看_2018国产精品久久_亚洲欧美高清在线30p_亚洲少妇综合一区_黄色在线播放国产_亚洲另类技巧小说校园_国产主播xx日韩_a级毛片在线免费

資訊專(zhuān)欄INFORMATION COLUMN

人人都能懂的Vue源碼系列—03—resolveConstructorOptions函數(shù)-上

snifes / 563人閱讀

摘要:上篇文章介紹了構(gòu)造函數(shù)的部分實(shí)現(xiàn),當(dāng)前實(shí)例不是組件時(shí),會(huì)執(zhí)行方法。這個(gè)文件就是對(duì)構(gòu)造函數(shù)進(jìn)行的第一層包裝了。但是注意這里的代碼我們構(gòu)造函數(shù)的第二層包裝,就在這個(gè)文件里了?;氐降脑创a中,當(dāng)不存在時(shí),直接返回基礎(chǔ)構(gòu)造器的。

上篇文章介紹了Vue構(gòu)造函數(shù)的部分實(shí)現(xiàn),當(dāng)前Vue實(shí)例不是組件時(shí),會(huì)執(zhí)行mergeOptions方法。

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

mergeOptions方法,我們之后的博文再來(lái)做詳細(xì)介紹。今天主要研究resolveConstructorOptions方法,從字面意思來(lái)看,這個(gè)方法是來(lái)解析constructor上的options屬性的。我們來(lái)看源碼。

export function resolveConstructorOptions (Ctor: Class) {
  let options = Ctor.options
  // 有super屬性,說(shuō)明Ctor是Vue.extend構(gòu)建的子類(lèi)
  if (Ctor.super) {
    const superOptions = resolveConstructorOptions(Ctor.super)
    const cachedSuperOptions = Ctor.superOptions // Vue構(gòu)造函數(shù)上的options,如directives,filters,....
    if (superOptions !== cachedSuperOptions) {
      // super option changed,
      // need to resolve new options.
      Ctor.superOptions = superOptions
      // check if there are any late-modified/attached options (#4976)
      const modifiedOptions = resolveModifiedOptions(Ctor)
      // update base extend options
      if (modifiedOptions) {
        extend(Ctor.extendOptions, modifiedOptions)
      }
      options = Ctor.options = mergeOptions(superOptions, Ctor.extendOptions)
      if (options.name) {
        options.components[options.name] = Ctor
      }
    }
  }
  return options
}

這個(gè)方法要分成兩種情況來(lái)說(shuō)明,第一種是Ctor是基礎(chǔ)Vue構(gòu)造器的情況,另一種是Ctor是通過(guò)Vue.extend方法擴(kuò)展的情況。

Ctor是基礎(chǔ)Vue構(gòu)造器

當(dāng)Ctor(Ctor其實(shí)就是構(gòu)造函數(shù))是基礎(chǔ)Vue構(gòu)造器時(shí),比如是通過(guò)new關(guān)鍵字新建Vue構(gòu)造函數(shù)的實(shí)例

const vm = new Vue({
  el: "#app",
    data: {
      message: "Hello Chris"
    }
})

這個(gè)時(shí)候options就是Vue構(gòu)造函數(shù)上的options。如下圖

那么這個(gè)options是在哪里定義的呢?在之前的代碼中好像沒(méi)有看到options的定義在哪里?此時(shí)我們應(yīng)該怎么去找這個(gè)options定義的地方呢?
這里教大家一個(gè)方法,首先找到package.json,在這里可以找到我們平時(shí)用到的一些npm腳本。以npm run dev為例。實(shí)際上npm run dev是執(zhí)行了下列的命令
"dev": "rollup -w -c scripts/config.js --environment TARGET:web-full-dev"
rollup是類(lèi)似于webpack的打包工具。我們可以看到這條命令指向了一個(gè)地址scripts/config,之后還指定了一個(gè)Target。找到script/config,發(fā)現(xiàn)這個(gè)文件里
有TARGET為web-full-dev的配置。

// Runtime+compiler development build (Browser)
  "web-full-dev": {
    entry: resolve("web/entry-runtime-with-compiler.js"),
    dest: resolve("dist/vue.js"),
    format: "umd",
    env: "development",
    alias: { he: "./entity-decoder" },
    banner
  }

來(lái)分析上面的代碼,入口文件的地址在web/entry-runtime-with-compiler.js。這個(gè)文件就是對(duì)Vue構(gòu)造函數(shù)進(jìn)行的第一層包裝了。由于今天分析的是options相關(guān)的內(nèi)容,而這層包裝里沒(méi)有options相關(guān)的內(nèi)容,所以這個(gè)文件我們不展開(kāi)講(之后有文章會(huì)詳細(xì)介紹)。但是注意這里的代碼

...
import Vue from "./runtime/index"
...

我們Vue構(gòu)造函數(shù)的第二層包裝,就在這個(gè)文件里了。忽略其他的代碼,我們來(lái)看關(guān)于Vue.options的部分

...
import Vue from "core/index" // 第三層包裝
import platformDirectives from "./directives/index"
import platformComponents from "./components/index"
...
// install platform runtime directives & components
extend(Vue.options.directives, platformDirectives)
extend(Vue.options.components, platformComponents)
...

// platformDirectives相關(guān)
// 這里導(dǎo)出Vue全局指令model,show
import model from "./model"
import show from "./show"
export default {
  model,
  show
}

// platformComponents相關(guān)
// 這里導(dǎo)出Vue全局組件Transition,TransitionGroup
import Transition from "./transition"
import TransitionGroup from "./transition-group"
export default {
  Transition,
  TransitionGroup
}

上面的代碼主要是給Vue.options.directives添加model,show屬性,給Vue.options.components添加Transition,TransitionGroup屬性。那么還有filters,_base屬性,以及components中的KeepAlive又是怎么來(lái)的呢?
這就要看Vue的第三層包裝里都做了些什么?找到core/index,同樣我們只看Vue.options相關(guān)代碼。

mport Vue from "./instance/index"
import { initGlobalAPI } from "./global-api/index"
...
initGlobalAPI(Vue)
...

instance/index 就是我們第二篇文章——構(gòu)造函數(shù)定義的那個(gè)文件。這個(gè)文件我們之前看過(guò),沒(méi)有和Vue構(gòu)造函數(shù)options相關(guān)的代碼。那么我們剩下的沒(méi)有配置的options一定是在initGlobalAPI上配置了。接來(lái)下看看/global-api/index的代碼。

/* @flow */

import { ASSET_TYPES } from "shared/constants"
...
export function initGlobalAPI (Vue: GlobalAPI) {
  ...
  Vue.options = Object.create(null)
  ASSET_TYPES.forEach(type => {
    Vue.options[type + "s"] = Object.create(null)
  })
  Vue.options._base = Vue
  extend(Vue.options.components, builtInComponents)
  ...
}

// shared/constants.js
export const ASSET_TYPES = [
  "component",
  "directive",
  "filter"
]

// core/components/index
import KeepAlive from "./keep-alive"
export default {
  KeepAlive
}

上面這層包裝就把filters,_base和components中的KeepAlive都實(shí)現(xiàn)了。通過(guò)這三層包裝,Vue構(gòu)造函數(shù)的options對(duì)象就生成了,看這些文字可能有點(diǎn)繞,我們直接上圖。


回到resolveConstructorOptions的源碼中,當(dāng)Ctor.super不存在時(shí),直接返回基礎(chǔ)構(gòu)造器的options。即上圖經(jīng)過(guò)兩次包裝的options。那么Ctor.super是什么呢?
Ctor.super是通過(guò)Vue.extend構(gòu)造子類(lèi)的時(shí)候。Vue.extend方法會(huì)為Ctor添加一個(gè)super屬性,指向其父類(lèi)構(gòu)造器

Vue.extend = function (extendOptions: Object): Function {
  ...
  Sub["super"] = Super
  ...
}

所以當(dāng)Ctor時(shí)基礎(chǔ)構(gòu)造器的時(shí)候,resolveConstructorOptions方法返回基礎(chǔ)構(gòu)造器的options。除了Ctor是基礎(chǔ)構(gòu)造器之外,還有一種是Ctor是通過(guò)Vue.extend構(gòu)造的子類(lèi)。這種情況比較復(fù)雜,下一篇文章專(zhuān)門(mén)對(duì)其進(jìn)行介紹,敬請(qǐng)期待!

文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。

轉(zhuǎn)載請(qǐng)注明本文地址:http://systransis.cn/yun/94597.html

相關(guān)文章

  • 人人都能懂的Vue源碼系列—04—resolveConstructorOptions函數(shù)-下

    摘要:上一篇文章中說(shuō)道,函數(shù)要分兩種情況進(jìn)行說(shuō)明,第一種是為基礎(chǔ)構(gòu)造器的情況,這個(gè)已經(jīng)向大家介紹過(guò)了,今天這篇文章主要介紹第二種情況,是創(chuàng)建的子類(lèi)。表示的是當(dāng)前構(gòu)造器上新增的,表示的是當(dāng)前構(gòu)造器上新增的封裝。 上一篇文章中說(shuō)道,resolveConstructorOptions函數(shù)要分兩種情況進(jìn)行說(shuō)明,第一種是Ctor為基礎(chǔ)構(gòu)造器的情況,這個(gè)已經(jīng)向大家介紹過(guò)了,今天這篇文章主要介紹第二種情況...

    My_Oh_My 評(píng)論0 收藏0
  • 人人都能懂的Vue源碼系列—04—resolveConstructorOptions函數(shù)-下

    摘要:上一篇文章中說(shuō)道,函數(shù)要分兩種情況進(jìn)行說(shuō)明,第一種是為基礎(chǔ)構(gòu)造器的情況,這個(gè)已經(jīng)向大家介紹過(guò)了,今天這篇文章主要介紹第二種情況,是創(chuàng)建的子類(lèi)。表示的是當(dāng)前構(gòu)造器上新增的,表示的是當(dāng)前構(gòu)造器上新增的封裝。 上一篇文章中說(shuō)道,resolveConstructorOptions函數(shù)要分兩種情況進(jìn)行說(shuō)明,第一種是Ctor為基礎(chǔ)構(gòu)造器的情況,這個(gè)已經(jīng)向大家介紹過(guò)了,今天這篇文章主要介紹第二種情況...

    BlackHole1 評(píng)論0 收藏0
  • 人人都能懂的Vue源碼系列—02—Vue構(gòu)造函數(shù)

    摘要:果然我們找到了的構(gòu)造函數(shù)定義。告訴你是一個(gè)構(gòu)造函數(shù),需要用操作符去調(diào)用。在深入方法之前,我們先把目光移到文件里在的構(gòu)造函數(shù)定義之后,有一系列方法會(huì)被立即調(diào)用。下篇博文主要介紹相關(guān)的內(nèi)容,涉及到原型鏈和構(gòu)造函數(shù)以及部分的實(shí)現(xiàn),敬請(qǐng)期待 上篇博文中說(shuō)到了Vue源碼的目錄結(jié)構(gòu)是什么樣的,每個(gè)目錄的作用我們應(yīng)該也有所了解。我們知道core/instance目錄主要是用來(lái)實(shí)例化Vue對(duì)象,所以我...

    X_AirDu 評(píng)論0 收藏0
  • 人人都能懂的Vue源碼系列—05—mergeOptions-

    摘要:在解析完其構(gòu)造函數(shù)上的之后,需要把構(gòu)造函數(shù)上的和實(shí)例化時(shí)傳入的進(jìn)行合并操作并生成一個(gè)新的。檢查組件名稱(chēng)是否合法首先看傳入的三個(gè)參數(shù),,這三個(gè)參數(shù)分別代表的是該實(shí)例構(gòu)造函數(shù)上的實(shí)例化時(shí)傳入的實(shí)例本身。 前幾篇文章中我們講到了resolveConstructorOptions,它的主要功能是解析當(dāng)前實(shí)例構(gòu)造函數(shù)上的options,不太明白的同學(xué)們可以看本系列的前幾篇文章。在解析完其構(gòu)造函數(shù)...

    iKcamp 評(píng)論0 收藏0
  • 人人都能懂的Vue源碼系列—01—Vue源碼目錄結(jié)構(gòu)

    摘要:閱讀的源碼,或者說(shuō)閱讀一個(gè)框架的源碼,了解它的目錄結(jié)構(gòu)都是很有幫助的。人人都能懂的源碼系列文章將會(huì)詳細(xì)的介紹源碼的方方面面。 閱讀Vue的源碼,或者說(shuō)閱讀一個(gè)框架的源碼,了解它的目錄結(jié)構(gòu)都是很有幫助的。下面我們來(lái)看看Vue源碼的目錄結(jié)構(gòu)。showImg(https://segmentfault.com/img/bV8fLS?w=598&h=654); Vue各目錄簡(jiǎn)介 下圖是Vue各個(gè)...

    MAX_zuo 評(píng)論0 收藏0

發(fā)表評(píng)論

0條評(píng)論

最新活動(dòng)
閱讀需要支付1元查看
<