const idToTemplate = cached(id => { const el = query(id) return el && el.innerHTML })
const mount = Vue.prototype.$mount; // 缓存了原型上的 $mount 方法 Vue.prototype.$mount = function (el, hydrating) { el = el && query(el) // 通过 query函数 就是获取真实的DOM元素
// 判断获取的真实 dom元素是否为 body 或 documentElement 报警告 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.` ) returnthis }
const options = this.$options // 判断有么有render , 咱们一般都是用 template 写的vue,需要编译 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 ) } } } elseif (template.nodeType) { template = template.innerHTML } else { if (process.env.NODE_ENV !== 'production') { warn('invalid template option:' + template, this) } returnthis } } elseif (el) { template = getOuterHTML(el) // 即获取 el 的 outerHTML } if (template) { // 然后通过compileToFunctions将 template 转化为 render 函数,options.render = render // 所有 Vue 的组件的渲染最终都需要 render 方法,无论是用单页面 .vue 方式开发,还是写了 el 或者 template 属性, // 最终都要被转成 render 方法,那么这个过程是 Vue 的一个 “在线编译” 的过程, 它是调用 compileToFunctions 方法实现的,最后调用原型上的 $mount 方法挂载。 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 } } // 如果没有传el的话,会直接执行这步,会把组件在内存中渲染完毕 return mount.call(this, el, hydrating) } // 及时获取HTML 兼容IE functiongetOuterHTML(el): string{ if (el.outerHTML) { return el.outerHTML } else { const container = document.createElement('div') container.appendChild(el.cloneNode(true)) return container.innerHTML } } Vue.compile = compileToFunctions
exportdefault Vue
$mount方法支持传入 2 个参数,第一个是 el,它表示挂载的元素,可以是字符串,也可以是 DOM 对象,如果是字符串在浏览器环境下会调用 query 方法转换成 DOM 对象的。第二个参数是和服务端渲染相关,在浏览器环境下不需要传第二个参数。