用console.log分析Vue原始碼

Jike發表於2018-12-17

前言

本文通過console.log的一些特性,結合vue.js的原始碼,通過一個簡單的例子,讓你瞭解Vue的各個過程的變化.
控制檯輸出的效果圖

用console.log分析Vue原始碼

用console.log分析Vue原始碼

請用chrome檢視,並開啟控制檯看效果 演示地址

準備

vue-console.html的建立

下載vue.js檔案,在vue-console.html中引入,我寫了一個簡單的例子,涵蓋:初始化檢視->點選後更新檢視(包括各個鉤子函式)
程式碼如下:

  <script src="./vue.js"></script>
  <div id="app">
    <div id="hi" @click="changeName">{{name}}</div>
  </div>
  </div>
    <script>
    var style = 'font-size: 20px;color: blue'
    var vm = new Vue({
      el:'#app',
      data() {
        return {
          name: '點我',
        }
      },
      beforeCreate () {
        console.log('%cI am beforeCreate------ 我在選項裡寫的', style)
      },
      created () {
        console.log('%cI am created------ 我在選項裡寫的', style)
      },
      beforeMount () {
        console.log('%cI am beforeMount------ 我在選項裡寫的', style)
      },
      mounted () {
        console.log('%cI am mounted------ 我在選項裡寫的', style)
      },
      beforeUpdate () {
        console.log('%cI am beforeUpdate------ 我在選項裡寫的',style)
      },
      updated () {
        console.log('%cI am updated------ 我在選項裡寫的', style)
      },
      methods: {
        changeName () {   // 點選是文字發生變化
          this.name = 'jike'
        } 
      }
    })  
  </script>
複製程式碼

console.log樣式的配置


var tagLeftStyle = [
  'color: #fff',
  'border-top-left-radius:3px',
  'border-bottom-left-radius:3px',
  'background-color: #564b4f',
  'padding: 5px'
].join(';')

var tagRightStyle = function (color) {
  color = color?color:'#0BCF1B'
  return [
    'color: #fff',
    'border-top-right-radius:3px',
    'border-bottom-right-radius:3px',
    `background-color: ${color}`,
    'padding: 5px'
  ].join(';')
}
// ...
// 一些樣式省略,具體可以去看原始碼
var tagVariable = function (obj, tag, desc, num, detail, color) {
  console.log(`%c${lineNo} %o%c<---%c${tag}%c${desc}  %c原始碼${num}行 %c說明: %o`, noStyle, obj, arrowStyle ,tagLeftStyle, tagRightStyle(color), sourceNoStyle, detailStyle, detail)
  lineNo++
}
// %c代表後面的文字,使用css樣式,%o代表物件輸出
複製程式碼

用console.log分析Vue原始碼
上面的程式碼只要呼叫tagVariable(...)傳遞引數,就實現上圖的標籤效果, 還可以console.log顯示圖片,加了一下講解圖方便理解;

用console.log分析Vue原始碼
通過呼叫上面封裝的函式在vue.js某些時刻呼叫,就達到很好的效果

專案過程

我將整個過程分為四個階段: 建構函式階段初始化階段掛載階段更新階段, 會以上面提到的例子貫穿的

建構函式階段

平常我們使用Vue,都是用new Vue({}),其實就是呼叫它的建構函式建立例項,如下圖

用console.log分析Vue原始碼

初始化階段

會對我們傳入datamethods等處理,便於後面階段的呼叫及一些功能的實現 如例子的dataname會被代理到vm例項上,所以我們可以用this.name呼叫

data() {
  return {
    name: '點我',
  }
}
複製程式碼

用console.log分析Vue原始碼

掛載階段

<div id="app">
  <div id="hi" @click="changeName">{{name}}</div>
</div>
複製程式碼

會將上面的html渲染成檢視(這裡麵包括渲染函式,虛擬dom的實現等)

用console.log分析Vue原始碼

更新階段

點選頁面上的文字時發生更新,這個過程包括:wathcer的觸發、patch演算法對比新舊vnode,更新dom

用console.log分析Vue原始碼

說明

具體的可以去看原始碼,在github上,覺得可以的話幫忙star一下

參考文章: Vue技術內幕 Vue.js 原始碼解析

相關文章