背景:目前项目(后台管理系统)使用vue2.x开发,大概已经4年左右了,绝大部分功能是没什么性能问题的,也就是说不会卡顿,但是项目中未来需要开发一些功能,类似:“博思白板”这类的思维导图,还有一些数据量比较大的甘特图,不同柱状之间有连接线,目前有两套方案(Flutter、Electron),
现在领导想往flutter上走(目前组长用flutter实现了一个功能,打包出来的pc客户端比web端性能看上去要好,给出的终极理由是pc端能够吃满内存,而web端收浏览器性能限制,理论上没啥问题),但是团队小伙伴都是vue线路,更倾向后者,如果整个系统用flutter重新开发的话,心里没底,毕竟我们只是部分功能可能会比较卡,后续哪些复杂的功能如果利用flutter没有达到逾期效果,其他基础功能也没做好的话,那么小组的基本盘都丢失了。
我的想法是利用 konvajs 去做哪些复杂的功能,但是也没这方面的经验,对这个库的性能也不知道如何,今天用ai生成了一个表格,10列,大约1300行的时候,页面就显示空白了,对应减少行数则可正常显示,当然可以考虑虚拟化,一次不渲染这么多元素,但是也从侧面观察到这个库的性能如何,所以想知道该如何突破浏览器的限制,或者如何使konvajs性能更加优秀?
konva.js 创建表格例子,当rows
变量改为1300时(本人电脑),表格无法正常显示。
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>Konva.js Table with Scrollbars</title>
<script src="https://cdn.jsdelivr.net/npm/konva@8.0.3/konva.min.js"></script>
<style>
body {
margin: 0;
padding: 0;
overflow: hidden;
}
#container {
width: 100%; /* 容器宽度 */
height: 100vh; /* 容器高度,设置为视口高度 */
overflow: auto; /* 启用滚动条 */
position: relative;
}
</style>
</head>
<body>
<div id="container"></div>
<script>
// 设置表格参数
const rows = 50; // 更多的行数
const cols = 10; // 更多的列数
const cellWidth = 150;
const cellHeight = 50;
const padding = 10;
// 创建舞台
const stage = new Konva.Stage({
container: 'container', // 容器元素的ID
width: cols * cellWidth + padding * 2, // 舞台宽度
height: rows * cellHeight + padding * 2 // 舞台高度
});
// 创建图层
const layer = new Konva.Layer();
stage.add(layer);
// 绘制表格单元格
for (let row = 0; row < rows; row++) {
for (let col = 0; col < cols; col++) {
const rect = new Konva.Rect({
x: col * cellWidth + padding,
y: row * cellHeight + padding,
width: cellWidth,
height: cellHeight,
fill: '#fafafa',
stroke: '#333',
strokeWidth: 1
});
// 添加单元格点击事件
rect.on('click', function () {
alert(`Cell clicked: Row ${row + 1}, Col ${col + 1}`);
});
// 在图层上添加单元格
layer.add(rect);
// 添加文本到单元格
const text = new Konva.Text({
x: col * cellWidth + padding + 10,
y: row * cellHeight + padding + 10,
text: `R${row + 1}C${col + 1}`,
fontSize: 16,
fontFamily: 'Calibri',
fill: '#333'
});
layer.add(text);
}
}
// 渲染图层
layer.draw();
</script>
</body>
</html>