vue源碼目錄結(jié)構(gòu)

源碼目錄

├── scripts ------------------------------- 構(gòu)建相關(guān)的文件悔叽,一般情況下我們不需要?jiǎng)?│   ├── git-hooks ------------------------- 存放git鉤子的目錄
│   ├── alias.js -------------------------- 別名配置
│   ├── config.js ------------------------- 生成rollup配置的文件
│   ├── build.js -------------------------- 對 config.js 中所有的rollup配置進(jìn)行構(gòu)建
│   ├── ci.sh ----------------------------- 持續(xù)集成運(yùn)行的腳本
│   ├── release.sh ------------------------ 用于自動(dòng)發(fā)布新版本的腳本
├── dist ---------------------------------- 構(gòu)建后文件的輸出目錄
├── examples ------------------------------ 存放一些使用Vue開發(fā)的應(yīng)用案例
├── flow ---------------------------------- 類型聲明,使用開源項(xiàng)目 [Flow](https://flowtype.org/)
├── packages ------------------------------ 存放獨(dú)立發(fā)布的包的目錄
├── test ---------------------------------- 包含所有測試文件
├── src ----------------------------------- 這個(gè)是我們最應(yīng)該關(guān)注的目錄耕赘,包含了源碼
│   ├── compiler -------------------------- 編譯器代碼的存放目錄骄蝇,將 template 編譯為 render 函數(shù)
│   ├── core ------------------------------ 存放通用的,與平臺無關(guān)的代碼
│   │   ├── observer ---------------------- 響應(yīng)系統(tǒng)操骡,包含數(shù)據(jù)觀測的核心代碼
│   │   ├── vdom -------------------------- 包含虛擬DOM創(chuàng)建(creation)和打補(bǔ)丁(patching)的代碼
│   │   ├── instance ---------------------- 包含Vue構(gòu)造函數(shù)設(shè)計(jì)相關(guān)的代碼
│   │   ├── global-api -------------------- 包含給Vue構(gòu)造函數(shù)掛載全局方法(靜態(tài)方法)或?qū)傩缘拇a
│   │   ├── components -------------------- 包含抽象出來的通用組件
│   ├── server ---------------------------- 包含服務(wù)端渲染(server-side rendering)的相關(guān)代碼
│   ├── platforms ------------------------- 包含平臺特有的相關(guān)代碼九火,不同平臺的不同構(gòu)建的入口文件也在這里
│   │   ├── web --------------------------- web平臺
│   │   │   ├── entry-runtime.js ---------- 運(yùn)行時(shí)構(gòu)建的入口赚窃,不包含模板(template)到render函數(shù)的編譯器,所以不支持 `template` 選項(xiàng)岔激,我們使用vue默認(rèn)導(dǎo)出的就是這個(gè)運(yùn)行時(shí)的版本勒极。大家使用的時(shí)候要注意
│   │   │   ├── entry-runtime-with-compiler.js -- 獨(dú)立構(gòu)建版本的入口,它在 entry-runtime 的基礎(chǔ)上添加了模板(template)到render函數(shù)的編譯器
│   │   │   ├── entry-compiler.js --------- vue-template-compiler 包的入口文件
│   │   │   ├── entry-server-renderer.js -- vue-server-renderer 包的入口文件
│   │   │   ├── entry-server-basic-renderer.js -- 輸出 packages/vue-server-renderer/basic.js 文件
│   │   ├── weex -------------------------- 混合應(yīng)用
│   ├── sfc ------------------------------- 包含單文件組件(.vue文件)的解析邏輯虑鼎,用于vue-template-compiler包
│   ├── shared ---------------------------- 包含整個(gè)代碼庫通用的代碼
├── package.json -------------------------- 不解釋
├── yarn.lock ----------------------------- yarn 鎖定文件
├── .editorconfig ------------------------- 針對編輯器的編碼風(fēng)格配置文件
├── .flowconfig --------------------------- flow 的配置文件
├── .babelrc ------------------------------ babel 配置文件
├── .eslintrc ----------------------------- eslint 配置文件
├── .eslintignore ------------------------- eslint 忽略配置
├── .gitignore ---------------------------- git 忽略配置

對不同構(gòu)建版本的解釋

NPM 包的 dist/ 目錄你將會找到很多不同的 Vue.js 構(gòu)建版本辱匿。這里列出了它們之間的差別:

UMD CommonJS ES Module (基于構(gòu)建工具使用) ES Module (直接用于瀏覽器)
完整版 vue.js vue.common.js vue.esm.js vue.esm.browser.js
只包含運(yùn)行時(shí)版 vue.runtime.js vue.runtime.common.js vue.runtime.esm.js -
完整版 (生產(chǎn)環(huán)境) vue.min.js - - vue.esm.browser.min.js
只包含運(yùn)行時(shí)版 (生產(chǎn)環(huán)境) vue.runtime.min.js - - -

術(shù)語

  • 完整版:同時(shí)包含編譯器和運(yùn)行時(shí)的版本。

  • 編譯器:用來將模板字符串編譯成為 JavaScript 渲染函數(shù)的代碼炫彩。

  • 運(yùn)行時(shí):用來創(chuàng)建 Vue 實(shí)例匾七、渲染并處理虛擬 DOM 等的代碼〗ぃ基本上就是除去編譯器的其它一切昨忆。

  • UMD:UMD 版本可以通過 <script> 標(biāo)簽直接用在瀏覽器中。jsDelivr CDN 的 https://cdn.jsdelivr.net/npm/vue 默認(rèn)文件就是運(yùn)行時(shí) + 編譯器的 UMD 版本 (vue.js)杉允。

  • CommonJS:CommonJS 版本用來配合老的打包工具比如 Browserifywebpack 1邑贴。這些打包工具的默認(rèn)文件 (pkg.main) 是只包含運(yùn)行時(shí)的 CommonJS 版本 (vue.runtime.common.js)。

  • ES Module:從 2.6 開始 Vue 會提供兩個(gè) ES Modules (ESM) 構(gòu)建文件:

    • 為打包工具提供的 ESM:為諸如 webpack 2Rollup 提供的現(xiàn)代打包工具叔磷。ESM 格式被設(shè)計(jì)為可以被靜態(tài)分析拢驾,所以打包工具可以利用這一點(diǎn)來進(jìn)行“tree-shaking”并將用不到的代碼排除出最終的包。為這些打包工具提供的默認(rèn)文件 (pkg.module) 是只有運(yùn)行時(shí)的 ES Module 構(gòu)建 (vue.runtime.esm.js)改基。

    • 為瀏覽器提供的 ESM (2.6+):用于在現(xiàn)代瀏覽器中通過 <script type="module"> 直接導(dǎo)入繁疤。

package.json

image.png
  • main對應(yīng)的cjs模塊
  • module對應(yīng)的是es模塊
{
  "scripts": {
    "dev": "rollup -w -c scripts/config.js --environment TARGET:web-full-dev",
    "dev:cjs": "rollup -w -c scripts/config.js --environment TARGET:web-runtime-cjs",
    "dev:esm": "rollup -w -c scripts/config.js --environment TARGET:web-runtime-esm",
    "dev:test": "karma start test/unit/karma.dev.config.js",
    "dev:ssr": "rollup -w -c scripts/config.js --environment TARGET:web-server-renderer",
    "dev:compiler": "rollup -w -c scripts/config.js --environment TARGET:web-compiler ",
    "dev:weex": "rollup -w -c scripts/config.js --environment TARGET:weex-framework",
    "dev:weex:factory": "rollup -w -c scripts/config.js --environment TARGET:weex-factory",
    "dev:weex:compiler": "rollup -w -c scripts/config.js --environment TARGET:weex-compiler ",
    "build": "node scripts/build.js",
    "build:ssr": "npm run build -- web-runtime-cjs,web-server-renderer",
    "build:weex": "npm run build -- weex",
    "commit": "git-cz"
  },
}

package.jsonscript字段,有不同版本的構(gòu)建命令寥裂。以"build": "node scripts/build.js"為入口嵌洼,找到構(gòu)建腳本build.js

找到vue構(gòu)造函數(shù)在/src/core/instance/index.js這個(gè)文件中

import { initMixin } from './init'
import { stateMixin } from './state'
import { renderMixin } from './render'
import { eventsMixin } from './events'
import { lifecycleMixin } from './lifecycle'
import { warn } from '../util/index'

function Vue (options) {
  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)
}

initMixin(Vue)
stateMixin(Vue)
eventsMixin(Vue)
lifecycleMixin(Vue)
renderMixin(Vue)

export default Vue

實(shí)例一個(gè)vue對象是通過new操作符new Vue()完成的,構(gòu)造函數(shù)如果不是通過new操作符調(diào)用的話會給出警告??封恰。最后調(diào)用了內(nèi)置函數(shù)_init(options)麻养,這個(gè)函數(shù)在initMixin中定義

  • initMixin(Vue)
export function initMixin (Vue: Class<Component>) {
  Vue.prototype._init = function (options?: Object) {
    ...
  }
}
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市诺舔,隨后出現(xiàn)的幾起案子鳖昌,更是在濱河造成了極大的恐慌,老刑警劉巖低飒,帶你破解...
    沈念sama閱讀 212,454評論 6 493
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件许昨,死亡現(xiàn)場離奇詭異,居然都是意外死亡褥赊,警方通過查閱死者的電腦和手機(jī)糕档,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,553評論 3 385
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來拌喉,“玉大人速那,你說我怎么就攤上這事俐银。” “怎么了端仰?”我有些...
    開封第一講書人閱讀 157,921評論 0 348
  • 文/不壞的土叔 我叫張陵捶惜,是天一觀的道長。 經(jīng)常有香客問我荔烧,道長吱七,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 56,648評論 1 284
  • 正文 為了忘掉前任鹤竭,我火速辦了婚禮踊餐,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘诺擅。我一直安慰自己市袖,他們只是感情好啡直,可當(dāng)我...
    茶點(diǎn)故事閱讀 65,770評論 6 386
  • 文/花漫 我一把揭開白布烁涌。 她就那樣靜靜地躺著,像睡著了一般酒觅。 火紅的嫁衣襯著肌膚如雪撮执。 梳的紋絲不亂的頭發(fā)上捆愁,一...
    開封第一講書人閱讀 49,950評論 1 291
  • 那天槐臀,我揣著相機(jī)與錄音,去河邊找鬼鼎天。 笑死颜凯,一個(gè)胖子當(dāng)著我的面吹牛谋币,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播症概,決...
    沈念sama閱讀 39,090評論 3 410
  • 文/蒼蘭香墨 我猛地睜開眼蕾额,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了彼城?” 一聲冷哼從身側(cè)響起诅蝶,我...
    開封第一講書人閱讀 37,817評論 0 268
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎募壕,沒想到半個(gè)月后调炬,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 44,275評論 1 303
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡舱馅,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,592評論 2 327
  • 正文 我和宋清朗相戀三年缰泡,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片代嗤。...
    茶點(diǎn)故事閱讀 38,724評論 1 341
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡棘钞,死狀恐怖照棋,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情武翎,我是刑警寧澤烈炭,帶...
    沈念sama閱讀 34,409評論 4 333
  • 正文 年R本政府宣布,位于F島的核電站宝恶,受9級特大地震影響符隙,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜垫毙,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 40,052評論 3 316
  • 文/蒙蒙 一霹疫、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧综芥,春花似錦丽蝎、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,815評論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至额各,卻和暖如春国觉,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背虾啦。 一陣腳步聲響...
    開封第一講書人閱讀 32,043評論 1 266
  • 我被黑心中介騙來泰國打工麻诀, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人傲醉。 一個(gè)月前我還...
    沈念sama閱讀 46,503評論 2 361
  • 正文 我出身青樓蝇闭,卻偏偏與公主長得像,于是被迫代替她去往敵國和親硬毕。 傳聞我的和親對象是個(gè)殘疾皇子呻引,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 43,627評論 2 350

推薦閱讀更多精彩內(nèi)容

  • Vue版本:2.6.9 源碼結(jié)構(gòu)圖 Vue 不同的構(gòu)建版本對比 術(shù)語解釋 完整版:同時(shí)包含編譯器和運(yùn)行時(shí)的版本。 ...
    一枚蛋閱讀 721評論 0 1
  • 源碼結(jié)構(gòu)圖 不同的構(gòu)建版本對比 xxUMDCommonJSES Module (基于構(gòu)建工具使用)ES Modul...
    莫伊劍客閱讀 209評論 0 0
  • 目錄結(jié)構(gòu) Vue的不同構(gòu)建版本 通過npm run build 打包出所有版本的文件 通過 dist/READMe...
    小妹呀閱讀 297評論 0 0
  • 基于vue 2.6.11 目錄結(jié)構(gòu) 打包版本 UMDCommonJSES Module完整版vue.jsvue.c...
    Lisa_Guo閱讀 239評論 0 0
  • 目錄結(jié)構(gòu) 對于目錄結(jié)構(gòu)并不需要在看到描述后就完完全全知道所有文件的作用昭殉,剛開始知道個(gè)大概苞七,在源碼解析的過程中慢慢去...
    Ang_e閱讀 308評論 0 1