vianvio / FE-Companions

山虽高,我心已决要攀登, 路再难,绊不住我的脚跟; 因为我看到生命之路就在这里。 -- 《天路历程》
447 stars 34 forks source link

20200220 - 常敬礼 #4

Open vianvio opened 4 years ago

vianvio commented 4 years ago

问题列表:

  1. vueRouter减少数据加载的具体做法?是否还有改进空间?能否抽出一个小工具复用?如果可以抽出来,请附上github与npm包
  2. 移动端如果要看数据会新做一套吗?代码需要哪些改动?
  3. 为什么echarts移动端和pc端在一个库里,而antv会选择将pc端和移动端拆分做?
  4. 图表组件库如何抽离,组件化思路是怎样的?
  5. 整个BI项目的前后端技术架构是怎样设计的?
changjingli commented 4 years ago
  1. vueRouter减少数据加载的具体做法?是否还有改进空间?能否抽出一个小工具复用?如果可以抽出来,请附上github与npm包

做法: 在router发生变化的时候,检查vuex里是否存在数据。没有的话dispatch action发出请求,并返回一个promise,等数据获取完毕后调用next()跳转到相应页面;数据存在时直接调用next()跳转到相应页面。

改进空间: 将该操作提取为一个公共函数,公共函数返回一个Promise,通过监听thencatch判断值是否符合预期。

  1. 移动端如果要看数据会新做一套吗?代码需要哪些改动?

移动端如果要看数据,需要新做一套。 因为现在的UI、产品都是基于PC端设计的。尽管如此,目前通过在head里动态设置viewport,使得移动端暂时也可以正常访问。

目前的代码如需适配移动端过程中,个人感觉主要是产品上的修改、其次是CSS方面的调整。比如数十列的表格、复杂的组合下拉筛选、通过模态框自定义导出数据等较为繁琐的功能,在移动端在操作起来比较费力。

如果基于现有代码进行适配,前端工作量在UI适配方面,可以通过js给公共容器添加desktopmobile等类名或通过link媒体查询加载不同平台样式表;如果需要重做一套,答案参考问题4。

将公共的组件的样式抽离,使组件样式可以动态设置,通过复用减少额外的组件维护负担。

  1. 为什么echarts移动端和pc端在一个库里,而antv会选择将pc端和移动端拆分做?

由于项目没有移动端需求,加上自己从2016年开始使用echarts,所以项目选择echarts进行图表渲染。

项目开始之前,粗略看过AntV官网。AntV在流畅度、细粒程度、图像细腻程度等均优于echarts,但可能由于细粒度高的原因,同样显示一个柱状图,AntV的代码要比echarts多很多。

在回答该问题的过程中,看到了G2Plot图表,继承了AntV所有优点同时使用上更加简洁,后续项目会根据情况考虑入手。

  1. 图表组件库如何抽离,组件化思路是怎样的?

同一种类型图表的在渲染过程中,绝大部分的代码都是重复的,我把这些重复的代码提取成一个组件,将变化的部分提取为props。整个渲染过程交给图表组件、父组件仅需提供相应参数即可,无需关心渲染过程。

目前图表组件库是根据 业务 拆分的,如趋势折线图、离职原因占比等,里面的配置项也是根据业务情况写死的。组件渲染流程如下:

  1. 为组件内根容器样式height: 100%,使父级可以控制其尺寸;
  2. created:为组件根元素生成唯一id,供echarts初始化使用。
  3. mounted:初始化echarts实例,data值有效的情况下绘制图表
  4. watch data:数据发生变化时重新绘制图表

未来图表组件将会更详细抽离,通过封装类似<bi-pie>, <bi-line>, <bi-bar>等组件,使业务代码不依赖具体具体图表库,提高灵活性。使用逻辑如下 view -> component(可选) -> <bi-pie> -> (ECharts || AntV || Ohter)

  1. 整个BI项目的前后端技术架构是怎样设计的?

简易架构图如下: jianyi

vianvio commented 4 years ago

问题1做法: 在router发生变化的时候,检查vuex里是否存在数据。没有的话dispatch action发出请求,并返回一个promise,等数据获取完毕后调用next()跳转到相应页面;数据存在时直接调用next()跳转到相应页面。

这里相当于做了一个数据缓存层,那需要具体考虑缓存命中时候如何更新的问题。

问题5

架构图画的是有问题的,架构图需要将大致的技术模块描述出来,比如数据库用了什么数据库,是否只有一层数据库;往上到数据处理层怎么保证灵活性,怎么抽象的;到前端这里不能只有一个spa,需要将数据驱动视图表现出来;最后,web server指向spa没看明白是什么意思。