vue init webpack vue2_project (vue2_project 文件名)
import Vue from 'vue'
var app = new Vue({
el: '#app',
data: {
message: '我是一个双向绑定的数据'
}
})
从vue2_project中
\node_modules\vue\package.json中找到main的入口文件
生产环境:
node_modules\vue\dist\vue.runtime.common.dev.js

开发环境:
node_modules\vue\dist\vue.runtime.common.dev.js

看到这里,你就会发现和vue源码中的构建找到vue 函数中的是一样的了。

首先,通过构建vue我们知道Vue其实是个函数
路径:vue\src\core\instance\init.ts

如上可知:el挂载其实就是在初始化initMixin函数的时候判断的
export function initMixin(Vue: typeof Component) {
if (vm.$options.el) {
vm.$mount(vm.$options.el)
}
}
vue2中的main文件new Vue挂载加$mount的原因
根据一、二我们了解了main 中new Vue的el挂载和$mount方法
import Vue from 'vue'
var app = new Vue({
el: '#app',
mounted() {
console.log(this.message);
},
data() {
return {
message: '我是一个双向绑定的数据'
}
}
})

为什么直接使用this.message就能获取到数据呢?
路径:
src\core\instance\index.ts

function initData(vm: Component) {
let data: any = vm.$options.data
data = vm._data = isFunction(data) ? getData(data, vm) : data || {}
}


过程:
通过initData获取到传入的对象数据,将这个数据复制给vm,也就是在new Vue中的this。这样你就可以通过this.message和this._data.message来获取你在data中定义的数据了,而这里的this.data.message会执行proxy函数,通过Object.defineProperty执行sharedPropertyDefinition.get方法,也就是message。至于数据的绑定后面会单独说明,这里先忽略。
