当前位置: 首页 > 科技观察

在Android上运行ClojureScript

时间:2023-03-17 21:59:59 科技观察

在过去的几天里,我获得了我开发生涯中最有意义的经历之一,我想在这里与大家分享。现在我们在Android上运行了ClojureScript。不是在WebView中,也不是在使用Cordova之类的东西,而是在嵌入式JavaScript引擎中实际运行。到底发生了什么?最近,我们做了一些工作来创建适用于iOS的ClojureScriptREPL应用程序Replete。整个东西看起来很酷,对应的安卓应用也勉强可以创建出来。遗憾的是,我的Android功底平平,并没有马上上手。不过在这方面,塔赫米德萨迪克的技术还是可以摆上台面的。Tahmid可以将UI组合在一起并实例化Rhino以评估JavaScript语句,但随后引导ClojureScript运行对他来说是一个挑战。但在此之前,他必须在他的应用程序中引导ClojureScript。“bootstrap”这个词是我特意标注的,指出他需要使用谷歌的Closure依赖管理系统来启动ClojureScript运行时,不需要JavaScript,也不需要其他优化(比如:none模式)。可以根据需要定义CLOSURE_IMPORT_SCRIPT环境变量。如果您想包含REPL,以这种方式包含运行时很重要。这也支持在REPL中包含源级命名空间。其实Replete也需要做这个,用到Ambly的一个功能。我当然知道Replete是一个独立的REPL,不需要Ambly。但是,我使用了一个小技巧来重用这个函数,让ClojureScript开始在Replete中运行。顺便说一句,我本来打算在ReactNative中实现Replete。事实证明,ReactNative的ClojureScript支持还处于早期阶段,可引导的ClojureScript确实是一个新生的功能,要真正发挥作用还有很多工作要做。所以,对于Replete,我会保持简单,即使Goby也不使用它。对于上面的结果,好在不需要ReactNative依赖(Android版本还没有正式对外发布),也没有Goby依赖(只支持iOS)。Replete内置的ClojureScript非常简洁,使用了传统的iOSUI,事实证明这对Tahmid完成相同功能的Android版本非常有帮助。让我们回到故事的开头:Tahmid本质上是复制了Ambly的引导逻辑,在Rhino中一条一条地按顺序执行JavaScript语句。但是他时不时会遇到一些奇怪的问题,而我在记忆中几个月前也遇到过类似的问题。在研究了Ambly的代码后,我给出了一些建议。之后,他基本上可以引导一个成功的ClosureScriptle。cljs.core.apply.call(null,cljs.core.inc,newcljs.core.PersistentVector(null,1,5,cljs.core.PersistentVector.EMPTY_NODE,[1],null))这一行是(applyinc[1])需要绑定的JavaScript代码,然后Tahmid终于有了2.0。惊人的!这应该是有史以来第一次,在基于Android的嵌入式Rhino上运行ClojureScript。接下来,您需要尝试使用阅读器、分析器和编译器。下面我们来试试看,简单的使用Replete中的JavaScript让Androidapp执行Replete的read_eval_print函数,参数是一个字符串(+12),如果正常,那么恭喜你,ClojureScript启动成功了。replete.core.read_eval_print.call(null,'(+12)')慢,执行goog.require('replete.core')时有问题;在Transit中,应该和randomUUID有关。可悲的是,看起来显然还有很多工作要做。但没关系,Replete之前一直在尝试以不同的方式加载分析缓存,感谢KarlMikkelsen,我们有一个仅使用纯JavaScript的工作版本,没有任何依赖项。用了这个之后,修复了打印回调(这样println之类的方法就可以用了),然后Tahmid通过Slack通知我:Igot3(+12)=3...然后就一直烦我,还未经允许写博客。就这样,Android上的引导程序ClojureScriptREPL诞生了!Tahmid在界面中进行了封装,修复了JavaScript/ClojureScript集成的一些小问题,并发布了Replicator。多么大的风暴!现在,Tahmid正在用JavaScriptCore替换Rhino,这不是那么快。我认为这会提高速度。这为我们在Android上使用JavaScriptCore的本机交换功能提供了一些重要的基础。从大局来看,我真的认为ClojureScript在Android上很快。特别是对于JavaScriptCore。对于这个观点,请看Bocko移植VladimirIakovlev到Android的启动速度差异。Clojure~14秒Clojure/Skummet~11秒ClojureScript~2秒多是在模拟器上运行的结果,但是,我仍然认为它表明ClojureScript真正实现了减少移动设备计算延迟的承诺。我认为是时候将ClojureScript带入生活以开发移动设备应用程序了!