一年前看到 bramblex 大佬用 js 写了个js 解析器,觉得很好玩,于是自己也实现了一个,叫sval。一开始实现 es5 和部分 es6,本来想着写着玩一玩就算了,所以也没太上心,估摸这破玩意儿也不会有人用。结果没想到还真的有老外在用,还提了一些 issue。有人反馈了一些 bug,有人问某些特性是不是支持等等,但是大家还是希望支持 async/await
但是刚好又到了毕业季,一直忙着写论文,就没有怎么搭理这部分 issue,主要就是修修 bug 什么的。这段时间论文差不多写完了,就寻思把后面的特性也给实现了
可是在实现 generator 的时候卡住了,因为解析的时候都通过递归 dfs 遍历 ast 的,如果要自己保存状态给 yield 出来会十分的蛋疼。一开始想着把 ast 通过后续遍历给拍平,但在节点进行处理的时候仍然会遇到循环(for/while 等),还是得保存状态,这个就不好怕平的。最后实在没办法,把所有的节点处理函数都改成 generator,递归的时候通过 delegate 一层一层把 yield 表达式给暴露处理,然后用 typescript 给编译一下
有了 generator,实现 async/await 的时候就方便多了,无非就是加个类似 co 的库而已。于是就能吹一波了(逃...
搭了个 PlayGround 给大家玩玩,戳这里
后面可能会基于 sval 做热更新的库玩玩,基本思路就是服务端做解析生成 ast,直接丢给客户端用 sval 去跑更新,然后 export 出来调用,当然性能不会太好了。目前在自己笔记本上,sval 把自己“自举”一遍,大概 7000 行吧,都要 200ms 左右的时间,而且内存占用应该也不少,只是我还没去看过
最后放上一个项目地址吧:https://github.com/Siubaak/sval,如果真有人用的话,帮忙提下 bug 吧...
这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。
V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。
V2EX is a community of developers, designers and creative people.