前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >Vue源码中compiler部分逻辑梳理(内有彩蛋)

Vue源码中compiler部分逻辑梳理(内有彩蛋)

作者头像
大史不说话
发布于 2019-09-12 02:15:12
发布于 2019-09-12 02:15:12
41800
代码可运行
举报
运行总次数:0
代码可运行

一. 简述

compiler模块Vue框架中用于模板编译的,它的作用就是将Vue中的组件模板转换成render函数,render函数在运行时可以生成虚拟节点vnode,它是Vue中虚拟DOM树的基本实现流程。完整版的Vue是包含runtimecompiler的,也就是说模板的编译过程可以在运行时进行,这无疑是一种性能负担。Vue官方也提供了独立的runtime版本,其中只包含运行时环境,把从templaterender函数的生成部分放在构建时完成(利用vue-templete-compiler模块),以提高运行时的效率。

由于跨平台需求,compiler模块的实现过程步骤稍多,不断地利用高阶函数来拆分整体逻辑,不是很容易阅读,本篇对该模块的基本流程进行一个梳理,再参考文末彩蛋推荐的电子书,就比较容易看懂了。

二. 编译流程

相关入口在实例挂载函数$mount的实现中:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
Vue.prototype.$mount = function(){
    const options = this.$options
    //....
     const { render, staticRenderFns } = compileToFunctions(template, {
        shouldDecodeNewlines,
        shouldDecodeNewlinesForHref,
        delimiters: options.delimiters,
        comments: options.comments
      }, this)
      options.render = render
      options.staticRenderFns = staticRenderFns
    //....
    return mount.call(this, el, hydrating)
}

可以看到实例挂载方法$mount的逻辑就是在调用mount方法前在实例的$options添加了额外的信息。此处调用的compileToFunctions方法经历的逻辑跳转了多层高阶函数,涉及文件也比较多,直接上图比较清楚:

笔者将涉及函数简化为输入输出的形式:

核心逻辑步骤如下所示:

梳理完流程,整个编译流程的宏观流程也就相对清晰了,这里为了兼顾不同平台的方法差异,将有差异的部分提取为独立的模块,然后作为函数参数注入执行函数,这种通过高阶函数来组织代码的方式能提高核心逻辑的聚合程度,如果是普通的业务逻辑,很可能会是以扁平化串联调用的形式来编写方法的,笔者个人认为两种模式没有绝对的优劣对比,虽然高阶函数看起来更高级。

本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2019-09-10 ,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
暂无评论
推荐阅读
Echarts请求不同格式的json数据处理
在前面已经说到过关于Echarts请求json数据处理: 【前端统计图】echart折线图ajax请求json数据: https://www.jianshu.com/p/9e5c7e2cff05
王小婷
2019/10/15
3.2K0
Echarts请求不同格式的json数据处理
ECharts折线图渲染json格式数据(格式为数组)
ECharts折线图渲染json格式数据(json格式,为数组) 需要对数组进行循环取值,将取到的值分别赋值给x轴和y轴
王小婷
2021/04/09
3.3K0
ECharts折线图渲染json格式数据(格式为数组)
ECharts多图表与后台交互
ECharts多图表与后台交互 多图表交互目前暂时的想法是多绑定一个DOM 1、效果: 2、test2.html <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <title>Title</title> <!--引入Echarts文件--> <script src="js/echarts.min.js"></script> <script src="js/jquery-3.4.1.mi
别团等shy哥发育
2023/02/25
1K0
ECharts多图表与后台交互
Echarts饼状图交互数据
前面写到一个关于Echarts饼状图交互数据的例子,但是当时name是写死的,现在的value和name都是需要从后端获取,然后渲染在界面,大致的json数据是这样的: 模拟一个json格式的数据:
王小婷
2019/09/25
2.2K0
Echarts饼状图交互数据
Echarts+ajax实现一个简单折线图
<!DOCTYPE html> <html> <head> <meta charset="UTF-8"> <title></title> <script src="https://cdn.staticfile.org/jquery/2.1.1/jquery.min.js"></script> <script src="https://cdn.bootcss.com/echarts/4.2.1-rc1/echarts.min.js" ty
王小婷
2020/12/08
1.3K0
Echarts隐藏背景的网格线
网格线未处理之前,默认是这样的,这个背景的网格线,我们现在如果不需要,就去掉吧。 Echarts隐藏背景的网格线属性 yAxis: { splitLine: {show: false}, }, 示例代
王小婷
2021/04/09
1.6K0
Echarts隐藏背景的网格线
【前端统计图】echart折线图ajax请求json数据
先上图,写了一个echart折线图ajax请求json数据的小demo,帮助自己更好的理解图表知识。
王小婷
2019/07/16
1.4K0
【前端统计图】echart折线图ajax请求json数据
ECharts与Excel的火花
ECharts和Excel作为两种广泛使用的数据处理和可视化工具,各自拥有其独特的魅力和功能。
绿毛龟
2024/01/19
4750
ECharts与Excel的火花
ECharts与java后台交互绘制图表
为了方便,这里就不用SSM框架的Controller查数据库了,自己造几个数据传到前台,测试效果和查数据库是一样的
别团等shy哥发育
2023/02/25
8020
ECharts与java后台交互绘制图表
SpringBoot 2.xECharts+AJAX实现异步数据加载
1、JavaBean package cn.hadron.eba.bean; import java.io.Serializable; public class UserBean implements Serializable{ private String username; private Double salary; public UserBean(){} public UserBean(String username,Double salary){
程裕强
2019/05/27
8390
Echarts统计图自适应
之前做折线图的时候,y轴数据都是写成固定了的,如果是统计步数的话,y轴坐标就要根据走了多少步来自适应了,如果没写的话,就会出现以下的这种情况,折线超出了整个坐标抽,就是一个bug了,只要修改一下属性即可,今天写一下Echarts统计图自适应。
王小婷
2019/11/27
1K0
Echarts饼状图数据交互请求ajax自定义颜色
normal : { color : function(params) { //自定义颜色 var colorList = [ '#2059be', '#198577', '#a8674e' ]; return colorList[params.dataIndex] } } 示例: <!DOCTYPE html> <html> <head> <meta charset="UTF-8"> <title></title> <script src="http
王小婷
2019/11/27
8030
ajax+json实现echarts多个统计图显示
前端时常会遇到这样的问题,有一个单独的模块用作统计图,将多个折线或者柱状图,混合使用,下面的例子是用ajax+json模拟了调用接口实现echarts多个统计图显示。 样式布局暂时就不放在上面了,以下是从项目里面复制过来的一个小的demo,代码仅供参考。
王小婷
2025/05/19
940
Echarts饼状图大小及其位置调整
饼状图大小 radius: '45%', center: ['50%', '35%'], 图例的位置 legend: { orient: 'vertical', /* x: 'left', y: 'top', */ textStyle: { //图例文字的样式 c
王小婷
2020/04/10
7.1K0
Echarts饼状图大小及其位置调整
Echarts设置背景的网格线为虚线
用Echarts写了一个折线图之后,现在不太喜欢背景网格线的实线 需要改成虚线 Echarts设置背景的网格线为虚线的关键属性 yAxis: { splitLine: {
王小婷
2021/04/09
4.3K0
Echarts设置背景的网格线为虚线
Echarts的饼状图变成环形图
首先实现一个饼状图 <!DOCTYPE html> <html> <head> <meta charset="UTF-8"> <title></title> <script src="https://cdn.staticfile.org/jquery/2.1.1/jquery.min.js"></script> <script src="https://cdn.bootcss.com/echarts/4.2.1-rc1/ec
王小婷
2020/11/24
1.8K0
Echarts的饼状图变成环形图
Echarts与SSM框架交互
Echarts与SSM框架交互 1、实现效果: 数据库表结构 名 类型 注释 id varchar 宿舍分配编号 alreadyNumber int 已住人数 allNumber int 可住人数 status varchar 是否住满 sex varchar 男生/女生宿舍 2、前端代码: <!--宿舍分配情况可视化--> <div class="col-sm-12"> <div class="ibox-content"> <
别团等shy哥发育
2023/02/25
4660
Echarts与SSM框架交互
Echarts饼图之-玫瑰图数据交互
文档: https://echarts.apache.org/examples/zh/index.html#chart-type-pie
王小婷
2021/07/08
1.3K0
ECharts加载json数据解决方案
json数据 https://echarts.baidu.com/examples/data/asset/data/aqi-beijing.json
王小婷
2019/05/07
5.3K1
ECharts加载json数据解决方案
Echarts饼图实现颜色渐变
主要代码: normal: { color: function(params) { var colorList = [ { c1: ' #fce5ca', //管理
王小婷
2019/11/27
6.7K0
相关推荐
Echarts请求不同格式的json数据处理
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档