皆さんこんにちは。デザイアグランプリに参加したい おっくんです。
去る 2022 年 8 月 25 日に Deno 1.25 がリリースされました。 今回も、リリースノートを参考に 変更事項の気になるところを紹介します。
Deno 1.25
Deno 1.25 での変更事項をDeno 1.25 リリースノートを元に確認します。
deno init コマンドが追加
Deno で新しくプロジェクトを始めるためのスキャフォールディングするコマンド deno init
が追加になりました。
次のように使用します。
$ deno init -h deno-init Initialize a new project USAGE: deno init [OPTIONS] [dir] # <== ディレクトリも掘ってくれるのが便利 ARGS: <dir> OPTIONS: -h, --help Print help information -q, --quiet Suppress diagnostic output --unstable Enable unstable features and APIs # プロジェクトを初期化 $ deno init ✅ Project initialized Run these commands to get started deno run main.ts deno test # アプリケーション実行 $ deno run main.ts Add 2 + 3 = 5 # テスト実行 $ deno test main.ts Check file:///usr/src/app/1_25/main.ts running 0 tests from ./main.ts ok | 0 passed | 0 failed (16ms)
初期化すると、アプリケーションとテストの 2 つのファイルが作成されます。
これだけで、Deno での開発への入口に立てました。 作成されたのはファイル 2 つでも、既にリンター、フォーマッターなどツール群が既に使える環境なのが Deno のいいところです。
この機能は、github issues でフィードバックを求めているので、ぜひ協力したいところです。
unstable な npm サポートの追加
Deno で外部のモジュールの呼び出しをする場合、CDN の URL などを使用してきました。 この手段に乗る形で npm を使用するには、モジュールを変換してくれる CDN を使用することで、次のように使用することができました。
import rainbowLog from "http://esm.sh/@kridt/rainbowlog";
Deno 1.25 から unstable な機能として、npm 指定子(npm:
) を使用することで CDN での変換を咬ませずに npm パッケージを使用することができます。
npm 指定子のフォーマットは、次のようになっています。
npm:<package-name>[@<version-requirement>][/<sub-path>]
リリースノートを参考に、express を動かすには次のように実装します。
[main.ts]
import express from "npm:express@4"; const app = express(); const port = 8080; app.get("/", function (req, res) { res.send("Hello World"); }); app.listen(port); console.log(`listening on http://localhost:${port}/`);
以下のコマンドで起動しました。
# パーミッション の設定、--unstable の指定を実行 $ deno run --allow-net --allow-env --allow-read=. --unstable main.ts # => パッケージ読み込みでエラーに # モジュールの再読み込みを行うオプション --reload を指定 $ deno run --allow-net --allow-env --allow-read=. --unstable --reload main.ts listening on http://localhost:8080/ # => 起動OK # 以降は --reload をつけずに動作OK $ deno run --allow-net --allow-env --allow-read=. --unstable main.ts
npm install
するようなことなく、CDN から取得するモジュールのように使用できます。
では、パッケージはどこに保管されているか?という部分は気になるところですが、/deno-dir/npm/registry.npmjs.org/
にありました。
$ deno info
DENO_DIR location: /deno-dir/
Remote modules cache: /deno-dir/deps
Emitted modules cache: /deno-dir/gen
Language server registries cache: /deno-dir/registries
Origin storage: /deno-dir/location_data
$ ls /deno-dir/npm/registry.npmjs.org/
accepts cookie-signature express http-errors mime-db proxy-addr setprototypeof
array-flatten debug finalhandler iconv-lite mime-types qs side-channel
body-parser depd forwarded inherits ms range-parser statuses
bytes destroy fresh ipaddr.js negotiator raw-body toidentifier
call-bind ee-first function-bind media-typer object-inspect safe-buffer type-is
content-disposition encodeurl get-intrinsic merge-descriptors on-finished safer-buffer unpipe
content-type escape-html has methods parseurl send utils-merge
cookie etag has-symbols mime path-to-regexp serve-static vary
普段の CDN から取得するモジュール群は、/deno-dir/deps/
以下に保管されており、区分が違っていることが察せられます。
また、npm パッケージバイナリも次のように直接実行することができます。
$ deno run --unstable --allow-env --allow-read npm:cowsay@1.5.0 Hello there! ______________ < Hello there! > -------------- \ ^__^ \ (oo)\_______ (__)\ )\/\ ||----w | || ||
これまで確認した express や、cowsay では、環境変数やファイル読み込み権限を要求します。 将来的にこれらの要求はなくなるそうです。
また、このリリースに関連してこれまであった node 互換モードの --compat
が削除になりました。
今までこの機能を前提として、書いていたものがあれば、今回の npm:hogehoge
の形式で書き換えていく必要があります。
何か問題が有れば、報告することが推奨されているので、こちらも可能な限り協力していきたいですね。
実際 5~6 種類の npm パッケージを試しましたが、試した中で 1 件だけ、動作しないものを見つけました。報告しておきたいと思います。
また先述の通りパッケージ読み込みの中でエラーになったことがありましたが、その際は --reload
をつけて実行することで回避できました。
もし引っかかったら、試してみてください。
新しい実験的な HTTP サーバー API が追加
Deno 1.25 から、 新しい実験的な HTTP サーバーが導入になりました。こちらは現在 unstable です。 ベンチマークでは最速をたたき出しており、プレーンテキスト hello-world を返す応答が、Node.js 対比で 4 倍、既存の Deno の HTTP サーバー実装対比で 3 倍のスループットを出しています。
呼び出し方は、std/http
の serve()
同様に、Deno.serve()
を記述します。
詳細なドキュメントは doc.deno.land にあります。
[new_server.ts]
Deno.serve(() => new Response("Hello, world!"), { hostname: "0.0.0.0", port: 8080, });
次のように実行します。
$ deno run --allow-net --unstable new_server.ts
リリースノートには npm:react
で呼び出した React を使用した SSR の例も乗っているので、そちらもぜひ参照してみてください。
現在は、HTTP 1.1 のみのサポートになっており、HTTP/2 のサポートや応答本文の圧縮など計画されているそうです。
近日公開されるブログで、HTTP サーバーのパフォーマンスについて、詳細な解説が有るようです。 楽しみに待ちましょう。
その他
- 依存関係分析の改善による、起動時間の高速化
- FFI APIの改善
- Uint8Array と
- 新しい buffer 型の追加
- Deno.UnsafePointerViewAPI に3つのメソッドが追加
- Deno.UnsafePointerView#getCString
- Deno.UnsafePointerView#getArrayBuffer
- Deno.UnsafePointerView#copyInto
まとめ
今回の npm:
を使用した npm パッケージの呼び出しはこれまでの node 互換モード(--compat) と異なり、node_modules を使用せず、より Deno 側の思想に npm を載せたような形になっています。
Deno の好きなところの 1 つは repl で import を書いてそのまま動かせる点、一旦 npm install
しなくて済む点です。
その運用方法に乗れることがとてもありがたいことです。
今回のリリースにより Vite が Deno で動かせたと報告も上がっており、これでより移行を検討してみる方も増えるのではと想像しています。
また、HTTP サーバーの高速化については、直近でパフォーマンスの高さを強く打ち出した Bun が立ち上がり、この数カ月で高速化を主戦場にした JS ランタイム戦国時代化したような印象を持っています。 適切なライバルが登場したことにより、より進化が進んだことは喜ばしいことです。 これから Bun の発展も見込まれるため Deno と相互に、また Node.js や WinterCG などのワーキンググループでの活動を含めた発展が期待できるものと考えています。
次回のリリースも追いかけていきます。
P.S.
採用
虎の穴では一緒に働く仲間を絶賛募集中です!
この記事を読んで、興味を持っていただけた方はぜひ弊社の採用情報をご覧下さい。
yumenosora.co.jp
LINEスタンプ
エンジニア専用のメイドちゃんスタンプが完成しました!
「あの場面」で思わず使いたくなるようなスタンプから、日常で役立つスタンプを合計40個用意しました。
エンジニアの皆さん、エンジニアでない方もぜひスタンプを確認してみてください。
store.line.me