deno はこれ。
Node.js 作った人が今度は TypeScript で作り直してるっていう話らしい。
yosuke-furukawa.hatenablog.com
で、今はまだまだ実用段階ではないんだけど、一応それなりには動く模様。
ぜひ!私もコアには手を出せなそうなので、ユーティリティ書けたら書きたいなと思ってます。なにせTSファイル一つ書いてどこかにアップロードするだけなので気軽ですね
— はっしゅろっく (@hashedrock) 2018年12月22日
まじで、置いとけば動くの。
うおー本当だ。なにこれ楽しい!
試しに作ってみた
deno で Elm のライブリロード。
こんな感じで起動して、ソースの .elm
ファイルを更新するとコンパイルしたついでに画面が更新される。
deno ../index.ts src/Main.elm src/index.html --port=3001 --allow-net --allow-run
以下が一通り試せるので、お題の選定として最適っぽい。
- 引数処理
- ファイル読み込み
- プロセスの実行
- HTTP サーバー
感想
ついさっき知ったことをそのまま横流しに紹介するスタイル。 ちゃんとした紹介はあとで誰かにしてほしい。
deno https://...
一番面白い点としては、やはりモジュールがインターネットから降ってくるところ。1回目でフェッチして2回目以降はキャッシュを使うのでオフラインでも大丈夫。--reload
をつけると読み直す。~/.deno
につないだ場所とか履歴とか生成した JS とか source map とか諸々置いてある。
「いやいやそんな適当なモジュール管理でいいわけないでしょ」っていう反応に対していくつか考えが述べられている(けど、もう少し詳細に知りたい気持ちはある)。 https://github.com/denoland/deno/blob/master/Docs.md#linking-to-third-party-code
バージョンは URL で一意に決まるから npm とか package.json みたいなやつはいらなくて、その辺は例えば package.ts
を用意するとかしてアプリケーションコードで管理してくださいとのこと。随分と思い切るなー。
特定の操作に許可が必要
フラグをつけないとファイルに書き込んだりネットにアクセスしたりできない。V8 のサンドボックス機能を活かした形。
--allow-write Allow file system write access. --allow-net Allow network access. --allow-env Allow environment access. --allow-run Allow running subprocesses.
サンドボックスの外とはシリアライズされたデータでのみやりとりが出来る。
deno/msg.fbs at master · denoland/deno · GitHub
とにかく Promise (async/await) を使う
標準から Promise API で溢れているので、もうとにかく async/await し放題。将来的にはトップレベルでも await したいとのこと。あと Unhandled なんとかはもれなくエラー。
型付き API ドキュメント
嬉しい!
まだ洗練されていない印象はあるものの、ちゃんと型を辿っていけば正解にたどり着けるようになっていた。すごい。
まだ楽に色々出来る状況ではない
今提供されている API はかなり最低限のもので、ファイルを読むにもオープンしてバッファにデータ詰めてデコードして最後にクローズ、というのをやる必要があり結構だるい。TextDecoder
/ TextEncoder
とか知らないと辛いんだけど、調べてもすぐに出てこないので「目の前に string
があるけど API が要求しているのは UInt8Array
でどうしよう」みたいな事に、よくなる。
HTTP サーバーはなんとか動くレベル
一応、標準ライブラリがある。
が、 HTTP サーバーは基本機能もまだ怪しくて、headers
に Content-Length
を正しく入れてやらないとコネクションが閉じず、ブラウザから1秒おきに fetch()
すると7リクエスト目から通信不可能になってしまった。あと最近まで POST の body が読まれないことがあったらしいとか、そういう状況。
引数処理が楽
同じく標準ライブラリの flags
なんだけど、これだけのために deno を使いたいくらい良く出来てる。
これが npm の argv
相当で、他にも npm の chalk
相当の color
とか、「それが欲しかったんだよ!」っていうのが用意されててとにかく嬉しい。
他に面白そうな要素
今回は通らなかったけど、 deno のネイディブ側は Rust で動いているらしく、deno を Rust 内で使うにはこのクレートを使えばよいそうだ。楽しそう。
貢献のチャンス
今なら既存の何かを deno 用に書き直すだけでワンチャンありそうだし、 deno 独自の特徴を活かした面白いものが色々作れるかも。 腕に自信のある方は是非。