閱讀Vue源碼--前置知識

Flow
  • 認(rèn)識 Flow

    JavaScript 靜態(tài)類型檢查器肤无,vue 源碼利用 Flow 做靜態(tài)類型檢查

  • 為什么用 Flow

    js 動態(tài)類型語言春叫,類型檢查發(fā)展趨勢酱塔,在編譯期盡早發(fā)現(xiàn) bug,不影響代碼運(yùn)行改鲫,使編寫 js 有強(qiáng)類型語言的體驗(yàn)

  • FLow 工作方式

    • 類型推斷:通過變量的使用上下文推斷變量類型,更具推斷來檢查類型

      // Flow
      function split(str) {
        return str.split('')
      }
      
      split(11)
      // Flow檢查報(bào)錯(cuò),split期待的參數(shù)使字符串铭拧,而不是數(shù)字
      
    • 類型注釋:事先注釋好期待的類型,F(xiàn)low 會基于這些注釋來判斷

      // Flow
      function add(x: number, y: number): number {
        return x + y
      }
      
      add('Hello', 11)
      // 類型推斷不需要編寫類型注釋 特定場景需要類型注釋提供更明確的檢查
      
  • Flow 在 Vue.js 源碼的應(yīng)用

    第三方庫或自定義類型 Flow 并不認(rèn)識恃锉,檢查時(shí)報(bào)錯(cuò)搀菩,因此 FLow 提出 libdef 用來識別,在 Vue.js 主目錄下有.flowconfig 文件破托,這里的[libs]配置的是 flow肪跋,表示指定的庫定義都在 flow 文件夾內(nèi),閱讀源碼時(shí)土砂,遇到某個(gè)類型可以在這里查看數(shù)據(jù)結(jié)構(gòu)的定義

Vue 源碼目錄
src
├─compiler 編譯相關(guān)
├─core Vue 核心庫
├─platforms 平臺相關(guān)代碼
├─server SSR澎嚣,服務(wù)端渲染
├─sfc .vue 文件編譯為 js 對象
└─shared 公共的代碼
  • compiler

    包含 Vue.js 所有編譯相關(guān)的代碼,將模板解析為 ast 語法樹瘟芝,ast 語法樹優(yōu)化易桃,代碼生成等

    編譯工作推薦在構(gòu)建時(shí)做(借助 webPack、vue-loader 等輔助插件)

  • core

    Vue.js 核心代碼锌俱,包括內(nèi)置組件晤郑、全局 API 封裝、Vue 實(shí)例化贸宏、觀察者造寝、虛擬 DOM、工具函數(shù)等

  • platform

    Vue.js 是跨平臺的 MVVM 框架吭练,可在 web 和 native 客戶端上诫龙,platform 是 Vue.js 的入口,2 個(gè)目錄代表 2 個(gè)主要入口鲫咽,分別打包成運(yùn)行在 web 和 weex 上的 Vue.js

  • server

    服務(wù)端渲染相關(guān)邏輯签赃,主要是泡在服務(wù)端的 node.js

  • sfc

    將單文件組件解析冊成 javaScript 對象

  • shared

    瀏覽器端和服務(wù)端所共享的工具方法

Vue 源碼調(diào)試設(shè)置
  • 打包工具 Rollup

    • Vue.js 源碼的打包工具使用的是 Rollup,比 Webpack 輕量
    • Webpack 把所有文件當(dāng)做模塊分尸,Rollup 只處理 js 文件更適合在 Vue.js 這樣的庫中使用
    • Rollup 打包不會生成冗余的代碼
  • 安裝依賴

    npm i

  • 設(shè)置 sourcemap

    package.json 文件中的 dev 腳本中添加參數(shù) --sourcemap

    "dev": "rollup -w -c scripts/config.js --sourcemap --environment TARGET:webfull-dev"

  • 執(zhí)行 dev

    npm run dev 執(zhí)行打包锦聊,用的是 rollup,-w(watcher) 參數(shù)是監(jiān)聽文件的變化箩绍,文件變化自動重新打打包孔庭,-c 設(shè)置配置文件,--environment 設(shè)置環(huán)境變量材蛛,根據(jù)環(huán)境變量打包成不同版本的 vue

    在 dist 目錄中打包生成兩個(gè)文件

image-20210304084053706.png
  • 調(diào)試

    • examples示例中引入的 vue.min.js 改為 vue.js

    • 打開 Chrome 的調(diào)試工具中的 source

image-20210304084317757.png
Vue 的不同構(gòu)建版本
image-20210304084412637.png
  • 不同版本

    • 完整版:同時(shí)包含編譯器和運(yùn)行時(shí)的版本圆到。
    • 編譯器:用來將模板字符串編譯成為 JavaScript 渲染函數(shù)的代碼怎抛,體積大、效率低芽淡。
    • 運(yùn)行時(shí):用來創(chuàng)建 Vue 實(shí)例抽诉、渲染并處理虛擬 DOM 等的代碼,體積小吐绵、效率高迹淌。基本上就是除 去編譯器的代碼己单。
    • UMD:UMD 版本通用的模塊版本唉窃,支持多種模塊方式。 vue.js 默認(rèn)文件就是運(yùn)行時(shí) + 編譯器的 UMD 版本
    • CommonJS(cjs):CommonJS 版本用來配合老的打包工具比如 Browserify 或 webpack 1纹笼。
    • ES Module:從 2.6 開始 Vue 會提供兩個(gè) ES Modules (ESM) 構(gòu)建文件纹份,為現(xiàn)代打包工具提供的 版本
      • ESM 格式被設(shè)計(jì)為可以被靜態(tài)分析,所以打包工具可以利用這一點(diǎn)來進(jìn)行“tree-shaking”并 將用不到的代碼排除出最終的包
      • ES6 模塊與 CommonJS 模塊的差異
  • Runtime + Compiler vs. Runtime-only

    // Compiler
    // 需要編譯器廷痘,把 template 轉(zhuǎn)換成 render 函數(shù)
    // const vm = new Vue({
    //   el: "#app",
    //   template: "<h1>{{ msg }}</h1>",
    //   data: {
    //     msg: "Hello Vue",
    //   },
    // });
    // Runtime
    // 不需要編譯器
    const vm = new Vue({
      el: '#app',
      render(h) {
        return h('h1', this.msg)
      },
      data: {
        msg: 'Hello Vue'
      }
    })
    

    推薦使用運(yùn)行時(shí)版本蔓涧,因?yàn)檫\(yùn)行時(shí)版本相比完整版體積要小大約 30%

    基于 Vue-CLI 創(chuàng)建的項(xiàng)目默認(rèn)使用的是 vue.runtime.esm.js

    通過查看 webpack 的配置文件vue inspect > output.js

    image-20210304085010850.png

*.vue 文件中的模板是在構(gòu)建時(shí)預(yù)編譯的,最終打包后的結(jié)果不需要編譯器笋额,只需要運(yùn)行 時(shí)版本即可

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末元暴,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子兄猩,更是在濱河造成了極大的恐慌茉盏,老刑警劉巖,帶你破解...
    沈念sama閱讀 219,039評論 6 508
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件枢冤,死亡現(xiàn)場離奇詭異鸠姨,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī)淹真,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,426評論 3 395
  • 文/潘曉璐 我一進(jìn)店門讶迁,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人核蘸,你說我怎么就攤上這事巍糯。” “怎么了值纱?”我有些...
    開封第一講書人閱讀 165,417評論 0 356
  • 文/不壞的土叔 我叫張陵鳞贷,是天一觀的道長。 經(jīng)常有香客問我虐唠,道長,這世上最難降的妖魔是什么惰聂? 我笑而不...
    開封第一講書人閱讀 58,868評論 1 295
  • 正文 為了忘掉前任疆偿,我火速辦了婚禮咱筛,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘杆故。我一直安慰自己迅箩,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,892評論 6 392
  • 文/花漫 我一把揭開白布处铛。 她就那樣靜靜地躺著饲趋,像睡著了一般。 火紅的嫁衣襯著肌膚如雪撤蟆。 梳的紋絲不亂的頭發(fā)上奕塑,一...
    開封第一講書人閱讀 51,692評論 1 305
  • 那天,我揣著相機(jī)與錄音家肯,去河邊找鬼龄砰。 笑死,一個(gè)胖子當(dāng)著我的面吹牛讨衣,可吹牛的內(nèi)容都是我干的换棚。 我是一名探鬼主播,決...
    沈念sama閱讀 40,416評論 3 419
  • 文/蒼蘭香墨 我猛地睜開眼反镇,長吁一口氣:“原來是場噩夢啊……” “哼固蚤!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起歹茶,我...
    開封第一講書人閱讀 39,326評論 0 276
  • 序言:老撾萬榮一對情侶失蹤颇蜡,失蹤者是張志新(化名)和其女友劉穎,沒想到半個(gè)月后辆亏,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體风秤,經(jīng)...
    沈念sama閱讀 45,782評論 1 316
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,957評論 3 337
  • 正文 我和宋清朗相戀三年扮叨,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了缤弦。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 40,102評論 1 350
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡彻磁,死狀恐怖碍沐,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情衷蜓,我是刑警寧澤累提,帶...
    沈念sama閱讀 35,790評論 5 346
  • 正文 年R本政府宣布,位于F島的核電站磁浇,受9級特大地震影響斋陪,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,442評論 3 331
  • 文/蒙蒙 一无虚、第九天 我趴在偏房一處隱蔽的房頂上張望缔赠。 院中可真熱鬧,春花似錦友题、人聲如沸嗤堰。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,996評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽踢匣。三九已至,卻和暖如春戈抄,著一層夾襖步出監(jiān)牢的瞬間离唬,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 33,113評論 1 272
  • 我被黑心中介騙來泰國打工呛凶, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留男娄,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 48,332評論 3 373
  • 正文 我出身青樓漾稀,卻偏偏與公主長得像模闲,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個(gè)殘疾皇子崭捍,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,044評論 2 355

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