网上那么json格式化工具,为什么要重复造个轮子呢?
原因说出来好简单:
这个工具上线第一天,网友就复制了一个5万行的json去体验,然后直接卡死了,然后跟我说,你这用户体验不好啊,人家vscode都是轻松显示的...
是的,他说的对。如果真的有很多人格式化这么大数据量的json的话,那是可以深入研究一下。
技术实现简单说,就是判断isArray还是isObject,还是基本类型,然后递归遍历,然后增加格式化排版,设置颜色。
这里说一下wasm,我开始还是想使用wasm了,但是因为在chrome内核的浏览器里,v8的性能实在是太强大了,wasm在json格式化上也比不了,但是在safri或者firefox里,wasm格式化json的速度就比js快一点点了。所以最终只使用了js,同时配合worker来实现主线程不卡顿,没有用wasm。
wasm我用rust开发的,已经全部使用「&」进行引用传递,尽量不复制的方式了,但是从js到rust,从rust返回给js时,还是要多花一些时间了,毕竟wasm与js之间并不是我们想像中的那样完全内存共享。
结论:对于json的操作,js已经优化的很好了,wasm此时无法发挥明显作用。
这里说一下实现过程中遇到的问题,最开始我的方式是把所有递归格式化后的结果都平铺化成一维数组, 倒是没问题,但是在增加折叠展开功能的时候,问题就来了,我试验了通过id,parentId的方式来寻找子节点来实现隐藏, 但是性能实在是太差了,不得不放弃,于是局部重构,格式化后的数据依然是嵌套的方式,这样,最终渲染出div的时候也是嵌套的,在做折叠展开时就可以只操作一个根div。大大提高了性能。