Echarts 源码解读 一:zrender源码分析1var zr = zrender.init(document.getElementById(‘main‘));

article/2025/9/21 3:17:06

2021SC@SDUSC

    因为Echarts是基于zrender进行实现的,所以解读echarts源码前,首先要对zrender有基本的了解。

    zrender是canvas的一个类库,zrender是基于canvas实现的。

目录

zrender的src文件夹 

文件夹:

animation动画相关

contain包含判断

core核心代码,包含一些工具(util.js)、事件(event.js)、唯一ID(guid.js)、矩阵运算有关(matrix.js)等

dom dom事件有关

graphic 图形有关,shape文件夹下就是各个图形的js文件

mixin混入模式要混入的函数

tool工具函数,包括颜色工具(color.js)、path工具(path.js)和转换工具(transformPath.js)

vml IE中的画笔,vml解释

全局文件:

config.js配置文件

Element.js元素文件,作为zrender最基本的元素

Handle.js C层,控制层

Layer.js图层管理

Painter.js V层,视图层

Storage.js M层,数据管理层

zrender.js入口

zrender整体架构

zrender 采用MVC 封装

M为Model数据层,V为View视图层,C为Controller控制层:

  • Storage(M):Storage为zrender中的Model层,它主要进行图形数据的增删改查(CRUD)操作;
  • Painter(V):Painter为zrender中的View层,它主要对canvas元素的生命周期进行管理,渲染视图以及控制更新等。定义了addHover、setBackgroundColor等方法;
  • Handler(C):Handler为zrender中的Controller层,它主要实现事件交互处理,实现完整dom事件的模拟封装。

 图形

处于graphic文件夹下,zrender定义了一系列图形,供外界调用,包括圆形、矩形、心形、扇形、多边形、折线等,echarts通过调用zrender定义好的图形,可以很便捷地完成图表渲染。

Displayable

Displayable.jsPath、Text等的基类,继承自Element,定义了setStyle、useStyle等方法

TEST

文本,继承自Displayable,调用了helper/text.js中的renderText方法进行绘制。主要代码如下:

export function renderText(hostEl, ctx, text, style, rect, prevEl) {style.rich? renderRichText(hostEl, ctx, text, style, rect, prevEl): renderPlainText(hostEl, ctx, text, style, rect, prevEl);
}

文本分为富文本以及普通文本进行分别渲染,它们均通过调用canvas的ctx.fillText或ctx.strokeText 等api进行文本渲染,具体实现可以查看helper/text.js文件。

Style

图形的样式文件,定义了基本的样式属性,以及样式set、clone以及判断等方法。

Path

path为图形的基类,继承自Displayable,定义了buildPath、getBoundingRect、setShape等方法,其包含this._style属性即为Style对象实例。

Shape

shape文件下存放着zrender定义的图形文件,扩展自Path。

Circle

圆形,通过调用Path.extend方法进行扩展,重写了buildPath方法,buildPath调用了canvas api:ctx.arc进行圆形的绘制,主要实现代码如下:

buildPath: function (ctx, shape, inBundle) {if (inBundle) {ctx.moveTo(shape.cx + shape.r, shape.cy);}ctx.arc(shape.cx, shape.cy, shape.r, 0, Math.PI * 2, true);
}

入口(zrender.js)

初始化

init调用:

var zr = zrender.init(document.getElementById('main'));

源码:进入init方法,A、初始化Zrender,B、将其存入Zrender实例map索引

zrender初始化,不让外部直接new是为了提供全局可控同时减少全局污染、降低命名冲突的风险

var instances = {};    // ZRender实例map索引
var zrender = {};
zrender.init = function(dom, opts) {var zr = new ZRender(guid(), dom, opts);instances[zr.id] = zr;return zr;
};

构造函数

可以在构造函数中,看到MVC的管理机制

// zrender.js
/*** ZRender接口类,对外可用的所有接口都在这里!!* storage(M)、painter(V)、handler(C)为内部私有类,外部接口不可见* 非get接口统一返回支持链式调用~** @param {string} id 唯一标识* @param {HTMLElement} dom dom对象,不帮你做document.getElementById** @return {ZRender} ZRender实例*/
function ZRender(id, dom) {this.id = id;this.env = require('./tool/env');                // 浏览器环境识别用this.storage = new Storage();                    //shape数据CURD管理this.painter = new Painter(dom, this.storage);    //canvase元素生命周期管理,视图渲染,绘画,更新控制this.handler = new Handler(dom, this.storage, this.painter);//事件交互处理,实现完整dom事件模拟封装// 动画控制this.animatingShapes = [];this.animation = new Animation({stage : {update : getAnimationUpdater(this)}});this.animation.start();
}

每次绘图前,都清空画布

// zrender_demo.html
zr.clear();

zrender执行清空时,清空storage后,再执行painter的clear()方法

// zrender.js
/*** 清除当前ZRender下所有类图的数据和显示,clear后MVC和已绑定事件均还存在在,ZRender可用*/
ZRender.prototype.clear = function () {this.storage.del();this.painter.clear();return this;
};


http://chatgpt.dhexx.cn/article/wKRRyMta.shtml

相关文章

高效canvas绘图框架——zrender

一个轻量级的Canvas类库,MVC封装,数据驱动,提供类Dom事件模型,让canvas绘图大不同 Architecture MVC核心封装实现图形仓库、视图渲染和交互控制: Stroage(M) : shape数据CURD管理Painter(V) : canvase元素生命周期管理…

轻量级的Canvas类库zrender使用笔记 :简单自定义图件开发

ECharts,一个纯 Javascript 的图表库,底层依赖轻量级的 Canvas 类库 ZRender,提供直观,生动,可交互,可高度个性化定制的数据可视化图表。当然我们自己可能有些需求,通过修改ECharts或者highchar…

vue-echarts的ZRender事件

首先贴出 vue-echarts 的官网连接:https://www.npmjs.com/package/vue-echarts 1、vue-echarts 具体在vue中的使用方法,本文中就暂时不多介绍了; 2、如何在vue中使用vue-echarts的鼠标事件: 具体使用方式跟vue中使用echarts一样&a…

ZRender文档研读 (基于4.3.2版本)

ZRender文档研读 (基于4.3.2版本) 不使用最新的5.x.x的版本是因为线上文档和最新版本JS文件不匹配-2022年6月13日 1、文档地址 1、官方文档的地址:https://ecomfe.github.io/zrender-doc/public/api.html#zrenderdisplayable 2、Github地址…

【ZRender 渲染引擎 - 贰】 | Vue 框架集成与绘制其他图元

theme: cyanosis 持续创作,加速成长!这是我参与「掘金日新计划 10 月更文挑战」的第 8 天,点击查看活动详情 1. Vue 中使用 ZRender 上一篇中,我们通过最原始的方式体验了一下 ZRender 的使用。接下来,为了更方便管理…

zrender实现图形缩放功能

zrender实现图形缩放功能 一、绘制一个矩形图 <div id"main-container"></div>#main-container {width: 500px;height: 300px;border: 1px solid #888; }import * as zrender from zrenderconst container document.querySelector(#main-container) c…

ECharts 3.0底层zrender 3.x源码分析1-总体架构

zrender是一个轻量级的Canvas类库&#xff0c;作为百度Echarts 3.0的底层基础。截至目前查看的zrender源码和文档&#xff0c;包括官网文档都还停留在2.x时代&#xff0c;我打算用一个系列介绍下zrender 3.x的使用和源码&#xff0c;一些demo和没有在博客中介绍的源码请进我的g…

ZRender (Canvas)简单使用(拖拽、缩放、旋转、文字、层级)

一、ZRender 是二维绘图引擎&#xff0c;它提供 Canvas、SVG、VML 等多种渲染方式。ZRender 也是 ECharts 的渲染器&#xff1b; 二、下面是以图片做的简单demo&#xff0c;分为左中右三部分&#xff0c;左边是需要的图片&#xff0c;中间是绘图部分&#xff0c;右边是添加文字…

源码解读之zrender-ZRender 类(3)

00 小结 当我们在 zrender.init(document.getElementById(“canvas”))时&#xff0c;首先实例化了一个 ZRender 实例&#xff0c;在这个实例化过程中&#xff0c;主要实例化了&#xff1a; Storage 类&#xff0c;作用类似于全局状态管理Painter 类&#xff0c;可以理解为画…

【ZRender 渲染引擎 - 壹】 | 基础图形元素绘制

theme: cyanosis 持续创作&#xff0c;加速成长&#xff01;这是我参与「掘金日新计划 10 月更文挑战」的第 7 天&#xff0c;点击查看活动详情 开篇前言 在掘金认识我的都知道&#xff0c;我主要是研究 Flutter 的。其实我一直希望开发出一套好用的 Flutter 的图表库&#xf…

zrender学习

这个是项目总结&#xff0c;不适合学习 <div id"canvas" style"background-image:url(./canvasbg.gif)"></div> 定义zrender初始化对象&#xff0c;背景是一个gif图 样式如下 ↓ 工程里&#xff0c; topo.html <div id "containe…

zrender源码学习笔记(一):认识zrender

本文内容 入门zrender绘制原理 入门zrender zrender是Echarts底层的2D绘图引擎&#xff0c;在搞懂其原理之前&#xff0c;我们先学会如何使用zrender&#xff0c;我们从绘制一个简单圆形入门。这里也给出官网入门教程 初始化 zrender.init(dom)初始化zrender实例&#xff0c…

zrender 知识:使用zrender搭建流程图工具

首先看下最终的效果图&#xff1a; 主要使用的技术是zrender.js和vue.js&#xff0c;zrender 用于实现流程图&#xff0c;vue搭建整体架构。 本篇文章主要面向对zrender有一定了解的同学。 本篇文章只讲解核心flowchart的实现方法。 一.分析 流程图主要包含节点node、联系e…

zrender基础入门,简单的案例图形绘制

一、简单介绍 ZRender是二维绘图引擎&#xff0c;它提供 Canvas、SVG、VML 等多种渲染方式。ZRender也是ECharts的渲染器。 流程图&#xff1a; 二、使用入口 (1)npm install zrender&#xff0c;因为zrender不是浏览器自带不同于前面的canvas与svg&#xff0c;需要先下载 …

二维绘图引擎ZRender

1、开始使用 描述 ZRender是二维绘图引擎&#xff0c;它提供 Canvas、SVG、VML 等多种渲染方式。ZRender 也是 ECharts 的渲染器。 下载 ZRender 项目在 gitHub ,也可以使用 npm install zrender 下载。 在 dist 目录下找到 zrender.js 和 zrender.min.js&#xff0c;前者是开发…

MATLAB中求矩阵的特征值和特征向量

矩阵特征值的数学定义 设A是n阶方阵&#xff0c;如果存在常数λ和n维非零列向量x&#xff0c;使得等式Axλ x成立&#xff0c;则称λ为A的特征值&#xff0c;x是对应特征值λ的特征向量。 求特征值和特征向量&#xff1a; eig(A)&#xff1a;求矩阵A的全部特征值&#xff0c…

简单易懂的特征值与特征向量

特征值与特征向量是线性代数中一个很基础的知识&#xff0c;但是很多人对这两个概念没有一个直观的概念&#xff0c;从直觉上&#xff0c;很难理解这两个东西&#xff0c;只知道公式&#xff0c;但是不知道它代表的意义。当年上现代课的时候&#xff0c;老师根本不会去讲这些东…

特征值和特征向量的几何意义

1. 特征值和特征向量 我们首先回顾下特征值和特征向量的定义如下&#xff1a; A x λ x Ax\lambda x Axλx 其中A是一个 n n n\times n nn的实对称矩阵&#xff0c; x x x是一个n维向量&#xff0c;则我们说 λ \lambda λ是矩阵A的一个特征值&#xff0c;而 x x x是矩阵A的…

特征值和特征向量的通俗解释

我们知道&#xff0c;特征向量的公式是 ​​​​​​​ ​​​​​​​ ​​​​​​​ ​​​​​​​ ​​​​​​​ ​​​​​​​ 其中A代表矩阵&#xff0c;x代表特征向量&#xff0c;代表特征值。 众所周知&#xff0c;特…

对特征值和特征向量的理解

Agenda 1. 特征值和特征向量1.1 特征值和特征向量的通俗解释1.2 如何计算矩阵的特征值和特征向量1.3 特征多项式1.4 特征值和特征向量的性质 1. 特征值和特征向量 在讨论特征值和特征向量之前&#xff0c;必须声明的是现在我们关注的是有限维 线性空间上的线性变换。这里两个关…