初手からREPLがついてたりと、なかなか洗練されてそう・・ってのが第一印象。
あとは`cloudflare/miniflare`のコードを読んだ身として、どういう実装になってるんやろ?ってのも気になったので。やはりNode.jsの`vm`を使ってるのか、はたまた未知のテクノロジーか・・・!
読んだのは最新の・・というか、いま時点ではまだ1コミットしかなかった。
https://github.com/vercel/edge-runtime/commit/0b11a95e2f470d278db27982e4905febc6ac9bb7
リポジトリの構成
モノレポ。
. └── packages ├── format ├── jest-environment ├── primitives ├── runtime ├── types └── vm
@edge-runtime/types
その名の通りの型。
`declare global {}`してくれてるので、手元でコード書くときにも使える。
@edge-runtime/jest-environment
そのまんま。Jestのコンテキストを拡張してるだけ。
(Jest遅いからあんま使いたくないんよな・・`node -r`で使えるようになってるほうが嬉しい)
@edge-runtime/format
コンソールに何かしら出力するときのフォーマッタで、内部的に利用してるやつ。
`console.log(format(args))`的な使われ方をしてる。
@edge-runtime/runtime
公開されてるCLIの`bin`もここにあった。
CLI自体は、
- REPLモードなのか
- ファイル指定なのか
- サーバーとしてなのか
といった分岐のハンドリングをやってる。
エクスポートされてる`EdgeRuntime`ってクラスが本体で、モジュールとして直接利用することもできるやつ。
次に見ていく`extends EdgeVM`してるほかは、`addEventListener()`やグローバルな例外のハンドラ、`fetch()`を内部的に呼ぶコードなどを用意してる。
@edge-runtime/vm
やはりずばりの`vm`の`createContext()`と`runInContext()`をやるための層。
`evaluate()`っていうVMでコードを実行するメソッドがメイン。
そのほか、VMのコンテキストにコードをロードしてくる`require()`ってのがあり、CommonJSモジュールの依存解決とかもできるようになってた。(いつ何のために使うんや?)
@edge-runtime/primitives
Edgeのランタイムで利用できるグローバルなAPIたちで、さっきの`EdgeVM`のコンテキストでは事前にロードされてる。
軽いのは自前実装してるけど、全部なわけではなく、適宜npmの既存ポリフィルを使ってた。HTTPまわりはやはり`undici`だった。
まとめ
「え、コードこんだけ?少なっ」っていうのが素直な感想。
そして次に、めちゃめちゃキレイなコード・・っていう。`miniflare`(というかCloudflare Workers)より機能が圧倒的に少ない分、コードもシンプルですごく読みやすかった。
すごい汎用的なV8なEdgeランタイムのシミュレーターっていうか、Vercel Edge Functionsって、Vercel特有の何かしらってないの・・?
個人的には、Node.jsの上にこういう層を実装するんではなく、なんか実行可能バイナリみたいなのが直接提供される日がそのうちできてくんのかな〜とか思ってる。ユニバーサルなやつ。