摘要:其中執(zhí)行命令是我們當(dāng)前所關(guān)注的,對于項(xiàng)目的文件結(jié)構(gòu),我們需要去找到項(xiàng)目的啟動的入口文件,接下來我們?nèi)ヒ徊揭徊降恼业椒治雒钍且粋€模塊打包器。
打算開始學(xué)習(xí)vue的源碼開始,我開始 serach 關(guān)鍵詞:vue 源碼,可是發(fā)現(xiàn)很多都不是我想要看到的東西,所以打算記錄下來,學(xué)習(xí)的記錄和日后分享。我在想這個文章的名字時,手把手系列?十分鐘系列?小白到大佬系列?都不是,只是單純的學(xué)習(xí)筆記文件結(jié)構(gòu)
當(dāng)我從 github 上 clone Vue 源碼后,我看到很多熟悉的文件夾命名,以及配置文件,但對于我個小菜雞,我還是想整體了解一下每個文件夾的內(nèi)容,然后再去深挖~
有些我自己現(xiàn)在還不是很懂的后續(xù)再補(bǔ)上~
├─benchmarks ├─dist 打包后文件目錄 ├─examples 部分示例 ├─flow 聲明靜態(tài)類型 ├─packages vue可被分成的其他npm包 │ ├─vue-server-renderer │ ├─vue-template-compiler │ ├─weex-template-compiler │ └─weex-vue-framework ├─scripts ├─src 主要源碼 │ ├─compiler │ ├─core 核心代碼 │ ├─platforms 平臺相關(guān)內(nèi)容 │ ├─server 服務(wù)端渲染相關(guān) │ ├─sfc │ └─shared ├─test 測試用例 └─types 類型定義 └─test從入口文件開始
首先,我們拿到一個文件后,我們應(yīng)該養(yǎng)成習(xí)慣去查看項(xiàng)目根目錄下的package.json文件。文件的基本構(gòu)成:項(xiàng)目名稱、版本、描述、執(zhí)行命令、項(xiàng)目依賴等。
其中執(zhí)行命令 script是我們當(dāng)前所關(guān)注的,對于項(xiàng)目的文件結(jié)構(gòu),我們需要去找到項(xiàng)目的啟動的入口文件,接下來我們?nèi)ヒ徊揭徊降恼业?strong>vue
"scripts": { "dev": "rollup -w -c scripts/config.js --environment TARGET:web-full-dev" }
rollup是一個 JavaScript 模塊打包器。感興趣的話可以去具體的研究,這里我們不做具體的探究。那我們知道這里它存在的作用就是對js進(jìn)行打包處理。
我們來具體看一下這個命令的含義:
-w watch 監(jiān)聽源文件是否有改動,有改動重新打包
-c config 使用配置文件 scripts/config.js
--environment 傳遞給配置文件的環(huán)境變量,這里傳遞的是目標(biāo)文件 TARGET
根據(jù)以上,我們可以得知,該命令為使用 scripts/config.js中的配置文件去打包 TARGET:web-full-dev,我們想知道這個targt 具體指的是什么,我們需要去看一下config配置文件
層層遞進(jìn)1.scriptsconfig.js 中我們可以找到,最下方為該文件的js執(zhí)行部分,其中先去判斷了我們所傳入的Target,然后調(diào)用了genConfig
// 判斷傳入的環(huán)境變量 if (process.env.TARGET) { module.exports = genConfig(process.env.TARGET) }
2.我們繼續(xù)往上看,genconfig根據(jù)函數(shù)名我們可以得知,為獲取config這樣的一個功能,Target為傳入的name,文件的上方定義了 builds,一個屬性對應(yīng)一個Target*,這樣我們可以找到我們專注的web-full-dev
// builds 對象,屬性名對應(yīng)Target const builds = { // ... // 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 } // ... } // ... // 這里傳入的name 就是Target function genConfig (name) { const opts = builds[name] // ... other config }
從上可以看出,我們需要的是入口文件即entry中對應(yīng)的web/entry-runtime-with-compiler.js
3.打開entry-runtime-with-compiler.js, 在文件上方,我們可以看到這個文件中import Vue,我們所需要的是去追根到Vue的起始,所以就找到了上一層runtime/index
// 引入了Vue的實(shí)例 import Vue from "./runtime/index"
4.打開上一步我們找到的src/platforms/web/runtime/index.js 文件,第一行就引入了import Vue from "core/index"
沒關(guān)系我們繼續(xù),酒香不怕巷子深
5.srccoreindex.js
// 又一次是引入了Vue的實(shí)例 import Vue from "./instance/index"
6.src/core/instanceindex.js,驚喜~ ,在這里我們找到了Vue的構(gòu)造函數(shù),構(gòu)造函數(shù)中僅調(diào)用了init方法,_init方法哪里來的呢,當(dāng)然是文件下方在Vue原型上綁定的方法,接下來我們會以一個的去
// Vue的構(gòu)造函數(shù) function Vue (options) { //... 驗(yàn)證環(huán)境 this._init(options) } // 在Vue原型上綁定實(shí)例方法 initMixin(Vue) // init stateMixin(Vue) // $set $delete $watch eventsMixin(Vue) // $on $once $off $emit lifecycleMixin(Vue) // _update $forceUpdate $destroy renderMixin(Vue) // $nextTick _render總結(jié)
綜上,小結(jié)一下追根過程
package.json --> scripts/config.js --> web/entry-runtime-with-compiler.js --> src/platforms/web/runtime/index.js --> src/core/index.js --> src/core/instance/index.js
下一篇 :Vue源碼學(xué)習(xí)(二)——從宏觀看Vue
文章版權(quán)歸作者所有,未經(jīng)允許請勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請注明本文地址:http://systransis.cn/yun/99792.html
摘要:關(guān)于有人說我用刪除這個屬性不就好了之后打印發(fā)現(xiàn)它還是一只哈士奇。如下的解釋如下操作符會從某個對象上移除指定屬性。 javascript-Object-Property ? javascript-對象的屬性的延伸學(xué)習(xí) showImg(https://segmentfault.com/img/bVNH2S?w=640&h=640); 前言 在學(xué)習(xí)vue數(shù)據(jù)綁定的較底層原理時,被setter...
摘要:一周有天,返回的數(shù),如果上月最后一天是星期二,看下的日歷是補(bǔ)了三天,我們得到的是,所以為此,之后就是填充最后一天,用處理一下再排序,上一個月的數(shù)據(jù)就得到了。 每天進(jìn)步一點(diǎn)點(diǎn)。寫個簡單的小日歷,依舊用vue,方便 完成圖 showImg(https://segmentfault.com/img/bVZoWs?w=416&h=495); 思路 本月的天數(shù) 截取上月的天數(shù) 截取下月天數(shù) 今...
摘要:哪吒別人的看法都是狗屁,你是誰只有你自己說了才算,這是爹教我的道理。哪吒去他個鳥命我命由我,不由天是魔是仙,我自己決定哪吒白白搭上一條人命,你傻不傻敖丙不傻誰和你做朋友太乙真人人是否能夠改變命運(yùn),我不曉得。我只曉得,不認(rèn)命是哪吒的命。 showImg(https://segmentfault.com/img/bVbwiGL?w=900&h=378); 出處 查看github最新的Vue...
摘要:學(xué)習(xí)源碼時,我們首先需要看的是文件,該文件里配置了的依賴以及開發(fā)環(huán)境和生產(chǎn)環(huán)境的編譯的啟動腳本等其他信息。一個是完整版,一個是運(yùn)行時。運(yùn)行時用來創(chuàng)建實(shí)例渲染并處理虛擬等的代碼。基本上就是除去編譯器的其它一切。 學(xué)習(xí)vue源碼時,我們首先需要看的是package.json文件,該文件里配置了vue的依賴以及開發(fā)環(huán)境和生產(chǎn)環(huán)境的編譯的啟動腳本等其他信息。首先我們需要關(guān)注的是script。我...
摘要:框架使用了作為類型檢查,來保證項(xiàng)目的可讀性和維護(hù)性。的主目錄下有的配置文件,還有目錄,指定了各種自定義類型。表示構(gòu)建出來的文件遵循規(guī)范。 Flow vue框架使用了Flow作為類型檢查,來保證項(xiàng)目的可讀性和維護(hù)性。vue.js的主目錄下有Flow的配置.flowconfig文件,還有flow目錄,指定了各種自定義類型。 在學(xué)習(xí)源碼前可以先看下Flow的語法 官方文檔 目錄結(jié)構(gòu) vue....
閱讀 1801·2023-04-26 00:20
閱讀 1851·2021-11-08 13:21
閱讀 2049·2021-09-10 10:51
閱讀 1606·2021-09-10 10:50
閱讀 3334·2019-08-30 15:54
閱讀 2161·2019-08-30 14:22
閱讀 1457·2019-08-29 16:10
閱讀 3119·2019-08-26 11:50