虎の穴ラボ技術ブログ

虎の穴ラボ株式会社所属のエンジニアが書く技術ブログです

MENU

Deno 1.25 へのアップデートと変更事項まとめ

皆さんこんにちは。デザイアグランプリに参加したい おっくんです。

去る 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 の形式で書き換えていく必要があります。

github.com

何か問題が有れば、報告することが推奨されているので、こちらも可能な限り協力していきたいですね。

実際 5~6 種類の npm パッケージを試しましたが、試した中で 1 件だけ、動作しないものを見つけました。報告しておきたいと思います。

また先述の通りパッケージ読み込みの中でエラーになったことがありましたが、その際は --reload をつけて実行することで回避できました。

もし引っかかったら、試してみてください。

新しい実験的な HTTP サーバー API が追加

Deno 1.25 から、 新しい実験的な HTTP サーバーが導入になりました。こちらは現在 unstable です。 ベンチマークでは最速をたたき出しており、プレーンテキスト hello-world を返す応答が、Node.js 対比で 4 倍、既存の Deno の HTTP サーバー実装対比で 3 倍のスループットを出しています。

呼び出し方は、std/httpserve() 同様に、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