Vue原始碼 一

2021-10-08 10:34:11 字數 4321 閱讀 7120

很多人想看原始碼,但是不知道從哪一塊下手,所以這裡我說一下我是怎麼找入口的。

首先dist資料夾中有vue.js,這是已經被打包好的js檔案,src中的所有js**都合併到了這裡,我們直接去看這個vue.js肯定是會懵逼的,1w多行跳來跳去的,所以我們是不是要找到打包的入口?

那麼讓我們進入到scripts資料夾,因為這是打包的相關配置資料夾

我們這裡先看build.js

看10行左右的這裡 可以看到引入了config.js中所有的配置

// 把同級目錄下config的所有建立配置匯入

let builds =

require

('./config').

getallbuilds

()

27行左右開始遞迴打包

// 開始打包

build

(builds)

既然引入了配置,那我們就要進入到config.js看配置了

看38行左右

// dist目錄中各種打包方式的定義

const builds =

//裡面是各種打包方式配置

我們這裡可以直接ctrl+f搜尋vue.js,找到dest中為vue.js的那個打包配置

這樣就來到了120行左右

// 瀏覽器要跑的版本

// runtime+compiler development build (browser)

'web-full-dev':,

banner

},

可以看到輸出為dist下面的vue.js,那麼入口函式當然就是web/entry-runtime-with-compiler.js

顯然,這個web是乙個別名,我們可以通過alias.js去查詢這個別名對應的目錄

進入alias.js

可以在第10行看到

web:

resolve

('src/platforms/web'

),

web別名對應著src/platforms/web

那麼入口函式的路徑已經出來了src/platforms/web/entry-runtime-with-compiler.js

接下來我們根據路徑開啟這個js檔案

路徑:vue-2.6.9\src\platforms\web\entry-runtime-with-compiler.js

這次分享就分析這乙個js檔案

將其幾個**塊摺疊一下,可以看到這檔案其實也就3個函式:

這裡是不是就遇到了我們平時見到的$mount,那我們就從這個$mount開始分析

// 擴充套件$mount 儲存老的$mount 老的$mount也會執行以前的操作

const mount = vue.prototype.$mount

// 進行的新的mount操作

vue.prototype.

$mount

=function

(// 傳入el,也就是掛載的元素節點

el?: string | element,

// todo: 等待分析 涉及服務端渲染

hydrating?

: boolean

): component

// 獲取配置的一些選項,也就是render template el那些

// 可從**中得到一些選項的優先順序:render>template>el

const options =

this

.$options

// resolve template/el and convert to render function

// 如果不存在render函式,就將template/el的設定轉換為render函式

// render優先順序非常高了,這些操作都是在沒有render的情況下進行的if(

!options.render)`,

this)}

}}else

if(template.nodetype)

else

return

this

}// 如果template不存在,獲取el

}else

if(el)

// 這裡對拿到的template進行編譯

if(template)

// 如果是模板字串,需要編譯器去編譯 也就是進入compiletofunctions這個函式

// 可以通過這個函式檢視編譯器的工作機制,也就是把template轉換為render:todo

const

=compiletofunctions

(template,

,this

)// 賦值給當前選項的render

options.render = render

options.staticrenderfns = staticrenderfns

/* istanbul ignore if */

if(process.env.

node_env

!=='production'

&& config.performance && mark)

compile`

,'compile'

,'compile end')}

}}// 執行老mount的操作 正常的掛載渲染過程

return mount.

call

(this

, el, hydrating)

}

很多解釋已經在**裡敲好了,這裡總結一下:

首先會儲存老的$mount,然後進入函式,獲取el和options

判斷options.render是否存在,如果存在直接執行老$mount,中途那些東西都是在options.render不存在時執行的,因此可以看出render的優先順序非常高了

然後當options.render不存在時,就會先判斷template,再判斷el,優先順序由此可見:render>template>el

當然template還會被compile解析,這裡先留個todo,之後再去看compile是怎麼將template轉化為render函式的

這是我畫的乙個賊醜的圖,描述了一些過程

路徑:當前目錄

// 根據id查詢到el 並返回innerhtml

const idtotemplate =

cached

(id =>

)

路徑:當前目錄

// 獲取包括標籤的內容

function

getouterhtml

(el: element)

: string

else

}

路徑:vue-2.6.9\src\platforms\web\util\index.js

/* @flow */

import

from

'core/util/index'

export

*from

'./attrs'

export

*from

'./class'

export

*from

'./element'

/** * query an element selector if it's not an element already.

*/export

function

query

(el: string | element)

: element

// 返回獲取到的節點

return selected

}else

}

總結一下:這個入口函式,最主要的還是實現了$mount這乙個函式。

下一次分享,我們將進入到vue初始化的那裡去探索,當然也是通過這個入口檔案去找到。怎麼去找到vue初始化那裡,先留個懸念在這。

vue原始碼閱讀(一)

之前想要研究下vue的原始碼 網上一般直接就上來甩出雙向繫結等等的函式 這次看原始碼 想從乙個漸進式的方向來解讀。當前版本基本上是最新的版本,18年6月的最新版,版本號是2.5.17 當我們接觸乙個專案或者乙個框架 在沒有交接文件的情況下 首先第一印象是啥?肯定是目錄 通過查資料和看 基本確定了這些...

vue2 0原始碼學習一(vue原始碼構建過程)

前提知識背景 vue.js的打包構建是基於rollup進行的 1.開啟專案的package.json,在裡面可以看到很多配置項以及命令,今天先學習 的構建,需要關注下圖地方 這裡使用的build命令就是平時在使用vue cli打包的時候觸發的命令,可以看到它其實是執行了乙個node程式,執行scri...

Vue原始碼解讀(二) Vue原始碼構建

vue.js 原始碼是基於 rollup 構建的,它的構建相關配置都在 scripts 錄下。通常 個基於 npm 託管的項 都會有 個 package.json 件,它是對項 的描述 件,它的內容實際上是 個標準的 json 物件。我們通常會配置 script 字段作為 npm 的執 指令碼,vu...