vue源碼01

1弄慰、獲取源碼

通過這個地址:https://github.com/vuejs/vue 獲取源碼

2渺杉、目錄說明

2.1 一級目錄說明:


目錄1.png

2.2 src目錄說明:


目錄2.png

3脾歇、入口

Vue.js 源碼是基于 Rollup 構(gòu)建的髓考,它的構(gòu)建相關(guān)配置都在 scripts 目錄下从祝。
通過dev腳本错邦,package.json文件

 "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",
    "dev:esm": "rollup -w -c scripts/config.js --environment TARGET:web-runtime-esm",
....}

dev腳本中 -c scripts/config.js 指明配置文件所在腻豌,參數(shù) TARGET:web-full-dev 指明輸出文件配置項家坎。

 // Runtime+compiler development build (Browser)
  'web-full-dev': {
    entry: resolve('web/entry-runtime-with-compiler.js'), // 構(gòu)建的入口 JS 文件地址
    dest: resolve('dist/vue.js'),//構(gòu)建后的 JS 文件地址
    format: 'umd',// 構(gòu)建的格式
    env: 'development',
    alias: { he: './entity-decoder' },
    banner
  },

cjs 表示構(gòu)建出來的文件遵循 CommonJS 規(guī)范,es 表示構(gòu)建出來的文件遵循 ES Module 規(guī)范吝梅。 umd 表示構(gòu)建出來的文件遵循 UMD 規(guī)范虱疏。

另外,我們觀察dist目錄下會發(fā)現(xiàn)很多版本苏携,vue-runtime.js,vue-runtime.common.js等等他們之間有什么區(qū)別做瞪?

runtime:僅包含運行時,不包含編譯器
common:cjs規(guī)范右冻,用于webpack1
esm:ES模塊装蓬,用于webpack2+
umd: universal module definition,兼容cjs和amd纱扭,用于瀏覽器

為了分析 Vue 的編譯過程牍帚,我們重點分析的是 Runtime + Compiler 的 Vue.js
通過 scripts/config.js 和 scripts/alias

const aliases = require('./alias')
const resolve = p => {
  const base = p.split('/')[0]
  if (aliases[base]) {
    return path.resolve(aliases[base], p.slice(base.length + 1))
  } else {
    return path.resolve(__dirname, '../', p)
  }
}

找到入口 src/platforms/web/entry-runtime-with-compiler.js

/* @flow */

import config from 'core/config'
import { warn, cached } from 'core/util/index'
import { mark, measure } from 'core/util/perf'

import Vue from './runtime/index'
import { query } from './util/index'
import { compileToFunctions } from './compiler/index'
import { shouldDecodeNewlines, shouldDecodeNewlinesForHref } from './util/compat'

const idToTemplate = cached(id => {
  const el = query(id)
  return el && el.innerHTML
})

const mount = Vue.prototype.$mount
Vue.prototype.$mount = function (
  el?: string | Element,
  hydrating?: boolean
): Component {
  el = el && query(el)

  /* istanbul ignore if */
  if (el === document.body || el === document.documentElement) {
    process.env.NODE_ENV !== 'production' && warn(
      `Do not mount Vue to <html> or <body> - mount to normal elements instead.`
    )
    return this
  }

  const options = this.$options
  // resolve template/el and convert to render function
  if (!options.render) {
    let template = options.template
    if (template) {
      if (typeof template === 'string') {
        if (template.charAt(0) === '#') {
          template = idToTemplate(template)
          /* istanbul ignore if */
          if (process.env.NODE_ENV !== 'production' && !template) {
            warn(
              `Template element not found or is empty: ${options.template}`,
              this
            )
          }
        }
      } else if (template.nodeType) {
        template = template.innerHTML
      } else {
        if (process.env.NODE_ENV !== 'production') {
          warn('invalid template option:' + template, this)
        }
        return this
      }
    } else if (el) {
      template = getOuterHTML(el)
    }
    if (template) {
      /* istanbul ignore if */
      if (process.env.NODE_ENV !== 'production' && config.performance && mark) {
        mark('compile')
      }

      const { render, staticRenderFns } = compileToFunctions(template, {
        outputSourceRange: process.env.NODE_ENV !== 'production',
        shouldDecodeNewlines,
        shouldDecodeNewlinesForHref,
        delimiters: options.delimiters,
        comments: options.comments
      }, this)
      options.render = render
      options.staticRenderFns = staticRenderFns

      /* istanbul ignore if */
      if (process.env.NODE_ENV !== 'production' && config.performance && mark) {
        mark('compile end')
        measure(`vue ${this._name} compile`, 'compile', 'compile end')
      }
    }
  }
  return mount.call(this, el, hydrating)
}

/**
 * Get outerHTML of elements, taking care
 * of SVG elements in IE as well.
 */
function getOuterHTML (el: Element): string {
  if (el.outerHTML) {
    return el.outerHTML
  } else {
    const container = document.createElement('div')
    container.appendChild(el.cloneNode(true))
    return container.innerHTML
  }
}

Vue.compile = compileToFunctions

export default Vue

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市乳蛾,隨后出現(xiàn)的幾起案子暗赶,更是在濱河造成了極大的恐慌鄙币,老刑警劉巖,帶你破解...
    沈念sama閱讀 211,743評論 6 492
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件蹂随,死亡現(xiàn)場離奇詭異十嘿,居然都是意外死亡,警方通過查閱死者的電腦和手機岳锁,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,296評論 3 385
  • 文/潘曉璐 我一進店門绩衷,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人浸锨,你說我怎么就攤上這事唇聘“婀茫” “怎么了柱搜?”我有些...
    開封第一講書人閱讀 157,285評論 0 348
  • 文/不壞的土叔 我叫張陵,是天一觀的道長剥险。 經(jīng)常有香客問我聪蘸,道長,這世上最難降的妖魔是什么表制? 我笑而不...
    開封第一講書人閱讀 56,485評論 1 283
  • 正文 為了忘掉前任健爬,我火速辦了婚禮,結(jié)果婚禮上么介,老公的妹妹穿的比我還像新娘娜遵。我一直安慰自己,他們只是感情好壤短,可當(dāng)我...
    茶點故事閱讀 65,581評論 6 386
  • 文/花漫 我一把揭開白布设拟。 她就那樣靜靜地躺著,像睡著了一般久脯。 火紅的嫁衣襯著肌膚如雪纳胧。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 49,821評論 1 290
  • 那天帘撰,我揣著相機與錄音跑慕,去河邊找鬼。 笑死摧找,一個胖子當(dāng)著我的面吹牛核行,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播蹬耘,決...
    沈念sama閱讀 38,960評論 3 408
  • 文/蒼蘭香墨 我猛地睜開眼芝雪,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了婆赠?” 一聲冷哼從身側(cè)響起绵脯,我...
    開封第一講書人閱讀 37,719評論 0 266
  • 序言:老撾萬榮一對情侶失蹤佳励,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后蛆挫,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體赃承,經(jīng)...
    沈念sama閱讀 44,186評論 1 303
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 36,516評論 2 327
  • 正文 我和宋清朗相戀三年悴侵,在試婚紗的時候發(fā)現(xiàn)自己被綠了瞧剖。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 38,650評論 1 340
  • 序言:一個原本活蹦亂跳的男人離奇死亡可免,死狀恐怖抓于,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情浇借,我是刑警寧澤捉撮,帶...
    沈念sama閱讀 34,329評論 4 330
  • 正文 年R本政府宣布,位于F島的核電站妇垢,受9級特大地震影響巾遭,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜闯估,卻給世界環(huán)境...
    茶點故事閱讀 39,936評論 3 313
  • 文/蒙蒙 一灼舍、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧涨薪,春花似錦骑素、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,757評論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至光督,卻和暖如春阳距,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背结借。 一陣腳步聲響...
    開封第一講書人閱讀 31,991評論 1 266
  • 我被黑心中介騙來泰國打工筐摘, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人船老。 一個月前我還...
    沈念sama閱讀 46,370評論 2 360
  • 正文 我出身青樓咖熟,卻偏偏與公主長得像,于是被迫代替她去往敵國和親柳畔。 傳聞我的和親對象是個殘疾皇子馍管,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 43,527評論 2 349

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