true

底层技术

大屏需求多数可借助高度封装的组件库/工具库较快完成,部分需求需要使用偏底层的技术进行开发,Web 端常用的底层技术如下:

  • CSS3 CSS 的最新标准,提供令人兴奋的 animation、transition、transform、gradients、filter 等属性。
  • SVG 可缩放矢量图形(Scalable Vector Graphics),是基于可扩展标记语言(标准通用标记语言的子集)的用于描述二维矢量图形的一种图形格式。
  • Canvas 2D Canvas 通过 JavaScript 来绘制 2D 图形,通过逐像素来进行渲染,可以用于动画、游戏画面、数据可视化、图片编辑以及实时视频处理等方面。
  • Canvas 3D WebGL WebGL(Web Graphic Library)是一个 JavaScript API,用于在任何兼容的 Web 浏览器中渲染 3D 图形。WebGL 程序由用 JavaScript 编写的控制代码和用 OpenGL 着色语言(GLSL)编写的着色器代码构成,这种语言类似于 C 或 C++,可在 GPU 上执行。

直接使用这些底层技术的 API 略显繁琐,社区有一些流行的基础绘图库,对这些底层技术进行轻量对封装。SVG 的有 SVGSnapRaphaël 等,Canvas 2D 的有 zrenderocanvasEaselJSPixiJS 等。

WebGIS

基础名词

地图库

地图开放平台

空间数据库

地理可视化

工具库

图表库 绘图库 动画库
ECharts three anime
HightCharts D3 mo
Chart SVG Popmotion
Chartist Snap Bounce
AntV系列 Raphaël Tween(补间动画)

表格分类注解:

图表库:主要指通过配置与数据绘制柱状图、饼图等图表的类库,使用相对简单

绘图库:主要指通过 JS 操作实例以达到制图目的的类库,开发者需要操作更多细节

地图库:主要指以地图为主体,进行空间展示、分析的类库,开发者需要有一定的地理知识储备

常见问题

定时器

在开始写一个定时器的时候,就要把定时器清除函数写出来,并在组件销毁或页面不可见时销毁,常见的定时器如下:

事件

避免对象被重复添加事件监听,尤其对 window、document、body 等添加的监听,当在组件销毁时进行移除。

性能

如果使用 vue,则数据应避免都放在data中,模版中不使用的可在 beforeCreate/created/Mounted 等时机进行声明或赋值,减少 vue 的 Observer 带来的性能损耗。

分辨率适配

使用媒体查询或 JS 计算设置 html font-size,代码中单位使用 rem。设计师通常以 16px 为基准出设计图,图的单位大概率为 px,如果每个值都自己计算转换为 rem 会比较麻烦(虽然除以都能除尽且不复杂),推荐使用 postcss-pxtorem,籍此便可在代码中都直接使用 px,编译过程中该插件会根据配置的基准值将px换算为 rem。

媒体查询:

分辨率 html font-size
1366*768 12px
1920*1080(1080p) 16px
2560*1440(2k) 22px
3840*2160(4k) 32px

js计算:

// 方法1:监听 resize 更改 font-size
const baseFontSize = 16;
const baseWidth = 1920;
function initRem() {
  const radio = document.documentElement.clientWidth / baseWidth;
  document.documentElement.style.fontSize = `${Math.round(baseFontSize * radio)}px`;
}
initRem()
window.addEventListener('resize', initRem);

// 方法2:直接使用 vw 设置 font-size
const baseFontSize = 16;
const baseWidth = 1920;
document.documentElement.style.fontSize = `${(baseFontSize / baseWidth) * 100}vw`;

为什么要用 width/1920 而非 height/1080 呢?因为在常规操作习惯下,高度发生变化时可以很方便的使用滚动条进行操作,但横向的滚动条则没那么好用,因此最好选择通过宽度进行计算。

数字单位

中文常用万进制,即万、亿、万亿···,符号常用千进制,即 K、M、G、T、P···,参考见国际单位制词头Metric_prefix

数值 中文单位 中文字母 符号单位
100 100 100 100
1000 1000 1000 1K
10000 1万 1W 10K
1000000 100万 100W 1M
1000000000 10亿 10Y 1G
10000000000000 1万亿 1WY 10T

时间参数

大屏一般都会有1天,7天,14天,30天的全局时间搜索框,需要注意定接口的时候不要前端去算开始时间和结束时间,然后把这个时间传给后端,因为客户端的时间和服务器的时间基本上是不一样的,而且客户端的时间可以随意更改

控制台

开发完成的大屏控制台不应该有日志输出和错误信息

resize事件

大屏通常不会拖动窗口,但会有全屏与非全屏的切换,因此也需要监听 window resize 事件进行处理,处理函数中需要注意操作对象是否存在或已实例化完成。

数据问题

注意进行防御式编程,对服务端接口的稳定性与可靠性持怀疑态度,深层取值用 lodash 的 get,同时注意设置默认值。

内存泄漏

在使用 three 时,如果有路由跳转或 v-if 切换组件的情况,需要在组件销毁时调用相应实例(scene、render、material、texture等)的 dispose 方法销毁实例,如果使用了 three 的 group,可通过 group.remove(item) 移除对 item 的引用。更多 dispose 信息见How to dispose of objects

echarts 的 size 适配

echarts 的很多 size 设置,单位只支持 px,如果屏幕要适配大小屏幕的时候,就会出现尺寸要么太小要么太大,这时可以提供一个 getSize 函数,传入基于 1080p 下的 size 得到相应尺寸的 size,如有需要监听 resize,还需在 resize 的时候重新计算与设置 option:

function getSize (size = 0) {
  const width = document.documentElement.clientWidth
  return size * width / 1920
}
Last Updated: 9/18/2019, 8:10:47 PM