虎の穴開発室ブログ

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

MENU

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

皆さんこんにちは。おっくんです。

去る 2023 年 9 月 20 日に Deno 1.37 がリリースされました。 今回も、リリースノートを参考に 変更事項の気になるところを紹介します。

Deno 1.37

Deno 1.37 での変更事項をDeno 1.37 リリースノートを元に確認します。

Jupyter Notebook インテグレーション

Deno を Jupyter Notebook カーネルとして使用するサポートが Deno 1.37 から登場します。

セットアップを Windows 10 環境で実施してみましたので、紹介します。 Python とpip がインストールされていることを前提とします。

$ python -V
Python 3.10.6

$ deno -V
deno 1.37.0

$ pip install jupyterlab
$ pip install notebook
$ pip install jupyter-console

$ deno jupyter --unstable
ℹ️ Deno kernel is not yet installed, run `deno jupyter --unstable --install` to set it up

$ deno jupyter --unstable --install
[InstallKernelSpec] Installed kernelspec deno in C:\Users\hoge\AppData\Roaming\jupyter\kernels\deno
✅ Deno kernelspec installed successfully.

$ jupyter console --kernel deno
Jupyter console 6.6.3

Welcome to Deno kernel
In [1]: let a = 1

In [2]: a
Out[2]: 1

In [3]:

CLIで Jupyter から Deno が呼び出せているのがわかるかと思います。 notebook は次のように起動します。

$ jupyter notebook

新規作成すると、カーネルの選択肢に Deno が候補として出てきます。

CLIでの確認と同じものを入力してみました。動作していることが確認できます。

Jupyter のカーネルに Deno を選択すると、Deno のすべてのAPIとnpm モジュールにアクセスができます。 リリースノートでは、使用例として D3 を使ってのビジュアライズや、Deno KV を使用しての分析が紹介されています。

テスト機能の改善

実行速度の向上

テスト実行のパフォーマンスの改善が行われたことで、1秒当たり最大で14000件のテストを実行できるようになったそうです。 パフォーマンスの向上は、テストランナーのサニタイザーを最適化することで行われ、このことでオーバーヘッドを3ミリ秒から0.1ミリ秒まで短縮されました。

TAP(Test Anything Protocol) 形式のテスト出力をサポート

Deno 1.36 では、JUnit 形式や dot 形式のテストレポーターが追加されていました。 Deno 1.37 では、Test Anything Protocol 形式がサポートされました。

動作させると次のようになります。

$ deno test --reporter=tap .\main_test.ts
TAP version 14
# ./main_test.ts
ok 1 - addTest
ok 2 - SubTest
ok 3 - mulTest
1..3

テストのフィルタリングの簡潔な記述

Deno.test.onlyDeno.test.ignore の二つのAPIが追加されました。 この二つは、既存のテストのフィルタリングをより簡潔に記述することができます。

https://docs.deno.com/runtime/manual/basics/testing#filtering

ここでは、ignore に絞って旧来の書き方と新しいAPIを比較します。

[test.ts]

import { assertEquals } from "https://deno.land/std@0.201.0/assert/mod.ts";
import { add } from "./main.ts";

// 実行されるテスト
Deno.test(function addTest() {
  assertEquals(add(2, 3), 5);
});

// 旧来の書き方の ignore されるテスト
Deno.test(
  {
    ignore: true,
  },
  function SubTest() {
  assertEquals(add(2, 3), 5);
});

// Deno.test.ignore を使用した ignore されるテスト
Deno.test.ignore(function mulTest() {
  assertEquals(add(2, 3), 5);
});

トライアンドエラーで部分的にignore したいときに、比較的詳細にオプションを渡している旧来のAPIよりも簡潔に書けるようになりました。

品質の向上

  • --filter によりフィルタされたテスト以外の出力を抑制
  • ASCII エスケープ文字 がテストレポータの出力を壊さないように調整された
  • --trace-ops フラグを付与した際、寄り多くの情報を出力するようになりました。
  • only オプションと --filter フラグでは、 --filter が優先されます
  • JUnitレポーターに詳細情報を追加
  • カバレッジレポートに Deno 内部コードが除外されるようになった。

Node.js 互換性の向上

Node.js API への多数の修正が、Deno 1.37 に含まれています。 数多くのリストについて列挙されていますが、中でも npm モジュール mssql mineflayer infiscal web-push などがテスト済みモジュールとして記載されています。

機能改善

キャッシュオーバーライドとしての vender

deno vender hoge によって依存関係を hoge の依存関係を vender ディレクトリ以下にダウンロードする機能を持っています。 vender 以下に保存された依存関係は、deno vender によって作られたimport-map を参照するように、--import-map=vendor/import_map.json をつける事で参照されます。

この機能が --vendor の付与 もしくは、deno.json への設定追加で使えるようになりました。

動作確認してみます。

$ cat .\main.ts
import * as cowsay from "npm:cowsay"
import { z } from "https://deno.land/x/zod/mod.ts";

console.log(cowsay.say({ text: "Hello World!" }))

const mySchema = z.string();
console.log(mySchema.parse("Hello World!"))

$ cat .\deno.json
{
  "tasks": {
    "dev": "deno run --watch main.ts"
  },
  "vendor": true
}

$ ls
deno.json  main.ts

$ deno run --allow-read main.ts
 ______________
< Hello World! >
 --------------
        \   ^__^
         \  (oo)\_______
            (__)\       )\/\
                ||----w |
                ||     ||
Hello World!

$ ls
deno.json  deno.lock  main.ts  node_modules  vendor

確認のため、npm: 指定子を使ったモジュール読み込みも行いましたが、 vender と node_modules のふたつが作成されている事が確認できます。

こちらの機能は unstable なものになっています。

Import Attributes プロポーザルのサポートを追加

TC39 で協議されているImport Attributes プロポーザルについて、サポートが入ります。

これまで import 属性は、次のような assert を記述するものが取り入れられていました。

import jsonData from "./deno.json" assert { type: "json" };

このリリースより、次の書き方ができるようになります。

import jsonData from "./deno.json" with { type: "json" };

// 動的インポートにも対応
const jsonData = await import("./deno.json", { with: { type: "json" } });

assert も引き続き使用できますが、非推奨になりました。 段階的な廃止が予定されており、次のリリースから警告が出るということです。

Deno.Server.prototype.shutdown() の追加

Deno.Server.prototype.shutdown() が新しい unstable なAPIとして追加されました。 これまでのサーバー停止は、AbortSignal を使用したものが行えました。 このAPIを使用するケースは、サーバーを閉じる前に処理中のリクエストの終了を待つケースになるそうです。

timeout の設定などが今後導入されるようです。

その他の機能改善

  • パフォーマンスの向上
  • ロックファイル deno.lock がv3に更新
  • 標準ライブラリの拡充
    • std/url : 標準のURLメソッドが持っていない機能の拡張
    • std/ulid : ULIDの生成とデコード機能
  • Deno 1.37 には、V8 11.8 と TypeScript 5.2.2が同梱されています。

VSCode 用拡張機能とLSPサーバー

  • deno.json の検出により、拡張機能を有効にできるようになった
  • vscode のセットアップに特定パス以下で拡張機能を無効化する deno.disablePaths が追加
  • ファイル名の変更を検知し、プロジェクト全体で変更するかオプション表示するようになった
  • npm: 指定子の保管が効くようになった
  • deno.suggest.completeFunctionCalls が追加され、関数を補完するとき、かっこと引数のプレースホルダーを含めることができるようになった
  • deno.cacheOnSave が追加され、ファイル保存時に依存関係のキャッシュが行われるように設定できる
  • テストエクスプローラーとコードレンズが修正された(数多くのバグ修正)
  • その他、数多くの修正

まとめ

Jupyter Notebooks 互換がとても印象的なリリースでした。 REPLでは解決できないビジュアライズな操作も対話的に実行できるのが魅力的です。

そのほか、Node.js互換として mssqlmineflayerinfiscalweb-push などがテスト済みになっています。 以前のリリースでは、axios が対応されたりと既存のnpmモジュール資産への対応も進んでいました。 既存資産が使えるとできることが大幅に広がりますね。

すでに Deno 1.38まで がリリースされています。またこちらも追いかけていきます。

採用情報

虎の穴では一緒に働く仲間を募集中です!
この記事を読んで、興味を持っていただけた方はぜひ弊社の採用情報をご覧下さい。
カジュアル面談やエンジニア向けイベントも随時開催中です。ぜひチェックしてみてください♪
yumenosora.co.jp