Last active
April 23, 2018 10:39
-
-
Save simonwoo/cdf18fcd609951a5c22e860e0554d763 to your computer and use it in GitHub Desktop.
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
// vue constructor | |
function Vue (options) { | |
//... | |
this._init(options) | |
} | |
Vue.prototype._init = function (options?: Object) { | |
const vm: Component = this | |
// a uid | |
vm._uid = uid++ | |
// ... | |
// a flag to avoid this being observed | |
vm._isVue = true | |
// 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 { | |
vm.$options = mergeOptions( | |
resolveConstructorOptions(vm.constructor), | |
options || {}, | |
vm | |
) | |
} | |
/* istanbul ignore else */ | |
if (process.env.NODE_ENV !== 'production') { | |
initProxy(vm) | |
} else { | |
vm._renderProxy = vm | |
} | |
// expose real self | |
vm._self = vm | |
initLifecycle(vm) | |
initEvents(vm) | |
initRender(vm) | |
callHook(vm, 'beforeCreate') | |
initInjections(vm) // resolve injections before data/props | |
// 初始化props、methods、data、computed与watch | |
initState(vm) | |
initProvide(vm) // resolve provide after data/props | |
callHook(vm, 'created') | |
if (vm.$options.el) { | |
// 编译过程 | |
vm.$mount(vm.$options.el) | |
} | |
} | |
// public mount method | |
Vue.prototype.$mount = function (el, hydrating) { | |
return mountComponent(this, el, hydrating) | |
}; | |
function mountComponent (vm, el, hydrating) { | |
vm.$el = el; | |
// ... | |
callHook(vm, 'beforeMount'); | |
var updateComponent; | |
updateComponent = function () { | |
//vm._render返回一个vnode | |
//vm._update用于拿到新的vnode然后与旧的vnode进行patch操作 | |
vm._update(vm._render(), hydrating); | |
}; | |
// we set this to vm._watcher inside the watcher's constructor | |
// since the watcher's initial patch may call $forceUpdate (e.g. inside child | |
// component's mounted hook), which relies on vm._watcher being already defined | |
new Watcher(vm, updateComponent, noop, { | |
before: function before () { | |
if (vm._isMounted) { | |
callHook(vm, 'beforeUpdate'); | |
} | |
} | |
}, true /* isRenderWatcher */); | |
hydrating = false; | |
// manually mounted instance, call mounted on self | |
// mounted is called for render-created child components in its inserted hook | |
if (vm.$vnode == null) { | |
vm._isMounted = true; | |
callHook(vm, 'mounted'); | |
} | |
return vm | |
} | |
// 如果不存在render函数,则把template编译成render函数 | |
// function render() { | |
// with(this){ | |
// return _c('div',{attrs:{"id":"app"}},[_c('child')],1) | |
// } | |
// } | |
var mount = Vue.prototype.$mount; | |
Vue.prototype.$mount = function (el, hydrating) { | |
el = el && query(el); | |
var options = this.$options; | |
// resolve template/el and convert to render function | |
if (!options.render) { | |
var template = options.template; | |
if (template) { | |
if (typeof template === 'string') { | |
if (template.charAt(0) === '#') { | |
template = idToTemplate(template); | |
} | |
} else if (template.nodeType) { | |
template = template.innerHTML; | |
} else { | |
{ | |
warn('invalid template option:' + template, this); | |
} | |
return this | |
} | |
} else if (el) { | |
template = getOuterHTML(el); | |
} | |
if (template) { | |
// compile分为三步,parse, generate, optimise | |
var ref = compileToFunctions(template, { | |
shouldDecodeNewlines: shouldDecodeNewlines, | |
shouldDecodeNewlinesForHref: shouldDecodeNewlinesForHref, | |
delimiters: options.delimiters, | |
comments: options.comments | |
}, this); | |
var render = ref.render; | |
var staticRenderFns = ref.staticRenderFns; | |
options.render = render; | |
options.staticRenderFns = staticRenderFns; | |
} | |
} | |
return mount.call(this, el, hydrating) | |
}; |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment