最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

vue源碼入口文件分析(推薦)

 更新時間:2018年01月30日 09:22:23   作者:zhanglearning  
這篇文章主要介紹了vue源碼入口文件分析(推薦),小編覺得挺不錯的,現(xiàn)在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧

開發(fā)vue項目有段時間了, 之前用angularjs 后來用 reactjs 但是那時候一直沒有時間把自己看源碼的思考記錄下來,現(xiàn)在我不想再浪費這 來之不易的思考, 我要堅持!!

看源碼我個人感覺非常開心,每每看上一段,自己就充實許多,不知道你是否和我一樣。

vue 源碼是眾多module(模塊)用 rollup 工具合并而成, 從package.json 中能夠看到?,F(xiàn)在讓我們從github上下載vue項目,開始我們今天的“思考”。

我下載的源碼版本是:"version": "2.5.7",

源碼起始位置從這里可以看到

"dev": "rollup -w -c build/config.js --environment TARGET:web-full-dev"

// 從build/config.js 中找到 TARGET: web-full-dev 這是運行和編譯(支持現(xiàn)在的瀏覽器,由于里面大量應用了ES6-7)后的

 // 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
 },

找到了開始文件就是 "web/entry-runtime-with-compiler.js", 然后我們一路找 Vue 對象 終于在 “instance/index.js” 中找到了:

// 這是Vue 的開始位置
function Vue (options) {
 // 判斷如果是不是生產(chǎn)環(huán)境,且不是通過new關(guān)鍵字來創(chuàng)建對象的話,就在控制臺打印一個warning
 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)
}

看似到這里都結(jié)束了,因為我們目的就是找到開始位置,但是我有個疑問,為什么Vue需要這么多層 ?

entry-runtime-with-compiler.js
->
runtime/index.js
->
core/index.js
->
instance/index.js

當我仔細看了源碼后恍然大悟,我們先看看他們這些文件都做了什么:

(1)instance/index.js

從Vue 模塊命名中能看出一些端倪, instance (實例) 。

這個文件是Vue 對象的開始,同時也是Vue 原型鏈(prototype) 方法的集中文件

// _init
initMixin(Vue)
// $set、$delete、$watch
stateMixin(Vue)
// $on、$once、$off、$emit
eventsMixin(Vue)
// _update、$forceUpdate、$destroy
lifecycleMixin(Vue)
// $nextTick、_render、以及多個內(nèi)部調(diào)用的方法
renderMixin(Vue)

這些方法只有實例化了才能調(diào)用。

(2)core/index.js

這個文件在Instance/index.js 創(chuàng)建和初步加工后,再次加工。 那他主要做了什么呢? 我們不考慮運行環(huán)境

initGlobalAPI(Vue)

對,就調(diào)用了這個方法,很簡單明了吧 --- "初始化全局接口",

讓我們走進initGlobalAPI 方法

export function initGlobalAPI (Vue: GlobalAPI) {
 // config
 const configDef = {}
 configDef.get = () => config
 // 在 非生產(chǎn)環(huán)境,如何修改了配置文件config里面的內(nèi)容會提示警告
 if (process.env.NODE_ENV !== 'production') {
  configDef.set = () => {
   warn(
    'Do not replace the Vue.config object, set individual fields instead.'
   )
  }
 }
 // 定義config 屬性, 監(jiān)聽變化
 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)
 // 給vue 創(chuàng)建 ASSET_TYPES 的 空對象
 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)
 // Vue.use
 initUse(Vue)
 // Vue.mixin
 initMixin(Vue)
 // Vue.extend
 initExtend(Vue)
 // Vue.component, Vue.directive, Vue.filter
 initAssetRegisters(Vue)
}

這里面基本都是 靜態(tài)方法,即:用 Vue. xxx 的形式調(diào)用。

(3)runtime/index.js

這里就加一些擴展和 在 Vue.prototype上添加了__patch__和$mount(掛載元素)。

// Vue.options.directives(model和show)和 Vue.options.components(Transition和TransitionGroup)
extend(Vue.options.directives, platformDirectives)
extend(Vue.options.components, platformComponents)

// install platform patch function
Vue.prototype.__patch__ = inBrowser ? patch : noop

// public mount method
Vue.prototype.$mount = function (
 el?: string | Element,
 hydrating?: boolean
): Component {
 el = el && inBrowser ? query(el) : undefined
 return mountComponent(this, el, hydrating)
}

(4)entry-runtime-with-compiler.js

就干了一件事就是重寫$mount, Vue根據(jù)不同運行環(huán)境,重寫不同$mount

const mount = Vue.prototype.$mount
Vue.prototype.$mount = function (
 el?: string | Element,
 hydrating?: boolean
): Component {
 ...
 return mount.call(this, el, hydrating)
}

總結(jié):

到此我們找到了開始執(zhí)行的文件,和每個文件有什么用,具體怎么做的,做了什么我會下次再寫。不過我們剛開始不要太在乎每個細節(jié),不要非得弄懂每一行代碼,如果那樣,真的太累了,而且可能沒有勇氣堅持下去。

以上就是本文的全部內(nèi)容,希望對大家的學習有所幫助,也希望大家多多支持腳本之家。

相關(guān)文章

  • UniApp中實現(xiàn)類似錨點定位滾動效果

    UniApp中實現(xiàn)類似錨點定位滾動效果

    一個uniapp小程序的項目,我們需要實現(xiàn)一個非常實用的功能——類似于錨點定位的交互效果,即在首頁中有多個tab(分類標簽),每個tab對應著不同的模塊,當用戶點擊某個分類的tab時,需要流暢地滾動到對應的內(nèi)容位置,提供更好的用戶體驗,
    2023-10-10
  • 詳解vue項目中如何引入全局sass/less變量、function、mixin

    詳解vue項目中如何引入全局sass/less變量、function、mixin

    這篇文章主要介紹了詳解vue項目中如何引入全局sass/less變量、function、mixin,小編覺得挺不錯的,現(xiàn)在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧
    2018-06-06
  • Vue首頁加載白屏原因以及10種解決方法匯總

    Vue首頁加載白屏原因以及10種解決方法匯總

    這篇文章主要介紹了Vue首頁加載白屏原因以及10種解決方法匯總,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2023-03-03
  • VUE3中watch監(jiān)聽使用實例詳解

    VUE3中watch監(jiān)聽使用實例詳解

    watch函數(shù)用來偵聽特定的數(shù)據(jù)源,并在回調(diào)函數(shù)中執(zhí)行副作用,下面這篇文章主要給大家介紹了關(guān)于VUE3中watch監(jiān)聽使用的相關(guān)資料,需要的朋友可以參考下
    2022-06-06
  • vue使用laydate時間插件的方法

    vue使用laydate時間插件的方法

    這篇文章主要為大家詳細介紹了vue使用laydate時間插件的方法,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2018-11-11
  • vue中數(shù)據(jù)字典dicts的簡單說明和用法介紹

    vue中數(shù)據(jù)字典dicts的簡單說明和用法介紹

    這篇文章主要給大家介紹了關(guān)于vue中數(shù)據(jù)字典dicts的簡單說明和用法的相關(guān)資料,如果您想在Vue中使用字典查詢,您可以使用Vue的計算屬性和方法,文中通過代碼介紹的非常詳細,需要的朋友可以參考下
    2024-01-01
  • 在Vant的基礎(chǔ)上封裝下拉日期控件的代碼示例

    在Vant的基礎(chǔ)上封裝下拉日期控件的代碼示例

    這篇文章主要介紹了在Vant的基礎(chǔ)上封裝下拉日期控件的代碼示例,小編覺得挺不錯的,現(xiàn)在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧
    2018-12-12
  • vue3項目中封裝axios的示例代碼

    vue3項目中封裝axios的示例代碼

    這篇文章主要介紹了vue3項目中封裝axios的示例代碼,本文通過示例代碼給大家介紹的非常詳細,對大家的學習或工作具有一定的參考借鑒價值,需要的朋友可以參考下
    2022-12-12
  • vue?codemirror實現(xiàn)在線代碼編譯器效果

    vue?codemirror實現(xiàn)在線代碼編譯器效果

    這篇文章主要介紹了vue-codemirror實現(xiàn)在線代碼編譯器?,本文給大家介紹的非常詳細,對大家的學習或工作具有一定的參考借鑒價值,需要的朋友可以參考下
    2021-12-12
  • vue3?使用provide?inject父子組件傳值失敗且子組件不響應

    vue3?使用provide?inject父子組件傳值失敗且子組件不響應

    這篇文章主要介紹了vue3使用provide?inject父子組件傳值傳不過去且傳遞后子組件不具備響應性問題解決方法,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪
    2023-08-08

最新評論

师宗县| 大悟县| 长顺县| 静乐县| 澄城县| 尼勒克县| 曲沃县| 望都县| 湟中县| 纳雍县| 榆树市| 新绛县| 固阳县| 淄博市| 竹山县| 广丰县| 辽阳县| 西乌珠穆沁旗| 辽源市| 满城县| 博白县| 遂宁市| 东港市| 泸州市| 余庆县| 大荔县| 巫溪县| 嘉定区| 呼图壁县| 长阳| 安化县| 广河县| 饶平县| 金华市| 冀州市| 神农架林区| 巫溪县| 祁东县| 南和县| 远安县| 永顺县|