innerHTML 把 JSON 字符串塞进一个隐藏的 里再解析。这种做法看似简单,实际埋下了多重隐患:
- JSON 中如果包含单引号,或者未转义的 HTML 字符(比如
<、&),会导致 JavaScript 解析失败,甚至引发 XSS 攻击 - 使用
innerHTML插入后还需要额外调用JSON.parse(),增加了出错的可能性;而直接通过fetch或模块导入的数据天然就是 JS 对象,更加省心 - 如果数据量很大,服务端渲染会将整个 JSON 塞进 HTML,页面体积急剧膨胀,首屏加载变慢,并且浪费了浏览器缓存
更稳妥的做法是:前端使用 fetch('/api/chart-data') 直接拉取数据,再传递给图表实例;或者使用 data-* 属性存储一些轻量级元信息(例如 data-chart-type="line"),具体数据仍然通过 API 获取。
响应式容器塌缩时图表不显示的根因
很多模板里图表突然“消失”,并不是 JavaScript 报错,而是容器的宽高变成了 0。原因非常直接: 或 的父级没有设置尺寸,CSS 里也未写 width: 100%,导致可视化库在计算渲染区域时得到的是 0×0。
Chart.js 默认启用了 responsive: true,但它仅监听父容器尺寸的变化,并不会主动撑开容器本身。ECharts 的 resize() 方法同样如此,依赖容器具备真实的尺寸才能生效。
- 务必为图表容器的外层添加一个带有明确
width和height的,例如 - 不要只依赖
flex或grid子项自身的flex: 1,父容器必须拥有一个可计算的高度(比如min-height或固定height) - 使用 Chrome DevTools 的 Layout Inspector 查看元素的 computed size,比靠推测更准确
最容易被忽略的一点是:图表初始化之后,窗口大小发生变化或浏览器 tab 切换回来时,必须手动调用 myChart.resize() 或 myEcharts.resize(),否则图表不会自动适应新尺寸。
