幾年前關注過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來嘗試玩玩看本系列文章。
也發表於個人網站