在閱讀源代碼之前,我們需要先了解Vue最基礎(chǔ)的用法,官網(wǎng)示例如下:
<script src="https://cdn.jsdelivr.net/npm/vue@2"></script>
<script>
var app = new Vue({
el: '#app',
data: {
message: 'Hello Vue!'
}
})
</script>
無(wú)論我們的項(xiàng)目如何設(shè)計(jì),Vue都是從new一個(gè)Vue的實(shí)例開(kāi)始的,閱讀源代碼的一個(gè)起點(diǎn)就在這,為什么說(shuō)是一個(gè)起點(diǎn)呢,因?yàn)檫@里有一個(gè)很容易混淆的概念:類和實(shí)例,我們這里用Vue大寫(xiě)字母開(kāi)頭的表示Vue.js的類、用vue小寫(xiě)字母開(kāi)頭的表示類實(shí)例
- 類
js中單純的類是沒(méi)有Vue所需的大量功能的,而賦予Vue能力的這個(gè)行為叫提供Vue.js的Runtime,也就是瀏覽器讀取Vue.js的編譯產(chǎn)物時(shí)執(zhí)行的對(duì)Vue的定義操作,這個(gè)操作的實(shí)現(xiàn)在src/core/instance/index.ts - 實(shí)例
創(chuàng)建Vue的實(shí)例vue,實(shí)際是執(zhí)行了Vue的構(gòu)造函數(shù),所以這里執(zhí)行的是src/core/instance/init.ts的_init函數(shù)
當(dāng)然,單純的用類和實(shí)例劃分是不對(duì)的,但因?yàn)閖s是一門(mén)動(dòng)態(tài)語(yǔ)言,各種概念混雜邊限模糊、而Vue.js項(xiàng)目現(xiàn)代化的項(xiàng)目架構(gòu)又和瀏覽器的運(yùn)行環(huán)境八桿子打不著,讓很多經(jīng)驗(yàn)不夠豐富的開(kāi)發(fā)者無(wú)法理解其運(yùn)行原理,所以用這樣一種定義方式讓人更容易理解。
如果你熟悉一門(mén)編譯型語(yǔ)言的話,可以這樣類比:
在Vue.js的這套架構(gòu)下,我們可以把ECMAScript規(guī)范理解成ARM指令集、把V8理解成ARM芯片型號(hào)、把瀏覽器理解成操作系統(tǒng)、把TypeScript理解成業(yè)務(wù)的編寫(xiě)語(yǔ)言、把編譯產(chǎn)生的JavaScript代碼理解成機(jī)器碼、把瀏覽器<script />標(biāo)簽理解為操作系統(tǒng)load機(jī)器碼、把new Vue()理解成軟件啟動(dòng)。
對(duì)整體的運(yùn)行機(jī)制有了一定的了解后,就可以開(kāi)始閱讀Vue.js的源代碼了。