console.lealog();

@leader22のWeb系に関する勉強めもブログですのだ

vercel/edge-runtime のコードを読む

初手からREPLがついてたりと、なかなか洗練されてそう・・ってのが第一印象。

What is Edge Runtime | Edge Runtime

あとは`cloudflare/miniflare`のコードを読んだ身として、どういう実装になってるんやろ?ってのも気になったので。やはりNode.jsの`vm`を使ってるのか、はたまた未知のテクノロジーか・・・!

読んだのは最新の・・というか、いま時点ではまだ1コミットしかなかった。

https://github.com/vercel/edge-runtime/commit/0b11a95e2f470d278db27982e4905febc6ac9bb7

リポジトリの構成

モノレポ。

.
└── packages
    ├── format
    ├── jest-environment
    ├── primitives
    ├── runtime
    ├── types
    └── vm

この時点でわかる、やっぱ`vm`モジュール使ってそうって感じ。まぁ他にコスパのいい選択肢ないんやろうけど。

@edge-runtime/types

その名の通りの型。

`declare global {}`してくれてるので、手元でコード書くときにも使える。

https://edge-runtime.vercel.app/features/typescript-support

@edge-runtime/jest-environment

そのまんま。Jestのコンテキストを拡張してるだけ。

(Jest遅いからあんま使いたくないんよな・・`node -r`で使えるようになってるほうが嬉しい)

@edge-runtime/format

コンソールに何かしら出力するときのフォーマッタで、内部的に利用してるやつ。

`console.log(format(args))`的な使われ方をしてる。

@edge-runtime/runtime

公開されてるCLIの`bin`もここにあった。

CLI自体は、

  • REPLモードなのか
  • ファイル指定なのか
  • サーバーとしてなのか

といった分岐のハンドリングをやってる。

エクスポートされてる`EdgeRuntime`ってクラスが本体で、モジュールとして直接利用することもできるやつ。

https://github.com/vercel/edge-runtime/blob/0b11a95e2f470d278db27982e4905febc6ac9bb7/packages/runtime/src/edge-runtime.ts

次に見ていく`extends EdgeVM`してるほかは、`addEventListener()`やグローバルな例外のハンドラ、`fetch()`を内部的に呼ぶコードなどを用意してる。

@edge-runtime/vm

やはりずばりの`vm`の`createContext()`と`runInContext()`をやるための層。

https://github.com/vercel/edge-runtime/blob/0b11a95e2f470d278db27982e4905febc6ac9bb7/packages/vm/src/vm.ts

`evaluate()`っていうVMでコードを実行するメソッドがメイン。

そのほか、VMのコンテキストにコードをロードしてくる`require()`ってのがあり、CommonJSモジュールの依存解決とかもできるようになってた。(いつ何のために使うんや?)

@edge-runtime/primitives

Edgeのランタイムで利用できるグローバルなAPIたちで、さっきの`EdgeVM`のコンテキストでは事前にロードされてる。

軽いのは自前実装してるけど、全部なわけではなく、適宜npmの既存ポリフィルを使ってた。HTTPまわりはやはり`undici`だった。

https://github.com/vercel/edge-runtime/blob/0b11a95e2f470d278db27982e4905febc6ac9bb7/packages/primitives/src/index.js

まとめ

「え、コードこんだけ?少なっ」っていうのが素直な感想。

そして次に、めちゃめちゃキレイなコード・・っていう。`miniflare`(というかCloudflare Workers)より機能が圧倒的に少ない分、コードもシンプルですごく読みやすかった。

すごい汎用的なV8なEdgeランタイムのシミュレーターっていうか、Vercel Edge Functionsって、Vercel特有の何かしらってないの・・?

Edge Runtime APIs | Edge Runtime

個人的には、Node.jsの上にこういう層を実装するんではなく、なんか実行可能バイナリみたいなのが直接提供される日がそのうちできてくんのかな〜とか思ってる。ユニバーサルなやつ。