美文网首页
(1)从Vue的入口文件开始

(1)从Vue的入口文件开始

作者: 摘片叶子 | 来源:发表于2019-12-18 21:42 被阅读0次

    Vue的两个版本

    • Runtime Only

      这个版本Vue在Webpack编译的时候就将template模板预编译成了render函数,所以这个版本既减小了打包的大小,又提高了运行时的效率

    • Runtime + Compiler

      这个版本没有对代码进行预编译,所以template会在APP运行的时候来编译,在编译的过程中对性能会有一定的损耗。

    如果是在代码里有动态传入template,那么就必须使用带编译器版本的Vue

    new Vue({
      template: '<div>{{ hi }}</div>'
    })
    

    入口开始

    src/platforms/web/entry-runtime-with-compiler.js
    

    在这里对Vue对象加上了相应运行环境的方法,主要是以下几个比较重要的

    • virtualDom的patch方法
    import { patch } from './patch'
    // install platform patch function
    Vue.prototype.__patch__ = inBrowser ? patch : noop
    
    • mount

    vue先在src/platforms/web/runtime/index.js中将mount函数进行赋值,之后又在 ```src/platforms/web/entry-runtime-with-compiler.js```中对mount函数进行重新赋值。

    第一个$mount函数的作用是真正的挂载Vue组件到DOM上的方法

    第二个$mount函数是将Vue的template编译成了render函数

    -------------------->src/platforms/web/runtime/index.js 
    
    /*组件挂载方法*/
    Vue.prototype.$mount = function (
      el?: string | Element,
      hydrating?: boolean
    ): Component {
      /*获取DOM实例对象*/
      el = el && inBrowser ? query(el) : undefined
      /*挂载组件*/
      return mountComponent(this, el, hydrating)
    }
    
    
    -------------->src/platforms/web/entry-runtime-with-compiler.js
    
    /*把原本不带编译的$mount方法保存下来,在最后会调用。*/
    const mount = Vue.prototype.$mount
    
    /*挂载组件,带模板编译*/
    Vue.prototype.$mount = function (
      el?: string | Element,
      hydrating?: boolean       //服务端渲染的参数
    ): Component {
      el = el && query(el)
      
      const options = this.$options
      // resolve template/el and convert to render function
      /*处理模板templete,编译成render函数,render不存在的时候才会编译template,否则优先使用render*/
      if (!options.render) {
        ...
        ...
        ...
        /*将template编译成render函数,这里会有render以及staticRenderFns两个返回,这是vue的编译时优化,static静态不需要在VNode更新时进行patch,优化性能*/
        if (template) {
          const { render, staticRenderFns } = compileToFunctions(template, {
            shouldDecodeNewlines,
            delimiters: options.delimiters
          }, this)
          options.render = render
          options.staticRenderFns = staticRenderFns
        }
      }
      /*调用const mount = Vue.prototype.$mount保存下来的不带编译的mount*/
      return mount.call(this, el, hydrating)
    }
    

    从上面一直看到Vue,那么这个Vue对象是哪里来的呢?多跳几个import语句就能看到
    它其实在core/instance/index中定义的

    function Vue (options) {
      /*初始化*/
      this._init(options)
    }
    
    initMixin(Vue)
    stateMixin(Vue)
    eventsMixin(Vue)
    lifecycleMixin(Vue)
    renderMixin(Vue)
    
    export default Vue
    

    可以看到非常的优雅(ps:看起来很少的意思,只有几行。在我们做new Vue()这个操作的时候,就是调用它的_init函数这个过程。下面几个函数的调用,是对Vue.prototype上挂上各种方法,_init方法也是在这里挂上的。接下来就要开始看这些方法到底给Vue挂上了什么啦!!!

    相关文章

      网友评论

          本文标题:(1)从Vue的入口文件开始

          本文链接:https://www.haomeiwen.com/subject/hjkpnctx.html