几年前关注过Moonshine和lua.vm.js,不过这两个项目貌似没什麽在更新了。Fengari这个这次到又是让我为之一亮
Lua的实现真蛮多样的,光是想让Lua运行在浏览器就有不少,像是Moonshine、lua.vm.js、Starlight。有些使用JS;也有些利用了WASM、emscripten。Fengari是属於前者的实现,是JS实现的版本。其除了可以在浏览器执行外,也提供了基於Node.js的执行器。这是一个蛮新兴的项目,整体设计粗浅看来也相当不错而且完整,今天会略微介绍一下,但建议可以先阅读阅读为什麽我们使用JS重写了Lua?(英文)
Fengari是希腊文「月亮」的意思
将除了JS语言於浏览器执行的项目其实还不少。早期想跟JS打对台,直接由浏览器提供的VBScript,亦有新兴浏览器实验项目使用的Lisp;或是透过转译让浏览器了解如何执行的Fengari,还有Google推出的Dart。
与Dart.js类似,你需要先载入执行环境:
<script src='https://github.com/fengari-lua/fengari-web/releases/download/v0.1.4/fengari-web.js'></script>
这边使用了GitHub上Releases页面的JS,你也可以直接下载後载入。这样一来浏览器就可以理解怎麽处理application/lua
:
<script type="application/lua">
print("hello world!")
</script>
就先很简单的打印出hello world!你可以在console看到这段文字就表示浏览器已经了解怎麽处理script[type="application/lua"]
。你也可以载入完整档案:
<script src="/my-script.lua" type="application/lua" async></script>
CodePen: https://codepen.io/lagagain/pen/abNeZKK
透过这一系列,你应该有感受到Lua与JS有多相像。要使用Fengari去呼叫浏览器JS API写起来非常自然,你可以透过js.global
存取JS环境的globalThis
,在浏览器就是window
。要使用alert
、setInteral
等等API就非常容易。
local js = require "js"
local window = js.global
window:alert("Hello from Fengari!")
CodePen: https://codepen.io/lagagain/pen/zYqgBMj
npm install -g fengari-node-cli
你也可以用fengari-cli取代lua来尝试玩玩看本系列文章。
也发表於个人网站
<<: 【修正模型】4-3 事件循环(Event Loop)与任务队列(Job Queue)
申请完 Line 机器人的帐号後,接下来要做的就是建立一个自动回覆的 api 程序,Line 也有提...
前言 主要籍由这个主题,熟悉永丰金融API的相关操作。 将系列文章 做一下规划 环境建置 API串接...
前言 今天将会实作资料结构 stack , 之所以选择 stack 是因为其制作简单, 可以让读者轻...
今天学习 Swift 的三种循环方式。 For-in 基本语法如下: for index in 0....
尽管夹层玻璃比钢化玻璃更安全,但价格更高。尽管如此,法规要求仍可能会影响各国安全玻璃的安装。而且,作...