摘要:今天開始打算用個月的時間讀一些源碼,先從的開始吧。進入這個文件,它引用了來進行實例化。也就是初始化的核心代碼了。
今天開始打算用3個月的時間讀一些源碼,先從MVVM的vue開始吧。
vue是一個非常不錯的前端框架,不僅體積小,性能高,而且學習曲線非常平緩,很容易上手。官方文檔也很詳解,配套的構建工具很完事。還有很多第三方的組件和組件庫,可以讓開發者更高效的工作。
源碼是vue2.4.0版本。
項目結構在看源碼之前先分析下項目結構,對項目有一個比較全面的了解。
vue-dev項目結構
├── build --------------------------------- 構建相關文件 ├── dist ---------------------------------- 生成文件的輸出目錄 ├── examples ------------------------------ 一些vue使用的例子 ├── flow ---------------------------------- flow(Flow is a static type checker for your JavaScript code.)類型聲明 ├── package.json -------------------------- 依賴管理 ├── test ---------------------------------- 測試文件 ├── src ----------------------------------- 源碼 │ ├── compiler -------------------------- 編譯器代碼,template-->render function │ │ ├── parser ------------------------ 模板字符串轉-->抽象語法樹 │ │ ├── codegen ----------------------- 抽象語法樹(AST)-->render function │ │ ├── optimizer.js ------------------ 分析靜態樹,優化vdom渲染 │ ├── core ------------------------------ 核心代碼 │ │ ├── observer ---------------------- 雙向綁定,數據觀察的代碼 │ │ ├── vdom -------------------------- VNode對象&patch方法的代碼 │ │ ├── instance ---------------------- Vue構造函數相關的代碼 │ │ ├── global-api -------------------- Vue構造函數掛載全局方法(靜態方法)或屬性的代碼 │ │ ├── components -------------------- 通用組件 │ ├── server ---------------------------- SSR(server-side rendering)的代碼 │ ├── platforms ------------------------- 平臺相關代碼 │ ├── sfc ------------------------------- 對單文件組件進行解析 │ ├── shared ---------------------------- 通用代碼(util之類)vue的初始化
了解了大體的目錄結構之后,就從package.json開始看起了。在package.json文件里我們發現在執行npm run dev的時候,執行的下面這個腳本,也就是Target是web-full-dev
"scripts": { "dev": "rollup -w -c build/config.js --environment TARGET:web-full-dev", ... }
之后去build/config.js里去看看 web-full-dev是什么
"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 }
我們看到這個的入口文件是entry-runtime-with-compiler.js。進入這個文件,它引用了/src/platform/runtime/index--->/src/core/index--->/src/core/instance/index來進行實例化vue。
instance/index.js也就是vue初始化的核心代碼了。
//初始化入口 initMixin(Vue) //數據綁定,$watch方法 stateMixin(Vue) //事件方法,比如$on,$off,$emit eventsMixin(Vue) //生命周期方法 lifecycleMixin(Vue) //渲染方法,用來生成render function 和 VNode renderMixin(Vue)
initMixin方法
首選來具體看一下initMixin里做了什么
initLifecycle -- 定義$parent, $root, $children, $refs, _watch,
_inactive, _directInactive, _isMounted, _isDestroyed, _isBeingDestroyed給vue實例
initEvents -- 創建_events事件管理對象,$options._parentListeners監聽父組件listener
initRender --創建_vnode,_staticTrees,$slots,$scopedSlots,$createElement給vue實例
callHook(vm, "beforeCreate")--執行beforeCreate的鉤子方法
initState--
initProps--綁定props initMethods--綁定方法 initData-通過observe進行數據綁定, 給每一個data的屬性加上getter,setter.
callHook(vm, "created")--執行created的鉤子方法
vm.$mount(vm.$options.el) -- 通過el or template or render function 渲染dom
stateMixin方法
數據綁定 將$watch,$data,$props,$set,$delete加在Vue.prototype上
eventsMixin方法
初始化事件方法,定義$on,$off,$emit,$once到Vue.prototype上
lifecycleMixin方法
生命周期方法,定義_update,$forceUpdate,$destroy到Vue.prototype上
renderMixin方法
渲染方法,用來生成render function 和 VNode
有不足之處請指正,歡迎一起交流學習。
輪子工廠--一個分享優秀的vue,angular組件的網站
文章版權歸作者所有,未經允許請勿轉載,若此文章存在違規行為,您可以聯系管理員刪除。
轉載請注明本文地址:http://specialneedsforspecialkids.com/yun/87198.html
摘要:下面無恥的貼點源碼。啟動類我們也學,把啟動類抽象成兩層,方便以后寫客戶端。別著急,我們慢慢來,下一篇我們會了解以及他的成員,然后,完善我們的程序,增加其接收數據的能力。文章的源碼我會同步更新到我的上,歡迎大家,哈哈。 廢話兩句 這次更新拖了很長時間,第一是自己生病了,第二是因為最開始這篇想寫的很大,然后構思了很久,發現不太合適把很多東西寫在一起,所以做了點拆分,準備國慶前完成這篇博客。...
摘要:所以它與其他系列的文章并不沖突,完全可以在閱讀完這個系列后,再跟著其他系列的文章接著學習。如何閱讀我在寫系列的時候,被問的最多的問題就是該怎么閱讀源碼我想簡單聊一下自己的思路。感謝大家的閱讀和支持,我是冴羽,下個系列再見啦 前言 別名:《underscore 系列 8 篇正式完結!》 介紹 underscore 系列是我寫的第三個系列,前兩個系列分別是 JavaScript 深入系列、...
閱讀 3210·2021-11-24 09:39
閱讀 2939·2021-11-23 09:51
閱讀 898·2021-11-18 10:07
閱讀 3548·2021-10-11 10:57
閱讀 2749·2021-10-08 10:04
閱讀 3007·2021-09-26 10:11
閱讀 1052·2021-09-23 11:21
閱讀 2794·2019-08-29 17:28