【30天Lua重拾笔记34】番外篇: Fengari - 一个JS实现的Lua,运行Lua在浏览器内吧!

几年前关注过Moonshine和lua.vm.js,不过这两个项目貌似没什麽在更新了。Fengari这个这次到又是让我为之一亮

Lua的实现真蛮多样的,光是想让Lua运行在浏览器就有不少,像是Moonshinelua.vm.jsStarlight。有些使用JS;也有些利用了WASM、emscripten。Fengari是属於前者的实现,是JS实现的版本。其除了可以在浏览器执行外,也提供了基於Node.js的执行器。这是一个蛮新兴的项目,整体设计粗浅看来也相当不错而且完整,今天会略微介绍一下,但建议可以先阅读阅读为什麽我们使用JS重写了Lua?(英文)

Fengari是希腊文「月亮」的意思

於浏览器执行Lua

将除了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

使用浏览器API

透过这一系列,你应该有感受到Lua与JS有多相像。要使用Fengari去呼叫浏览器JS API写起来非常自然,你可以透过js.global存取JS环境的globalThis,在浏览器就是window。要使用alertsetInteral等等API就非常容易。

local js = require "js"
local window = js.global

window:alert("Hello from Fengari!")

CodePen: https://codepen.io/lagagain/pen/zYqgBMj

在Node.js执行Lua

下载fengari-node-cli

npm install -g fengari-node-cli

执行fengari-cli

你也可以用fengari-cli取代lua来尝试玩玩看本系列文章。

asciicast

Fengari相关子项目

也发表於个人网站


<<:  【修正模型】4-3 事件循环(Event Loop)与任务队列(Job Queue)

>>:  Day 30: 更多的 Vue SSR

LineBot - 自动回覆 API

申请完 Line 机器人的帐号後,接下来要做的就是建立一个自动回覆的 api 程序,Line 也有提...

Day 1-开始上路罗~!

前言 主要籍由这个主题,熟悉永丰金融API的相关操作。 将系列文章 做一下规划 环境建置 API串接...

[Day 5] lock-free stack

前言 今天将会实作资料结构 stack , 之所以选择 stack 是因为其制作简单, 可以让读者轻...

Day08:Swift 基础语法—Loop

今天学习 Swift 的三种循环方式。 For-in 基本语法如下: for index in 0....

安全玻璃(Safety Glass)

尽管夹层玻璃比钢化玻璃更安全,但价格更高。尽管如此,法规要求仍可能会影响各国安全玻璃的安装。而且,作...