WebGL-Native: 脱Node.jsの作戦を考える会
prev: https://zenn.dev/okuoku/scraps/fdfaff96dbf16f
next: https://zenn.dev/okuoku/scraps/efa3e214ee8348
脱Node.jsの残件とは..?
前回までで、Node.jsやnpmモジュールへの require()
をほぼなくすことができた。つまりJavaScriptエンジンに NCCC の呼出し機能があれば、 wasm2c と自前のWebGL実装を駆使してWebGLゲームが遊べる状態になっている。
ただ、今でも、
- NCCC実装はNode.jsというかN-APIで実装しているため、N-APIをサポートしたJavaScriptエンジンでなければならない
- ローカルのモジュールの参照には依然
require
を使っている
という点がある。とりあえず、ECMAScript 5の実装であるDuktapeに移植することを考えてみよう。。Rollupか何かでバンドルして、BabelでES6機能を削ってしまえば行けるんじゃないだろうか。
前準備
とりあえず、excludeするモジュールを指定しやすいように、最終的に残ったNode.js依存部分を port-std.js
(Node.jsの標準ライブラリ) と port-native.js
(NCCC実装) に分割した。
const fs = require("fs");
const crypto = require("crypto");
const perf_hooks = require("perf_hooks");
module.exports = {
performance_now: perf_hooks.performance.now,
fs_readFileSync: fs.readFileSync,
crypto_randomFillSync: crypto.randomFillSync,
};
スッカリ忘れてたけど、randomとか performance.now
が依存部として有ったね。。まぁ大した機能じゃないし後まわし。
適当にrollup.jsの設定を書いてexclude。
変換後のを実行してみる
file:///C:/cygwin64/home/oku/repos/cwgl/jstestapp/duk.mjs:4354
var _instantiate = _asyncToGenerator( /*#__PURE__*/regeneratorRuntime.mark(function _callee(obj, imports) {
^
ReferenceError: regeneratorRuntime is not defined
... Babel が変換する async
って勝手にランタイムをimportしてくれたりはしないのか。。手動で
import "regenerator-runtime/runtime.js";
を書いておいて、かつ、 Rollupjsの @rollup/plugin-node-resolve
プラグインでResolveした上で挿入してやる必要がある。
今回は rollup.config.js
でNode.js専用のモジュールはexcludeしているので、変換後のスクリプトをNode.jsで実行するには
import PortStd from "./port-std.js";
import PortNative from "./port-native.js";
のような import
を変換後のスクリプトの先頭に追加する。