【笔记】前端早早聊-如何设计与实现思维导图可视化方案

1,195 阅读2分钟

组织者:前端早早聊

分享人:泽辉,小米

应用场景

  • web版的xmind,支持定制需求。应用于测试用例管理。
  • 智能制造工艺流程、资产原型管理、前端能力地图管理、小米笔记思维导图。自定义节点、节点间的连接。

起步面临的问题

  • 技术选型繁多
  • 有些选型不再迭代
  • 可控制集成扩展有限,比如支持DOM自定义、扩展至React/Vue
  • 业务组件化诉求高,定制化需求无法开箱即用,二次开发成本高

目标

  1. 满足丰富的应用场景
  2. 技术层面定制化程度高。底层可控、算法可控、工作流可控。

技术选型

底层使用D3.js

  • 控制粒度精细
  • 成熟产品丰富

方案设计

mife-graphic实现方案

1.引擎

  • D3.js、Echarts、Antv、mife-graphic.core

2.Component扩展

  • Component.chart

  • Component.flow

  • Component.okr

  • ...

3.Editor/React/Vue上层封装

  • Hina-Editor、Sale-Manage...

物料市场

各个组件 -> 不同的组合 -> 不同的功能需要

Graphic API

Constructors

  • constructor

Properties

  • data
  • gLink
  • gNode
  • gTransform
  • gZoom ....

Methods

  • resizeUpdate
  • setTransform ...

通过继承这一层组件可以开发更多的底层组件。

简单实现

selection-init

export function svgInit(this: Core.Graphic, selection: d3.Selection<any, any, any, any>) {
  const { clientWidth, clientHeight } = this.options.container;

  this.svg = selection
    .append('svg')
    .attr('viewBox', [0, 0, clientWidth, clientHeight].join(' '))
    .style('width', `${clientWidth}px`)
    .style('height', `${clientHeight}px`)
    .style('position', 'absolute')
    .style('top', '0')
    .style('left', '0')

  return this.svg;
}

selection-event

selection-update

...

实现都比较容易理解,这里不一一例举了。

方案设计核心原则

单一职责原则

  • 一个程序只做好一件事
  • 如果功能过于复杂就拆分开,每个部分保持独立

开放/封闭原则

  • 对扩展开放,对修改封闭
  • 增加需求时,扩展新代码,而非修改已有代码

目标达成

Mind脑图

  • 布局/编辑/折叠
  • 历史记录/复制粘贴

OKR扩展

  • React扩展
  • 子节点全自动布局

性能和扩展

性能优化粒度可控,达到最小Funtion。

对主流框架扩展性保持良好,未来底层考虑扩展Canvas/WebGL。

数据推荐

《数据可视化(40位数据设计师访谈录)》