一步一個腳印,3分鐘教你看Vue 原始碼???

藤蔓繞竹發表於2019-11-04

1、準備工作

  • 下載vue原始碼

git clone https://github.com/vuejs/vue.git複製程式碼

  • 安裝 rollup

sudo npm i -g rollup  //mac
npm i -g rollup  //window複製程式碼
  • 修改package.json 中 scripts新增--sourcemap

"scripts": {    
    "dev": "rollup -w -c scripts/config.js 
            --sourcemap 
            --environment TARGET:web-full-dev",
.....
}

複製程式碼
  • test資料夾下新建測試test.html
<!DOCTYPE html>
<html lang="en">

<head>
  <meta charset="UTF-8">
  <meta name="viewport" content="width=device-width, initial-scale=1.0">
  <meta http-equiv="X-UA-Compatible" content="ie=edge">
  <title>Vue測試</title>
  <script src="../dist/vue.js"></script>
</head>

<body>
  <div id='demo'>
    <h1>測試vue</h1>
    <p>{{foo}}</p>
  </div>
  <script>
    const app = new Vue({
      el: '#demo',
      data: {
        foo: 'foo'
      }
    })
  </script>
</body>
</html>
複製程式碼
  • 執行npm run dev後在頁面開啟test.html

一步一個腳印,3分鐘教你看Vue 原始碼???

2、開始看程式碼

2.1 在package.json可以看到入口檔案為scripts/config.js執行函式

為web-full-dev

"scripts": {     
    "dev": "rollup -w -c scripts/config.js --sourcemap --environment             
    TARGET:web-full-dev"
}複製程式碼

2.2 開啟 scripts/config.js 找到web-full-dev可以看到他的入口檔案是web/entry-runtime-with-compiler.js

一步一個腳印,3分鐘教你看Vue 原始碼???

那麼問題來了,這裡的web是代表的那個檔案目錄呢?在首目錄中並沒有發現web資料夾??其實很好找到,讓我們進入resolve()

一步一個腳印,3分鐘教你看Vue 原始碼???

統一引入了./alias檔案,進入./alias看看吧

一步一個腳印,3分鐘教你看Vue 原始碼???

綜上所述找到入口檔案src/platforms/web/entry-runtime-with-compiler.js

3. vue初始化流程

3.1 入口檔案程式碼解析(詳見程式碼註釋)

  • 獲取原始的$mount方法並擴充套件它:處理template或el選項
  • 處理template選項 render>template>el
  • render優先順序最高
  • 設定el,則將其作為模版

一步一個腳印,3分鐘教你看Vue 原始碼???

  • 執行編譯,使用者編寫的模版變成渲染函式
  • 執行掛載:虛擬dom->dom

一步一個腳印,3分鐘教你看Vue 原始碼???

3.2 使用瀏覽器?跑一?‍♀️跑

一步一個腳印,3分鐘教你看Vue 原始碼???

3.3 打斷點除錯

4、看vue原始碼,咋沒見vue例項?不要著急這就上了?

4.1 回到我們的入口檔案找到引入的vue點進去

一步一個腳印,3分鐘教你看Vue 原始碼???4.2 木有,再進

一步一個腳印,3分鐘教你看Vue 原始碼???4.3 木有,再進(大佬,你在搞什麼,俄羅斯套娃?嗎)

一步一個腳印,3分鐘教你看Vue 原始碼???4.4 莫慌,馬上就到了(為了程式碼的可讀性我可是做了分層哦?)

一步一個腳印,3分鐘教你看Vue 原始碼???綜上所訴找到Vue例項檔案:src/core/instance/index.js

5、init?看看它的初始化順序

5.1 init初始化檔案src/core/instance/init.js

  • 初始化順序: 生命週期->事件監聽->渲染->beforeCreate->注入->元件狀態(data,methods……資料相應化)->提供資料->created

一步一個腳印,3分鐘教你看Vue 原始碼???

6.…………完美????開始探索吧??


相關文章