首页
技术小册
AIGC
面试刷题
技术文章
MAGENTO
云计算
视频课程
源码下载
PDF书籍
「涨薪秘籍」
登录
注册
数据驱动
new Vue 发生了什么
Vue 实例挂载的实现
render方法实现原理
Virtual DOM
createElement方法解析
update方法解析
组件化
createComponent方法
调用patch过程
vue合并配置
vue生命周期
组件注册过程
异步组件实现
深入响应式原理
响应式对象
依赖收集过程
派发更新过程
nextTick核心实现
检测变化源码分析
计算属性 VS 侦听属性
组件更新过程
原理图总结
编译流程
编译入口
parse解析环节
optimize优化过程
codegen代码转换
Vue核心扩展
event扩展
v-model扩展
slot插槽
keep-alive缓存优化
transition过渡
transition-group
Vue-Router路由
路由注册原理
VueRouter对象 解析
matcher实现
路径切换相关实现
Vuex状态管理
Vuex 初始化
API
插件能力
当前位置:
首页>>
技术小册>>
Vue原理与源码解析
小册名称:Vue原理与源码解析
从入口代码开始分析,我们先来分析 `new Vue` 背后发生了哪些事情。我们都知道,`new` 关键字在 Javascript 语言中代表实例化是一个对象,而 `Vue` 实际上是一个类,类在 Javascript 中是用 Function 来实现的,来看一下源码,在`src/core/instance/index.js` 中。 ```js 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) } ``` 可以看到 `Vue` 只能通过 new 关键字初始化,然后会调用 `this._init` 方法, 该方法在 `src/core/instance/init.js` 中定义。 ```js Vue.prototype._init = function (options?: Object) { const vm: Component = 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 // 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 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) } if (vm.$options.el) { vm.$mount(vm.$options.el) } } ``` Vue 初始化主要就干了几件事情,合并配置,初始化生命周期,初始化事件中心,初始化渲染,初始化 data、props、computed、watcher 等等。 ## 总结 Vue 的初始化逻辑写的非常清楚,把不同的功能逻辑拆成一些单独的函数执行,让主线逻辑一目了然,这样的编程思想是非常值得借鉴和学习的。 由于我们这一章的目标是弄清楚模板和数据如何渲染成最终的 DOM,所以各种初始化逻辑我们先不看。在初始化的最后,检测到如果有 `el` 属性,则调用 `vm.$mount` 方法挂载 `vm`,挂载的目标就是把模板渲染成最终的 DOM,那么接下来我们来分析 Vue 的挂载过程。
上一篇:
数据驱动
下一篇:
Vue 实例挂载的实现
该分类下的相关小册推荐:
TypeScript和Vue从入门到精通(四)
vue项目构建基础入门与实战
VUE组件基础与实战
TypeScript和Vue从入门到精通(一)
Vue.js从入门到精通(一)
TypeScript和Vue从入门到精通(二)
Vue3技术解密
vuejs组件实例与底层原理精讲
Vue.js从入门到精通(二)
Vue.js从入门到精通(四)
TypeScript和Vue从入门到精通(三)
Vue面试指南