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