国产xxxx99真实实拍_久久不雅视频_高清韩国a级特黄毛片_嗯老师别我我受不了了小说

資訊專欄INFORMATION COLUMN

5分鐘通讀vue源碼架構(gòu)

Pines_Cheng / 1317人閱讀

摘要:下載去上下載運行起來使用使用打包,規(guī)范數(shù)據(jù)類型可以先用套用,讀起來差不多,時間有限,畢竟只有分鐘,這個就不用去看文檔了入口打開我們看配置找到打開根據(jù)配置的不同會選擇不同的同時在這里配置了環(huán)境有,,關(guān)于引入類型的還有

下載

去github上下載Vue

npm install 
npm run dev

運行起來

rollup + flow

vue使用使用rollup打包,flow規(guī)范數(shù)據(jù)類型

rollup可以先用webpack套用,讀起來差不多,時間有限,畢竟只有5分鐘,這個就不用去看rollup文檔了

入口

打開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",

找到scripts/config.js
打開

根據(jù)配置TARGET的不同會選擇不同的config

同時在這里配置了process.env.NODE_ENV 環(huán)境

TARGET有CommonJS,ES Modules,UMD關(guān)于js引入類型的
還有weex,ssr

"web-runtime-cjs-dev": {
    entry: resolve("web/entry-runtime.js"),
    dest: resolve("dist/vue.runtime.common.dev.js"),
    format: "cjs",
    env: "development",
    banner
  }

在alias.js下設(shè)置了別名路徑
我們先介紹src/platforms

里面有web和weex 分別的web和weex入口

在web文件下是CommonJS,ES Modules,UMD關(guān)于js引入類型,server的打包入口

打開web/entry-runtime.js
引入

import Vue from "./runtime/index"

export default Vue

打開./runtime/index

import Vue from "core/index"

Vue.prototype.$mount = function (
  el?: string | Element,
  hydrating?: boolean
): Component {
  el = el && inBrowser ? query(el) : undefined
  return mountComponent(this, el, hydrating)
}
export default Vue

在vue原型上添加了mount方法
處理了devtools,沒有安裝提醒安裝devtools

給了這句提示dev環(huán)境提示

You are running Vue in development mode.
Make sure to turn on production mode when deploying for production.
See more tips at https://vuejs.org/guide/deployment.html

platforms目錄夾講解完畢

core目錄

打開core/instance/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

先執(zhí)行的是initMixin(Vue)

打開init

export function initMixin (Vue) {
  Vue.prototype._init = function (options?: Object) {
    const vm = this
    // a uid 
    vm._uid = uid++
    
    let startTag, endTag
    /* istanbul ignore if */
    if (process.env.NODE_ENV !== "production" && config.performance && mark) {
      startTag = `vue-perf-start:${vm._uid}`
      endTag = `vue-perf-end:${vm._uid}`
      mark(startTag)
    }

    // a flag to avoid this being observed
    vm._isVue = true
    // 處理傳入的options
    // merge options
    if (options && options._isComponent) {
      // optimize internal component instantiation
      // since dynamic options merging is pretty slow, and none of the
      // internal component options needs special treatment.
      initInternalComponent(vm, options)
    } else {
       // 傳入的options,默認的options一起合并掛載到vm.$options上
      vm.$options = mergeOptions(
        resolveConstructorOptions(vm.constructor),
        options || {},
        vm
      )
    }
    /* istanbul ignore else */
    if (process.env.NODE_ENV !== "production") {
      // 代理
      initProxy(vm)
    } else {
      vm._renderProxy = vm
    }
    // 生命周期
    initLifecycle(vm)
     // emit on 事件
    initEvents(vm)
    // 處理render vdom
    initRender(vm)
    callHook(vm, "beforeCreate")
    // 處理Injections
    initInjections(vm) // resolve injections before data/props
    // 雙向數(shù)據(jù)綁定,監(jiān)聽訂閱
    initState(vm)
    initProvide(vm) // resolve provide after data/props
    callHook(vm, "created")
    
    /* istanbul ignore if */
    if (process.env.NODE_ENV !== "production" && config.performance && mark) {
      vm._name = formatComponentName(vm, false)
      mark(endTag)
      measure(`vue ${vm._name} init`, startTag, endTag)
    }
    // 渲染到dom
    if (vm.$options.el) {
      vm.$mount(vm.$options.el)
    }
  }
}
lifecycle

打開 lifecycle

export function callHook (vm: Component, hook: string) {
  // disable dep collection when invoking lifecycle hooks
  pushTarget()
  //執(zhí)行對象的周期函數(shù),周期函數(shù)最后被處理成數(shù)組
  const handlers = vm.$options[hook]
  const info = `${hook} hook`
  if (handlers) {
    for (let i = 0, j = handlers.length; i < j; i++) {
      invokeWithErrorHandling(handlers[i], vm, null, vm, info)
    }
  }
  if (vm._hasHookEvent) {
    vm.$emit("hook:" + hook)
  }
  popTarget()

callHook 的時候,是執(zhí)行相應(yīng)周期,開發(fā)者在周期函數(shù)里所寫的

Events

initEvents實現(xiàn)了 emit on 等方法,請參考監(jiān)聽者訂閱者模式,這里不詳解

render renderMixin函數(shù)

添加了 $nextTick _render 原型對象

$nextTick會在dom跟新后立即調(diào)用

nextTick(fn, this)是一個自執(zhí)行函數(shù)

_render返回的是node的js數(shù)據(jù),還不是dom

做了Vdom

initRender函數(shù)

給vm添加了_c和 $createElement用來渲染的方法

state
if (!(key in vm)) {
      proxy(vm, `_props`, key)
    }

給vue屬性做代理,訪問this.a可以得到this.data.a 的值

export function initState (vm: Component) {
  vm._watchers = []
  const opts = vm.$options
  if (opts.props) initProps(vm, opts.props)
  if (opts.methods) initMethods(vm, opts.methods)
  if (opts.data) {
    initData(vm)
  } else {
    observe(vm._data = {}, true /* asRootData */)
  }
  if (opts.computed) initComputed(vm, opts.computed)
  if (opts.watch && opts.watch !== nativeWatch) {
    initWatch(vm, opts.watch)
  }
}

給數(shù)據(jù)做監(jiān)聽

stateMixin函數(shù)

添加原型對象

 Vue.prototype.$set = set
 Vue.prototype.$delete = del
其他

src/compiler 做了編譯處理

core/componetd 做了keep-alive

core/util 封裝了通用方法

core/vdom vdom算法

以上整體架構(gòu)分析完畢

附張圖

文章版權(quán)歸作者所有,未經(jīng)允許請勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。

轉(zhuǎn)載請注明本文地址:http://m.specialneedsforspecialkids.com/yun/101358.html

相關(guān)文章

  • 《從零構(gòu)建前后分離的web項目》實戰(zhàn) -5分鐘快速構(gòu)建炒雞規(guī)范的VUE項目骨架

    摘要:可以使用或來安裝我用來重新嘗試一次對速度表示不理想的可以嘗試淘寶的不要過度依賴中可以寫成放哪都行,可以寫成可以寫成看到這個畫面,安裝完成了。 初步搭建腳手架 Tips 任何不錯的開源項目都有 project-cli 腳手架、我們用它生成往往能快速配制出最佳的、理想的腳手架 我通常使用 cli 生成項目骨架再在之基礎(chǔ)上進行個人修改。 什么是 CLI 命令行界面(英語:command-li...

    qieangel2013 評論0 收藏0
  • 《從零構(gòu)建前后分離的web項目》實戰(zhàn) -5分鐘快速構(gòu)建炒雞規(guī)范的VUE項目骨架

    摘要:可以使用或來安裝我用來重新嘗試一次對速度表示不理想的可以嘗試淘寶的不要過度依賴中可以寫成放哪都行,可以寫成可以寫成看到這個畫面,安裝完成了。 初步搭建腳手架 Tips 任何不錯的開源項目都有 project-cli 腳手架、我們用它生成往往能快速配制出最佳的、理想的腳手架 我通常使用 cli 生成項目骨架再在之基礎(chǔ)上進行個人修改。 什么是 CLI 命令行界面(英語:command-li...

    kel 評論0 收藏0
  • vue源碼分析系列

    摘要:本系列文章旨在化繁為簡,通讀源碼,描述背后的實現(xiàn)邏輯。記錄方式主要是代碼注釋文章鏈接源碼分析系列之環(huán)境搭建源碼分析系列之入口文件分析源碼分析系列之響應(yīng)式數(shù)據(jù)一源碼分析系列之響應(yīng)式數(shù)據(jù)二 概述 在使用vue的時候,會遇到很多神奇的地方,比如 修改vue實例中data對象的屬性值,會觸發(fā)dom值的改變;改變dom中的輸入,會觸發(fā)data對應(yīng)屬性的改變,即雙向數(shù)據(jù)綁定。 通過watch可以...

    Joonas 評論0 收藏0
  • 7月份前端資源分享

    摘要:更多資源請文章轉(zhuǎn)自月份前端資源分享的作用數(shù)組元素隨機化排序算法實現(xiàn)學(xué)習(xí)筆記數(shù)組隨機排序個變態(tài)題解析上個變態(tài)題解析下中的數(shù)字前端開發(fā)筆記本過目不忘正則表達式聊一聊前端存儲那些事兒一鍵分享到各種寫給剛?cè)腴T的前端工程師的前后端交互指南物聯(lián)網(wǎng)世界的 更多資源請Star:https://github.com/maidishike... 文章轉(zhuǎn)自:https://github.com/jsfr...

    pingan8787 評論0 收藏0
  • 小光光談前端

    摘要:這個問題應(yīng)該是百度或者知乎都能知道答案的,以上是自己親身學(xué)習(xí)的一些途徑方便少走一點彎路入門。 問題1:前端的學(xué)習(xí)路線 基礎(chǔ)的html,css,js,推薦慕課網(wǎng)免費課程:前端工程師路徑,極客學(xué)院免費課程:前端工程師路徑 大概刷過就可以了,不用死記硬背某個知識點,css跟js還需要加深學(xué)習(xí)的,在實戰(zhàn)過程中不懂就去查文檔 基礎(chǔ)的ps切圖能力 慕課網(wǎng)ps基礎(chǔ)課程 擁有自己的虛擬主機 傳送...

    canopus4u 評論0 收藏0

發(fā)表評論

0條評論

最新活動
閱讀需要支付1元查看
<