Vue原始碼分析(流程分析)

2021-10-23 19:30:05 字數 3373 閱讀 5267

使用步驟

1.編寫 頁面 模板

1.直接在html標籤中寫

2.使用template

3.使用單檔案()

2.建立vue例項

1.在vue 的建構函式中:data,methods,computer,watcher,props,

...3.將vue掛載到頁面中(mount)

資料驅動模型

vue執行流程

1.獲得模板:模板中有『坑』

2.利用vue建構函式提供的資料來『填坑』,就可以得到頁面顯示的'標籤'了

3.替換原來有坑的標籤

vue 利用 我們提供的資料 和 頁面的 模板 生成了乙個新的html標籤(node元素),替換到了 頁面中 放置模板的位置

<

!doctype html>

"en"

>

"utf-8"

>

"viewport" content=

"width=device-width, initial-scale=1.0"

>

document<

/title>

<

/head>

>

}<

/h1>

<

/div>

<

/body>

//步驟拆解

//1.拿到模板

//2.拿到資料(data)

//3.將資料與模板結合 得到html(dom元素)

//4.放到頁面中

//1let template = document.

queryselector()

//2let data =

//3//將資料放到模板中

//遞迴

//在這個案例中 template 是dom

//在vue原始碼中是dom=>字串模板=>vnode=>真正的dom

function

complier

(template,data)

}let rex =

/\\}/g

let txt = childnodes[i]

.nodevalue //文字內容

//有沒有花括號

//replace 使用正則匹配一次 函式被呼叫一次

//函式的第0個引數 表示匹配到的內容

//函式的n個引數表示正則的第n組

txt = txt.

replace

(rex,

function

(_, g)

}return value

})//修改dom元素

childnodes[i]

.nodevalue = txt

}else

if(type ===1)

}}let gennode = template.

clonenode

(true

)//轉殖dom

//如果不轉殖 沒有生成新的template 這裡直接在頁面生成資料, dom是引用型別

//這樣做模板就沒了

console.

log(template)

complier

(gennode, data)

console.

log(gennode)

//4replacechild

//上面的思路有問題

使用的 虛擬dom

//2.只考慮了單屬性} vue 大量使用層級 (})

//3.**沒有整合

<

/script>

<

/html>

<

!doctype html>

"en"

>

"utf-8"

>

"viewport" content=

"width=device-width, initial-scale=1.0"

>

document<

/title>

<

/head>

>

}<

/h1>

<

/div>

<

/body>

function

complier

(template, data)

}let rex =

/\\}/g

let txt = childnodes[i]

.nodevalue //文字內容

txt = txt.

replace

(rex,

function

(_, g)

}return value

})//修改dom元素

childnodes[i]

.nodevalue = txt

}else

if(type ===1)

}}function

mvue

(options)

//將模板結合資料, 得到html 加到頁面

mvue.prototype.

render

=function()

//編譯 將模板與資料結合 得到真正dom

mvue.prototype.

complier

=function()

//更新 放到頁面

mvue.prototype.

update

=function

(real)

newmvue(}

})//使用『***.yyy』 來訪問物件

//就是用該字元中的路徑來訪問物件成員

function

getvaluebypath

(obj, path)

return res

}//vue原始碼實現方式的設計模式

//函式柯里化處理

//vue 編譯模板時生成

//模板=》抽象語法樹=》虛擬dom

// function creategetvaluebypath(path)

// return res

// }

// }

//通過這種處理,因為模板是不變的 所以我們每次使用 只需要傳入物件

//減少函式的呼叫 提公升效能

// let getvaluebypath = creategetvaluebypath('name.first')

// let res = getvaluebypath(obj)

<

/script>

<

/html>

Vue原始碼分析

在開始原始碼分析工作之前,我們在當前篇章做好相應的準備工作,以便更好地展開分析。將原始碼fork到自己的github倉庫中 git clone 自己的github vue 位址 dist 打包之後的結果 examples 示例 src compiler 編譯相關 core vue 核心庫 compo...

lucene update流程原始碼分析

update操作buffer到documentswriterdeletequeue裡,flush時處理deletes.documentswriterdeletequeue使用global deleteslice和dwpt deleteslice儲存deletes。dwpt deleteslice 用...

vue原始碼分析1

在vue的原始碼中使用的是es5的方法 prototype.slice.bind obj 來實現的 例如 已 為例 obj 定義屬性的物件 prop 定義或修改屬性的名稱 descriptor 將被定義或修改的屬性描述符 value 預設值 configurable 是否可以重新定義 enumera...