• <fieldset id="8imwq"><menu id="8imwq"></menu></fieldset>
  • <bdo id="8imwq"><input id="8imwq"></input></bdo>
    最新文章專題視頻專題問答1問答10問答100問答1000問答2000關(guān)鍵字專題1關(guān)鍵字專題50關(guān)鍵字專題500關(guān)鍵字專題1500TAG最新視頻文章推薦1 推薦3 推薦5 推薦7 推薦9 推薦11 推薦13 推薦15 推薦17 推薦19 推薦21 推薦23 推薦25 推薦27 推薦29 推薦31 推薦33 推薦35 推薦37視頻文章20視頻文章30視頻文章40視頻文章50視頻文章60 視頻文章70視頻文章80視頻文章90視頻文章100視頻文章120視頻文章140 視頻2關(guān)鍵字專題關(guān)鍵字專題tag2tag3文章專題文章專題2文章索引1文章索引2文章索引3文章索引4文章索引5123456789101112131415文章專題3
    問答文章1 問答文章501 問答文章1001 問答文章1501 問答文章2001 問答文章2501 問答文章3001 問答文章3501 問答文章4001 問答文章4501 問答文章5001 問答文章5501 問答文章6001 問答文章6501 問答文章7001 問答文章7501 問答文章8001 問答文章8501 問答文章9001 問答文章9501
    當(dāng)前位置: 首頁 - 科技 - 知識(shí)百科 - 正文

    實(shí)例講解vue源碼架構(gòu)

    來源:懂視網(wǎng) 責(zé)編:小采 時(shí)間:2020-11-27 22:01:44
    文檔

    實(shí)例講解vue源碼架構(gòu)

    實(shí)例講解vue源碼架構(gòu):下載 去github上下載Vue https://github.com/vuejs/vue npm install npm run dev 運(yùn)行起來 rollup + flow vue使用使用rollup打包,flow規(guī)范數(shù)據(jù)類型 rollup可以先用webpack套用,讀起來差不多,時(shí)間有限,畢竟只有5分鐘,這個(gè)就不用去看roll
    推薦度:
    導(dǎo)讀實(shí)例講解vue源碼架構(gòu):下載 去github上下載Vue https://github.com/vuejs/vue npm install npm run dev 運(yùn)行起來 rollup + flow vue使用使用rollup打包,flow規(guī)范數(shù)據(jù)類型 rollup可以先用webpack套用,讀起來差不多,時(shí)間有限,畢竟只有5分鐘,這個(gè)就不用去看roll

    下載

    去github上下載Vue https://github.com/vuejs/vue

    npm install 
    npm run dev

    運(yùn)行起來

    rollup + flow

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

    rollup可以先用webpack套用,讀起來差不多,時(shí)間有限,畢竟只有5分鐘,這個(gè)就不用去看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的不同會(huì)選擇不同的config

    同時(shí)在這里配置了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,默認(rèn)的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í)行對(duì)象的周期函數(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 的時(shí)候,是執(zhí)行相應(yīng)周期,開發(fā)者在周期函數(shù)里所寫的

    Events

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

    render
    renderMixin函數(shù)
    添加了 $nextTick _render 原型對(duì)象

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

    nextTick(fn, this)是一個(gè)自執(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ù)

    添加原型對(duì)象

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

    其他

    src/compiler 做了編譯處理

    core/componetd 做了keep-alive

    core/util 封裝了通用方法

    core/vdom vdom算法

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

    聲明:本網(wǎng)頁內(nèi)容旨在傳播知識(shí),若有侵權(quán)等問題請(qǐng)及時(shí)與本網(wǎng)聯(lián)系,我們將在第一時(shí)間刪除處理。TEL:177 7030 7066 E-MAIL:11247931@qq.com

    文檔

    實(shí)例講解vue源碼架構(gòu)

    實(shí)例講解vue源碼架構(gòu):下載 去github上下載Vue https://github.com/vuejs/vue npm install npm run dev 運(yùn)行起來 rollup + flow vue使用使用rollup打包,flow規(guī)范數(shù)據(jù)類型 rollup可以先用webpack套用,讀起來差不多,時(shí)間有限,畢竟只有5分鐘,這個(gè)就不用去看roll
    推薦度:
    • 熱門焦點(diǎn)

    最新推薦

    猜你喜歡

    熱門推薦

    專題
    Top
    主站蜘蛛池模板: 国产99re在线观看只有精品| 国产精品白丝jkav网站| 国产精品欧美一区二区三区不卡 | 少妇人妻偷人精品免费视频| 国产福利电影一区二区三区,欧美国产成人精品一 | 麻豆精品久久久一区二区| 精品蜜臀久久久久99网站| 欧美日韩精品久久久免费观看| 国产精品成人啪精品视频免费| 精品亚洲欧美高清不卡高清| 国产精品视频一区二区噜噜| 精品无码人妻一区二区三区| 亚洲国产精品无码久久| 亚洲国产精品专区在线观看 | 91精品国产91久久久久久| 成人国产精品免费视频| 一区二区三区精品高清视频免费在线播放 | 亚洲精品无码午夜福利中文字幕 | 久久精品九九亚洲精品| 99久久免费国产精精品| 日韩欧美亚洲国产精品字幕久久久 | 欧美日韩精品久久久久| 99久re热视频这里只有精品6| 99免费精品视频| 国内精品久久人妻互换| 在线亚洲精品福利网址导航| 日韩精品免费一线在线观看| 久久成人国产精品一区二区| 精品久久久久中文字幕一区| 国产一级精品高清一级毛片| 国产精品99精品视频网站| 四虎影永久在线观看精品| 精品一区二区三区四区| 精品国产免费一区二区三区香蕉| 国产精品久久久久9999| 国产成人精品男人的天堂538 | 日本精品一区二区三区四区| 久久亚洲av无码精品浪潮| 人妻偷人精品成人AV| 欧美激情视频精品一区二区| 人妻无码久久精品|