🍃このブログは移転しました。
3秒後、自動的に移動します・・・。

Cloudlflare Workersの、Node.jsとの互換性について

3月くらいにもなんか発表されてた気がするけど、結局いまどういう状態やっけ?って思ったので、思い出しついでにまとめる。

Node.js compatibility for Cloudflare Workers – starting with Async Context Tracking, EventEmitter, Buffer, assert, and util

2パターンある

最初はよくわからなかったけど、どうやら、

  • `nodejs_compat`
  • `node_compat`

という2つのフラグが存在してる。最初はフラグ名くらい統一しろよ・・って思ってしまったけど、これらは別のやつ。

ちなみに、`node_compat`のほうはLegacy扱いらしく、これらを併用することはできなそう。

nodejs_compat

Node.jsのAPIの一部を、CFWのランタイムでも動かせるようになるフラグ。

一部というのは、現状でいうと、

  • `node:assert`
  • `AsyncLocalStorage, AsyncResource` from `node:async_hooks`
  • `Buffer` from `node:buffer`
  • `EventEmitter` from `node:events`
  • `promisify, callbackify, types` from `node:util`

だけ。

Node.js Compatibility · Cloudflare Workers docs

ポリフィルムではなくCFWとして実装されてるので、パフォーマンスもサイズもヨシってところがポイントで、今後の拡充にこうご期待という触れ込み。

`workerd`的にはこのへんに実装が増えていく。

https://github.com/cloudflare/workerd/tree/main/src/node
https://github.com/cloudflare/workerd/tree/main/src/workerd/api/node

`wrangler dev`をローカルでやりたい場合は、通常の`--local`ではなく`--experimental-local`をあわせて使う必要がある。(そのうちexperimentalじゃなくなるらしい)

`wrangler@v2.20.0`時点では、`nodejs_compat`自体をCLIから渡す方法はなさそうで、`wrangler.toml`に書くしかない模様。

node_compat

こっちは、Node.jsのAPIポリフィルがロードされるようになるフラグ。

実態は、

ってだけ。

https://github.com/cloudflare/workers-sdk/blob/738e52f13f141a5d8ba13a299cf106a9477b9df2/packages/wrangler/src/bundle.ts#L409

さっきのと違って、これは単なるポリフィルなので、ファイルサイズも増えるし、思わぬ挙動の差異に出くわすかもしれない。

こっちは`--node-compat`っていうCLI引数がある。

おまけ: Outbound TCP

思い返せば2021年末くらいの話だったが、まだ一般人向けではなく、アクセスフォームがあるだけ。

https://www.cloudflare.com/database-connectors-early-access/

ただ内部的には着々と進んでる感があって、先日も中の人たちが盛り上がってたので、近いうちにナニカあるかもしれない?

James Ross on Twitter: "Cloudflare is looking at releasing TCP Workers very soon, allowing users to connect to any TCP service using Workers. This can include things like databases, such as in this example. It's going to be super exciting to see what everyone builds with this! 🎉 The native API is… https://t.co/LLEYHCPGeE" / Twitter