摘要:有一點要注意的是,暴露的方法最好不要依賴,因為它可能經常會發生變化,是不穩定的。
從入口開始
我們之前提到過 Vue.js 構建過程,在 web 應用下,我們來分析 Runtime + Compiler 構建出來的 Vue.js,它的入口是 src/platforms/web/entry-runtime-with-compiler.js:
摘選entry-runtime-with-compiler.js
import config from "core/config" import { warn, cached } from "core/util/index" import { mark, measure } from "core/util/perf" //主角在這里 import Vue from "./runtime/index" import { query } from "./util/index" import { compileToFunctions } from "./compiler/index" import { shouldDecodeNewlines, shouldDecodeNewlinesForHref } from "./util/compat"Vue 的入口
在這個入口 JS 的上方我們可以找到 Vue 的來源:import Vue from "./runtime/index",我們先來看一下這塊兒的實現,它定義在 src/platforms/web/runtime/index.js 中:
import Vue from "core/index" import config from "core/config" import { extend, noop } from "shared/util"
這里關鍵的代碼是 import Vue from "core/index"是真正初始化 Vue 的地方[/src/core/index.js]
import Vue from "./instance/index" import { initGlobalAPI } from "./global-api/index"
這里有 2 處關鍵的代碼,import Vue from "./instance/index"(./指的是當前目錄) 和 initGlobalAPI(Vue),初始化全局 Vue API,我們先來看第一部分,在 src/core/instance/index.js 中:
Vue 的定義import { initMixin } from "./init" import { stateMixin } from "./state" import { renderMixin } from "./render" import { eventsMixin } from "./events" import { lifecycleMixin } from "./lifecycle" import { warn } from "../util/index" function Vue (options) { if (process.env.NODE_ENV !== "production" && !(this instanceof Vue) ) { warn("Vue is a constructor and should be called with the `new` keyword") } this._init(options) } initMixin(Vue) stateMixin(Vue) eventsMixin(Vue) lifecycleMixin(Vue) renderMixin(Vue) export default Vue
1
在這里,我們終于看到了 Vue 的廬山真面目,它實際上就是一個用 Function 實現的類,我們只能通過 new Vue 去實例化它
為何 Vue 不用 ES6 的 Class 去實現呢?我們往后看這里有很多 xxxMixin 的函數調用,并把 Vue 當參數傳入,它們的功能都是給 Vue 的 prototype 上擴展一些方法(這里具體的細節會在之后的文章介紹,這里不展開),Vue 按功能把這些擴展分散到多個模塊中去實現,而不是在一個模塊里實現所有,這種方式是用 Class 難以實現的。這么做的好處是非常方便代碼的維護和管理,這種編程技巧也非常值得我們去學習。
initGlobalAPIVue.js 在整個初始化過程中,除了給它的原型 prototype 上擴展方法,還會給 Vue 這個對象本身擴展全局的靜態方法,它的定義在 src/core/global-api/index.js 中:
export function initGlobalAPI (Vue: GlobalAPI) { // config const configDef = {} configDef.get = () => config if (process.env.NODE_ENV !== "production") { configDef.set = () => { warn( "Do not replace the Vue.config object, set individual fields instead." ) } } Object.defineProperty(Vue, "config", configDef) // exposed util methods. // NOTE: these are not considered part of the public API - avoid relying on // them unless you are aware of the risk. Vue.util = { warn, extend, mergeOptions, defineReactive } Vue.set = set Vue.delete = del Vue.nextTick = nextTick Vue.options = Object.create(null) ASSET_TYPES.forEach(type => { Vue.options[type + "s"] = Object.create(null) }) // this is used to identify the "base" constructor to extend all plain-object // components with in Weex"s multi-instance scenarios. Vue.options._base = Vue extend(Vue.options.components, builtInComponents) initUse(Vue) initMixin(Vue) initExtend(Vue) initAssetRegisters(Vue) }
這里就是在 Vue 上擴展的一些全局方法的定義,Vue 官網中關于全局 API 都可以在這里找到,這里不會介紹細節,會在之后的章節我們具體介紹到某個 API 的時候會詳細介紹。有一點要注意的是,Vue.util 暴露的方法最好不要依賴,因為它可能經常會發生變化,是不穩定的。
文章版權歸作者所有,未經允許請勿轉載,若此文章存在違規行為,您可以聯系管理員刪除。
轉載請注明本文地址:http://specialneedsforspecialkids.com/yun/99355.html
摘要:五六月份推薦集合查看最新的請點擊集前端最近很火的框架資源定時更新,歡迎一下。蘇幕遮燎沈香宋周邦彥燎沈香,消溽暑。鳥雀呼晴,侵曉窺檐語。葉上初陽乾宿雨,水面清圓,一一風荷舉。家住吳門,久作長安旅。五月漁郎相憶否。小楫輕舟,夢入芙蓉浦。 五、六月份推薦集合 查看github最新的Vue weekly;請::點擊::集web前端最近很火的vue2框架資源;定時更新,歡迎 Star 一下。 蘇...
摘要:五六月份推薦集合查看最新的請點擊集前端最近很火的框架資源定時更新,歡迎一下。蘇幕遮燎沈香宋周邦彥燎沈香,消溽暑。鳥雀呼晴,侵曉窺檐語。葉上初陽乾宿雨,水面清圓,一一風荷舉。家住吳門,久作長安旅。五月漁郎相憶否。小楫輕舟,夢入芙蓉浦。 五、六月份推薦集合 查看github最新的Vue weekly;請::點擊::集web前端最近很火的vue2框架資源;定時更新,歡迎 Star 一下。 蘇...
摘要:特意對前端學習資源做一個匯總,方便自己學習查閱參考,和好友們共同進步。 特意對前端學習資源做一個匯總,方便自己學習查閱參考,和好友們共同進步。 本以為自己收藏的站點多,可以很快搞定,沒想到一入匯總深似海。還有很多不足&遺漏的地方,歡迎補充。有錯誤的地方,還請斧正... 托管: welcome to git,歡迎交流,感謝star 有好友反應和斧正,會及時更新,平時業務工作時也會不定期更...
閱讀 2928·2021-11-04 16:06
閱讀 767·2021-09-30 09:56
閱讀 1832·2021-09-22 10:02
閱讀 2612·2019-08-29 13:43
閱讀 2198·2019-08-29 13:42
閱讀 2288·2019-08-29 12:21
閱讀 1038·2019-08-29 11:29
閱讀 1377·2019-08-26 13:51