vue源碼入口文件實例分析
本文主要介紹了vue源碼入口文件分析(推薦),小編覺得挺不錯的,現在分享給大家,也給大家做個參考。一起跟著小編過來看看吧,希望能幫助大家。
開發vue專案有一段時間了, 之前用angularjs 後來用reactjs 但是那時候一直沒有時間把自己看源碼的思考記錄下來,現在我不想再浪費這來之不易的思考,我要堅持! !
看原始碼我個人感覺很開心,每每看上一段,自己就充實許多,不知道你是否跟我一樣。
vue 原始碼是眾多module(模組)用 rollup 工具合併而成, 從package.json 中能夠看到。現在讓我們從github上下載vue項目,開始我們今天的「思考」。
我下載的原始碼版本是:"version": "2.5.7",
原始碼起始位置從這裡可以看到
"dev": "rollup -w -c build/config.js --environment TARGET:web-full-dev" // 从build/config.js 中找到 TARGET: web-full-dev 这是运行和编译(支持现在的浏览器,由于里面大量应用了ES6-7)后的 // Runtime+compiler development build (Browser) 'web-full-dev': { entry: resolve('web/entry-runtime-with-compiler.js'), dest: resolve('dist/vue.js'), format: 'umd', env: 'development', alias: { he: './entity-decoder' }, banner },
找到了開始檔案就是"web/entry-runtime-with-compiler.js", 然後我們一路找Vue 物件終於在「instance/index.js」中找到了:
// 这是Vue 的开始位置 function Vue (options) { // 判断如果是不是生产环境,且不是通过new关键字来创建对象的话,就在控制台打印一个warning if (process.env.NODE_ENV !== 'production' && !(this instanceof Vue) ) { warn('Vue is a constructor and should be called with the `new` keyword') } this._init(options) }
看似到這裡都結束了,因為我們目的就是找到開始位置,但我有個疑問,為什麼Vue需要這麼多層?
entry-runtime-with-compiler.js -> runtime/index.js -> core/index.js -> instance/index.js
當我仔細看了原始碼後恍然大悟,我們先看看他們這些檔案都做了什麼:
(1)instance/index.js
從Vue 模組命名中能看出一些端倪, instance (實例) 。
這個檔案是Vue 物件的開始,同時也是Vue 原型鏈(prototype) 方法的集中檔案
// _init initMixin(Vue) // $set、$delete、$watch stateMixin(Vue) // $on、$once、$off、$emit eventsMixin(Vue) // _update、$forceUpdate、$destroy lifecycleMixin(Vue) // $nextTick、_render、以及多个内部调用的方法 renderMixin(Vue)
這些方法只有實例化了才能調用。
(2)core/index.js
這個檔案在Instance/index.js 建立和初步加工後,再次加工。 那他主要做了什麼呢? 我們不考慮運行環境
initGlobalAPI(Vue)
對,就呼叫了這個方法,很簡單明了吧--- "初始化全域介面",
讓我們走進initGlobalAPI 方法
export function initGlobalAPI (Vue: GlobalAPI) { // config const configDef = {} configDef.get = () => config // 在 非生产环境,如何修改了配置文件config里面的内容会提示警告 if (process.env.NODE_ENV !== 'production') { configDef.set = () => { warn( 'Do not replace the Vue.config object, set inpidual fields instead.' ) } } // 定义config 属性, 监听变化 Object.defineProperty(Vue, 'config', configDef) // exposed util methods. // NOTE: these are not considered part of the public API - avoid relying on // them unless you are aware of the risk. Vue.util = { warn, extend, mergeOptions, defineReactive } Vue.set = set Vue.delete = del Vue.nextTick = nextTick Vue.options = Object.create(null) // 给vue 创建 ASSET_TYPES 的 空对象 ASSET_TYPES.forEach(type => { Vue.options[type + 's'] = Object.create(null) }) // this is used to identify the "base" constructor to extend all plain-object // components with in Weex's multi-instance scenarios. Vue.options._base = Vue extend(Vue.options.components, builtInComponents) // Vue.use initUse(Vue) // Vue.mixin initMixin(Vue) // Vue.extend initExtend(Vue) // Vue.component, Vue.directive, Vue.filter initAssetRegisters(Vue) }
這裡面基本上都是靜態方法,即:用Vue. xxx 的形式呼叫。
(3)runtime/index.js
這裡就加一些擴充和在Vue.prototype上加入了__patch__和$mount(掛載元素) 。
// Vue.options.directives(model和show)和 Vue.options.components(Transition和TransitionGroup) extend(Vue.options.directives, platformDirectives) extend(Vue.options.components, platformComponents) // install platform patch function Vue.prototype.__patch__ = inBrowser ? patch : noop // public mount method Vue.prototype.$mount = function ( el?: string | Element, hydrating?: boolean ): Component { el = el && inBrowser ? query(el) : undefined return mountComponent(this, el, hydrating) }
(4)entry-runtime-with-compiler.js
就乾了一件事就是重寫$mount, Vue依不同運行環境,重寫不同$mount
const mount = Vue.prototype.$mount Vue.prototype.$mount = function ( el?: string | Element, hydrating?: boolean ): Component { ... return mount.call(this, el, hydrating) }
總結:
到此我們找到了開始執行的文件,和每個文件有什麼用,具體怎麼做的,做了什麼我會下次再寫。不過我們剛開始不要太在乎每個細節,不要再搞懂每一行程式碼,如果那樣,真的太累了,而且可能沒有勇氣堅持下去。
相關推薦:
以上是vue源碼入口文件實例分析的詳細內容。更多資訊請關注PHP中文網其他相關文章!

熱AI工具

Undresser.AI Undress
人工智慧驅動的應用程序,用於創建逼真的裸體照片

AI Clothes Remover
用於從照片中去除衣服的線上人工智慧工具。

Undress AI Tool
免費脫衣圖片

Clothoff.io
AI脫衣器

Video Face Swap
使用我們完全免費的人工智慧換臉工具,輕鬆在任何影片中換臉!

熱門文章

熱工具

記事本++7.3.1
好用且免費的程式碼編輯器

SublimeText3漢化版
中文版,非常好用

禪工作室 13.0.1
強大的PHP整合開發環境

Dreamweaver CS6
視覺化網頁開發工具

SublimeText3 Mac版
神級程式碼編輯軟體(SublimeText3)

開啟微信,在我中選擇設置,選擇通用後選擇儲存空間,在儲存空間選擇管理,選擇要恢復檔案的對話選擇感嘆號圖示。教學適用型號:iPhone13系統:iOS15.3版本:微信8.0.24解析1先開啟微信,在我的頁面中點選設定選項。 2接著在設定頁面中找到並點選通用選項。 3然後在通用頁面中點選儲存空間。 4接下來在儲存空間頁面中點選管理。 5最後選擇要恢復檔案的對話,點選右側的感嘆號圖示。補充:微信文件一般幾天過期1要是微信接收的文件並沒有點開過的情況下,那在七十二鐘頭之後微信系統會清除掉,要是己經查看了微信

在Windows系統中,照片應用程式是一個方便的方式來檢視和管理照片和影片。透過這個應用程序,用戶可以輕鬆存取他們的多媒體文件,而無需安裝額外的軟體。然而,有時用戶可能會碰到一些問題,例如在使用照片應用程式時遇到「無法開啟此文件,因為不支援該格式」的錯誤提示,或在嘗試開啟照片或影片時出現文件損壞的問題。這種情況可能會讓使用者感到困惑和不便,需要進行一些調查和修復來解決這些問題。當用戶嘗試在Photos應用程式上開啟照片或影片時,會看到以下錯誤。抱歉,照片無法開啟此文件,因為目前不支援該格式,或該文件

在本文中,我們將介紹如何解決在Windows系統中刪除檔案或資料夾時出現「準備刪除」提示的問題。這個提示意味著系統正在進行一些背景操作,例如檢查檔案權限、驗證檔案是否被其他程式佔用、計算要刪除項目的大小等。我們將為您提供一些解決方法,以確保您能夠順利刪除文件,而無需等待太長時間。為什麼Windows要花這麼長時間才能刪除檔案? Windows準備刪除檔案所需的時間受多種因素影響,包括檔案大小、儲存裝置速度和後台進程。長時間或被卡住的「正在準備刪除」提示可能暗示系統資源不足、磁碟錯誤或檔案系統問題。在

gho檔案是一種GhostImage影像文件,它通常用於將整個硬碟或分割區的資料備份成一個檔案。在一些特定的情況下,我們需要將這種gho檔案重新安裝回硬碟上,以還原硬碟或分割區到先前的狀態。下面將介紹gho檔案的安裝方法。首先,在安裝之前,我們需要準備以下工具和材料:實體的gho文件:確保你擁有一份完整的gho文件,它通常以.gho為後綴名,並且包含有備份

Tmp格式檔案是一種暫存檔案格式,通常由電腦系統或程式在執行過程中產生。這些文件的目的是儲存臨時數據,以幫助程式正常運行或提高效能。一旦程式執行完成或電腦重啟,這些tmp檔案往往就沒有了存在的必要性。所以,對於Tmp格式檔案來說,它們本質上是可以刪除的。而且,刪除這些tmp檔案能夠釋放硬碟空間,確保電腦的正常運作。但是,在刪除Tmp格式檔案之前,我們需

192.168.0.1入口登入方法為:在瀏覽器的網址列輸入http://192.168.0.1。解析1168.0.1入口登入方法為:在瀏覽器的網址列輸入http://192.168.0.1,輸入帳號密碼後就可以進入到一個頁面,並對相關重要網路參數進行設定或變更。這個網址一般是騰達、思科、友訊,領勢等品牌路由器的登入頁面。如果輸入後無法進入管理介面的話,則表示位址是錯誤的。補充:192.168.0.1是什麼意思1168.0.1是一個C類的私有IP位址,簡單一點來說192.168.0.1是一個IP地

在電腦中刪除或解壓縮資料夾,時有時會彈出提示對話框“錯誤0x80004005:未指定錯誤”,如果遇到這中情況應該怎麼解決呢?提示錯誤碼0x80004005的原因其實很多,但大部分因為病毒導致,我們可以重新註冊dll來解決問題,下面,小編給大夥講解0x80004005錯誤代碼處理經驗。有使用者在使用電腦時出現錯誤代碼0X80004005的提示,0x80004005錯誤主要是由於電腦沒有正確註冊某些動態連結庫文件,或電腦與Internet之間存在不允許的HTTPS連接防火牆所引起。那麼如何

檔案路徑是作業系統中用於識別和定位檔案或資料夾的字串。在檔案路徑中,常見的有兩種符號分隔路徑,即正斜線(/)和反斜線()。這兩個符號在不同的作業系統中有不同的使用方式和意義。正斜線(/)是Unix和Linux系統中常用的路徑分隔符號。在這些系統中,檔案路徑是以根目錄(/)為起始點,每個目錄之間使用正斜線進行分隔。例如,路徑/home/user/Docume
