Jasper Ji

平常心

最近在看WebAssembly的东西,觉得Rust写基于WebAssembly的Web应用好像是不错的选择。另外Rust这门语言,很早就听说的了,后来也买了《Rust权威指南》这本书,只是简单的翻了翻,并没有做过什么项目。于是就起了个备忘录的简单项目。

Yew

有点类似React,用起来还是比较顺手了。目前版本迭代还是相当的快,我一开始用的0.19.0的版本,最后因为一个库的关系,直接选择了最新的版本,版本之间还时存在兼容问题。我打包后有2M,相比传统的还是比较大了,不过可能是是没有优化的结果。在代码里面写Html,主要的问题是格式化的问题,vscode里面一格式化代码后,html的代码就乱了。

问题

Yew本身提供的文档还可以,有问题看看文档也能解决。主要的问题是wey_sys的一些库的使用,比如我想使用IndexedDB这个东西,其实JS版的文档很好看懂,Rust版的就有点不知所措,主要还是我对Rust了解不够,再加上这些库并没有特别全的文档,所以折腾半天。比如设置IndexedDB回调的问题,参数显示js_sys::Function,我想着那就构造个Function出来,结果翻遍文档没有看到如何构造的例子,最后解决方案是闭包转Function的方式,一开始也是报错,提示闭包已久被销毁了,后来发现官方的例子有点问题,最后修复了。

另外因为要在几个页面间共享一些数据,想着写个单例吧,发现不那么简单,找了个lazy_static这样库,提示*mut u8` cannot be shared between threads safely这样的错误,最终还是停了下来。

总结

Rust的学习曲线比较陡,主要是很多语法不同于传统的C体系,所以感觉原来的经验无法施展,而且沿着经验的思路反而会比较绕,发现还是得按Rust的方式解决问题。

上次去省图偶然看到了《WebAssembly 实战》一书,之前就有关注到,于是就借了回来,刚好趁清明假期看看。之前有写过一篇《初试WebAssembly》,本身Rust语言不熟,虽然我买了本《Rust权威指南》,但一直没有什么项目可以练手,基本上没有进展。《WebAssembly 实战》一书是基于C/C++的,相对来说读起来障碍不大。实际我也跑了一个例子试了下,当然如果真拿C/C++来写Web应用的话,估计会很奔溃了。接着我又看了好几个关于WebAssembly的视频演讲,发现有了新的想法。

推出WebAssembly这个东西主要是因为现有的优化已经无法满足性能的进一步提升了,语言肯定不能大改了,JS这么用的广。记得早些年使用Flash的时候,那会是在嵌入式上跑AS2,性能的问题真的是让我当时无语。后来又推出了AS3性能又大幅的提升,但是很长一段时间,我们公司的引擎没有升级,所以我基本上还是用AS2。虽然现在的Web开发没有像当年那样,毕竟开放的环境还是不一样。回到正题,如果单纯的写WebAssembly的话,好像也没有这个必要,而且据说和JS的调用开销不小,所以到底什么时候用,是个问题。反过来想要是哪天整个的Web可以大部分都用WebAssembly来写的话,那就好了,不过目前还不能直接操作Dom,这是一个很大的问题,理论和JS是相互调用的,我看到Rust有个web_sys的库,可以操作dom,不过我想应该也是自己实现的吧。目前看到几个Rust的例子,是直接用WebAssembly来写整个的Web应用的,比如Yew这个Rust的框架允许你构建基于WebAssembly的应用。另外微软的Blazor,允许使用C#来编写基于WebAssembly的单页应用。还有Go的Vugu。

所以如果和JS混着用,那么实际上是把WebAssembly作为一个计算密集型的一个解决方案吧,实际开发中大部分的Web应用都是些轻客户端,主要还是界面相关的操作了,其实大部分情况下很难想到用WebAssembly了,这也是我最早尝试时的感想。但是如果未来解决了类似调DOM的成本比较高的的问题,那么有没有可能Web语言变成Rust为主,为什么是Rust呢?首先WebAssembly本身没有垃圾回收,内存是手动处理了。Rust呢?标榜的是一个没有垃圾回收的安全语言,与C/C++相比实际上是语言层面上处理内存管理的问题。这么一想Rust与WebAssembly真是绝配,当然其他的语言也可以编译成WebAssembly,但对于垃圾回收的语言,是比要实现一个垃圾回收的运行时环境,这样性能上就会有折扣。

总结

想来想去,最终落到Rust这个语言上了,或者说WebAssembly本身的设计这种在底层改变的东西无疑为未来提供了各种改变的可能性,即使不是Rust也许会是其他的语言。C/C++用户可以让现有的库移植到Web上使用,另外Web应用一定是现在这样的轻客户端的类型吗?WebAssembly的引入确实提供另一种可能。另外一定要用JS来写Web应用吗?过去是没有办法,但是底层的改变让未来可以使用统一基于WebAssembly的语言来写Web成为了可能,而不像过去所有新的语言实际上都得编译成JS。基于WebAssembly的框架,有微软这样的大厂,也有基于Go的,某种程度这是一场大厂利好的事,但坏处是当有各种的语言可以写Web时,会不会有点分裂,毕竟只学一个JS,大家共用资源,而用不同的语言有学习成本。

本站14年建立的,那会Octopress确实流行,好多的技术大拿都用,可惜当时只是建了个站,就没有写东西,后来想写东西了,发现大家都不用Octopress了,有人说慢,其实我的电脑上还行。一开始我也没有想着换,Octopress的问题是作者已经不更新了,所以就有一堆的升级的问题,总之对于程序员而言也无所谓,改改还是可以用的,就这样一直坚持到写这篇文章的晚上。

我比较在意代码高亮,上次就把Octopress的代码高亮给改了,不过不完美。其实博客很大程度是我的一些技术的记录了,想想这个,就一时兴起尝试的迁移吧。虽然静态博客框架很多,不过自己最近3年一直有写JS,另外Hexo确实很多人用。这次的迁移可以说相当的顺利。Hexo的文档非常不错,基本上照着来网站就好了。原来想着在Github再建一个项目,后来发现不需要,直接把我旧的网站一覆盖就可以了。

使用的主题是NexT,我比较喜欢简洁的,这个主题的文档也非常不错,很快就搞定了,看着焕然一新的博客,Octopress已成过去时了。

0%