vueSchool

https://github.com/logictuLuoqi/vueSchool

前言

其实 vue 的文档要写出和官网不一样的感觉很难 应为官方文档写的已经很好了 但目前很少人去读完 vue 的整个文档 目前现在我看到不少人 说 webpack 不用学 都有人配好了 入门开始 直接 vuecli 这样其实是不对的 我准备 以 vue 源码为基础讲 vue 的技术 我们的目标是培养看懂源码的 vue 工程师

Vue 目录

01 helloworld https://github.com/logictuLuoqi/vueSchool/blob/master/code/01-helloworld/HelloWorld.md

这个是一个 hello world案例

我们不考虑打包工具 来写一个vue

webpack的作用 就是帮助我们的代码装换成浏览器认识的样子

源码入门 摆脱 webpack

下面我用原始的方法来写一个hello world

  1. const HelloWorld = Vue.component('hello-world', Vue.extend({
  2. data(){
  3. return {
  4. hello: "helloworld"
  5. }
  6. },
  7. render(h){
  8. return h('div', {}, this.hello)
  9. }
  10. }))
  11. new Vue({
  12. render: h => h(HelloWorld)
  13. }).$mount('#app1')

看到这里很多人就不懂了 这样说吧 这种写法等于下面这种 只不过下面这种必须webpack webpack是带包工具 打包完压缩 压缩的 解压缩就是上面的样子

  1. <template>
  2. <div style="height: 100%">
  3. helloworld
  4. </div>
  5. </template>
  6. <script>
  7. </script>

其实你们都被 webpack骗了 这个编译之前的代码 编译之后就是我们用原生方法写的样子

编译过程 我放在vue-loader的时候详细讲解

template=createElement

extend

需要一个obj {} 作为参数 使用基础 Vue 构造器,创建一个“子类”。参数是一个包含组件选项的对象。

Vue.component

Vue.component(给定一个组件名称, extend)

render

需要一个 VNnode参数 Vue 选项中的 render 函数若存在,则 Vue 构造函数不会从 template 选项或通过 el 选项指定的挂载元素中提取出的 HTML 模板编译渲染函数。 性能 需要这样

去看看 createElement源码解析

$mount

如果 Vue 实例在实例化时没有收到 el 选项,则它处于“未挂载”状态,没有关联的 DOM 元素。可以使用 vm.$mount() 手动地挂载一个未挂载的实例。

el

如果存有el则调用$mount开始挂载

  1. if (vm.$options.el) {
  2. vm.$mount(vm.$options.el)
  3. }

源码

createElement源码解析

源码地址在 vue(git clone)/src/core/vdom/create-element.js 这个我们会在虚拟dom分析

  1. export function createElement (
  2. context: Component, // vue的实例
  3. tag: any, // 我们传入的标签
  4. data: any, // 我们呢传入的数据
  5. children: any, // 下面的子元素
  6. normalizationType: any,
  7. alwaysNormalize: boolean
  8. ): VNode | Array<VNode> {
  9. // h('div', {}, 'helloworld') == h('div', 'helloworld')
  10. if (Array.isArray(data) || isPrimitive(data)) {
  11. normalizationType = children
  12. children = data
  13. data = undefined
  14. }
  15. }

源码解析到这里