vue3.0源码,vue3开发

  vue3.0源码,vue3开发

  对于源代码的重要性,我相信不用多说什么,尤其是对于Vue框架。一般面试官在面试的时候都会或多或少的考察一下源代码的内容。下面这篇文章主要介绍vue3源代码分析简单实现的相关信息,有需要的朋友可以参考一下。

  

目录

  序言准备vue3使用实现总结

  

前言

  最近由于我的第一台vue3 ts正式立项,已经进入验收阶段。你总是说vue3和vue3,我就想看看vue3和vue2有什么区别。

  本文主要阐述了vue3的API用法,并简单实现了一个vue3。我们来感受一下vue3和之前的vue2的区别。并且简单带你揭秘一个在源码中vue3初始化的过程。

  

准备工作

  要看vue3内部的源代码是怎么回事,首先就像vue2的源代码分析一样,先从github下载下一个源代码到本地。

  然后安装依赖项:

  纱线忽略脚本

  执行该命令时,您可能会遇到node版本太低的错误:

  要解决这个问题,您可以升级您的node版本或忽略引擎。

  如果您选择忽略它,您可以设置它。

  纱线配置设置-忽略-引擎真

  然后执行相关安装。

  依赖项安装完成后,编译打包生成vuejs文件:

  纱线开发

  如果调试需要,可以在packages\vue\examples文件下创建一个测试文件。packages \ vue \ dist \ vue . global . js可以应用于引用的vue文件。

  

vue3用法

  vue3的特点我就不细说了。就vue3的用法来说,更倾向于函数式编程。通过在Vue中公开createApp()API,以工厂函数的形式创建了一个应用实例。相比vue2的新Vue例子,更贴切。

  在源文件中,我们创建一个新的init.html文件。

  脚本src=./dist/vue . global . js /脚本

  身体

  div id= app“{ name } }/div

  脚本

  const { createApp }=Vue

  const app1=createApp({

  data() {

  返回{

  名称:“克莱因”

  }

  },

  setup() {

  返回{

  姓名:邓

  }

  }

  }).挂载(#app)

  /脚本

  /body

  根据上面的例子,我们可以看到vue3同时支持Composition API和Options API,可以同时使用。

  但是,我们可以看到,在数据和设置中,我使用了一个名称变量进行赋值。那么页面中会显示哪一个呢?

  3!2!1!关于答案:

  可以清楚的看到,setup在composition-api中的优先级更高。

  当然,你也可以在源代码的packages \ runtime-core \ src \ componentpublicinstance . ts中看到。可以先判断setup中的变量是否存在,再判断data中的变量。因此,设置中的变量比数据中的变量具有更高的优先级。

  

实现

  通过上面的用法,我们可以知道vue3中会暴露一个Vue变量,里面有createApp、reactive等方法。

  在这里,我们首先实现vue3的初始化框架。就createApp而言,它会接收用户传入的参数:data()、setup()等。最后挂载实例。所以createApp中会接收到一些参数选项,里面会有一个mount方法。

  const Vue={

  createApp(选项){

  返回{

  挂载(选择器){//解析,获取渲染,挂载

  }

  }

  }

  }

  通过mount中的选择器获取主机元素。

  下一步是模板的编译。模板编译成AST后,还需要转换成render函数。这里,我们简化了操作,在编译时直接返回一个渲染。

  挂载(选择器){//解析,获取渲染,挂载

  const parent=document . query selector(选择器)

  console.log(父);

  如果(!options.render) {

  //编译并返回渲染

  options . render=this . compiletofunction(parent . innerhtml)

  }

  },

  compileToFunction(模板){

  返回函数render() {

  const h=document . createelement( div )

  h.textContent=this.name

  返回h

  }

  }

  获得渲染后,执行它,将其添加到主机元素,并删除旧节点。

  在执行渲染时,我们需要注意它的这个指向。如果将数据绑定到它,它显示的内容将在数据中产生名称。

  挂载(选择器){//解析,获取渲染,挂载

  const parent=document . query selector(选择器)

  console.log(父);

  如果(!options.render) {

  //编译并返回渲染

  options . render=this . compiletofunction(parent . innerhtml)

  }

  //执行渲染

  const El=options . render . call(options . data())

  parent.innerHTML=

  parent.appendChild(el)

  },

  你可以看到页面上显示的是clying。相反,如果options.setup()被绑定,邓就会出现在页面上。

  对于vue3的使用,我们知道setup的优先级高于data。那么我们可以使用代理,通过代理将两者的属性变量结合起来,优先设置。当访问相同的名称时,实际访问的是setup中的名称。

  挂载(选择器){//解析,获取渲染,挂载

  const parent=document . query selector(选择器)

  console.log(父);

  如果(!options.render) {

  //编译并返回渲染

  options . render=this . compiletofunction(parent . innerhtml)

  }

  if (options.setup) {

  this.setupState=options.setup()

  }

  if (options.data) {

  this.data=options.data()

  }

  this.proxy=新代理(this,{

  get(target,key) {

  if(键入target.setupState) {

  return target.setupState[key]

  } else if (key in target.data) {

  返回target.data[key]

  }//可能还有道具、手表等其他同名变量。

  },

  set(target,key,value,newVal) {

  console.log(target,key,value,new val);

  }

  })

  //执行render this.proxy是为了整合设置和数据的上下文。

  const El=options . render . call(this . proxy)

  console.log(el,options . render);

  parent.innerHTML=

  parent.appendChild(el)

  },

  在代理的get中,首先看目标属性在setup中是否存在。如果存在,它将在setup中返回属性变量,否则它将在data中。渲染时,可以直接传入集成变量集。当然proxy里会有一个set方法,需要先表示出来,然后外部修改变量才能触发。有兴趣的同学可以在这里自学!

  

总结

  关于vue3源代码分析的简单实现的这篇文章就到这里了。更多相关vue3源代码分析内容,请搜索我们之前的文章或者继续浏览下面的相关文章。希望大家以后能多多支持我们!

郑重声明:本文由网友发布,不代表盛行IT的观点,版权归原作者所有,仅为传播更多信息之目的,如有侵权请联系,我们将第一时间修改或删除,多谢。

留言与评论(共有 条评论)
   
验证码: