VueJS學(xué)習(xí)之旅 03

前面兩部分介紹了Vuejs的各個(gè)發(fā)布版本,以及它們的區(qū)別。也了解了VueJS源碼的代碼結(jié)構(gòu),以及基本的構(gòu)建過(guò)程。
下一代ES6 模塊打包工具 rollup 是通過(guò) entry 文件中的模塊引入來(lái)分析依賴關(guān)系并完成代碼打包的,所以下面我們的重點(diǎn)就是這個(gè) entry 文件了。
src/entries/web-runtime-with-compiler.js 為例。


打開(kāi)文件,第一行有個(gè)

/* @flow */

這又是什么,沒(méi)見(jiàn)過(guò),Google之。https://flowtype.org/
原來(lái)這貨時(shí)一個(gè)javascript靜態(tài)類型檢查器,代碼中有個(gè) .flowconfig 文件就是給它用的。好的,這不是我們的重點(diǎn),略之。

繼續(xù)向下看代碼
下面就是一連串的import語(yǔ)句了,我們先來(lái)看看簡(jiǎn)單的

import { warn, cached } from 'core/util/index'

其實(shí)在 'core/util/index' 文件中并沒(méi)有 warncached 的直接定義,也是從其他模塊中引入的。具體來(lái)看一下,warn 是在 'core/util/debug' 模塊中定義,而 cached 其實(shí)是在 'shared/util' 模塊中定義的。
細(xì)心的話就會(huì)發(fā)現(xiàn),在 'core/util/index' 文件中引入 'shared/util' 的時(shí)候,相對(duì)路徑是不正確的,rollup是如何找到它的?這里有必要介紹一下 alias。
我們回顧一下build的過(guò)程,有個(gè) getConfig 函數(shù)中用到了 alias, 并且在build目錄下面有個(gè) alias.js 文件,其實(shí)里面已經(jīng)記錄了這些別名的映射關(guān)系,所以我們?cè)趇mport的時(shí)候就可以直接使用別名來(lái)導(dǎo)入模塊了。

import { query } from 'web/util/index'

是從 'platforms/web/util/index' 中引入了 query 這個(gè)依賴。

import { shouldDecodeNewlines } from 'web/util/compat'

是從 'platforms/util/compat' 中引入shouldDecodeNewlines 這個(gè)依賴。

import { compileToFunctions } from 'web/compiler/index'

則是從 'platforms/compiler/index' 中引入 compileToFunctions 這個(gè)依賴的。

import Vue from './web-runtime'

看名字就知道這個(gè)才是重點(diǎn)。
過(guò)一遍代碼就會(huì)發(fā)現(xiàn),這個(gè)文件的邏輯也相對(duì)簡(jiǎn)單。
從 './web-runtime' 中引入了Vue構(gòu)造器, 并對(duì)Vue.prototype.$mount進(jìn)行了包裝。

  1. 首先是判斷給定的el參數(shù)是否是 <html><body>。如果是的話,就給出警告并返回當(dāng)前vue的實(shí)例對(duì)象,不做其它處理。
  2. 然后判斷當(dāng)前vue實(shí)例對(duì)象是否配置了 render 屬性。 如果沒(méi)有就去查找或計(jì)算 template 屬性,然后使用 compiler 模塊構(gòu)建 renderstaticRenderFns 方法, 并將其注入到當(dāng)前vue實(shí)例對(duì)象中。
  3. 最后調(diào)用原始的Vue.prototype.$mount方法。

另外,從 'build/config.js' 文件中可以知道 'web-runtime' 是構(gòu)建 'vue.runtime.js' 的入口文件。而當(dāng)前的構(gòu)建入口文件,只是重用了 runtime 版本,并包裝了compiler。

打開(kāi) 'vue.runtime.js' 文件,發(fā)現(xiàn)這也是對(duì)原始Vue構(gòu)造器的包裝。這樣逐級(jí)向上查找,我們就會(huì)找到最最原始的Vue構(gòu)造器是如何定義和擴(kuò)展的。
為何要如此關(guān)注Vue構(gòu)造器的定義呢?因?yàn)閭€(gè)人理解在VueJS的開(kāi)發(fā)中,最主要的就是如何去實(shí)例化Vue對(duì)象。
以后就可以具體到代碼中一探究竟了。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

  • 轉(zhuǎn)載 :OpenDiggawesome-github-vue 是由OpenDigg整理并維護(hù)的Vue相關(guān)開(kāi)源項(xiàng)目庫(kù)...
    果汁密碼閱讀 23,406評(píng)論 8 124
  • 沉默如此 文/紓寒 南方的冬天快要結(jié)束,空氣中還夾雜著冰冷入骨的水汽。她拖著行李箱走過(guò)那棟因?yàn)榧倨趯⒅炼翢o(wú)生氣的...
    紓寒閱讀 393評(píng)論 0 0
  • 白日里 你是樹(shù)旁的一粒沙 狂風(fēng)吹過(guò) 無(wú)奈地被卷起 風(fēng)兒絲毫不顧及 你的恐高 你只能在風(fēng)中 飛揚(yáng) 飛揚(yáng) 飛揚(yáng) 暗夜里...
    碎碎念小乖閱讀 443評(píng)論 5 9

友情鏈接更多精彩內(nèi)容