虎の穴開発室ブログ

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

MENU

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

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

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

Deno 1.42

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

JSR の登場と、deno publish and deno add

JSR という新しい、JavaScript と TypeScript パッケージ用の新しいオープン ソース レジストリが公開されました。

jsr.io

このレジストリへの登録、パッケージの公開、インストールを行うのが、deno publishdeno add です。

deno add をリリースノートを例に使用し、確認します。

$ deno add @std/assert
Created deno.json configuration file.
Add @std/assert - jsr:@std/assert@^0.222.1

すると、deno.json の imports セクションに記載されます。

{
  "imports": {
    "@std/assert": "jsr:@std/assert@^0.222.1"
  }
}

imports セクションに記載されていますので、実行ソースには @std/assert と書くことで、jsr:@std/assert@^0.222.1 がインポートされます。

import { assertEquals } from "@std/assert";
assertEquals(1, 2);

deno add は、npm: 指定子を使用したパッケージ追加も可能です。

$ deno add npm:cowsay
Add cowsay - npm:cowsay@^1.6.0
import cowsay from 'cowsay';

console.log(cowsay.say({ text: 'Hello, World!' }));

deno add は、主にパッケージの利用者側が使用するコマンドですが、deno publish は、パッケージの提供者側が使用するコマンドです。 deno publish を使うことで、JSRにパッケージを公開することができます。

詳細は、JSRのドキュメントを参照してください。

jsr.io

deno task

クロスプラットフォームのシバンをサポート

クロスプラットフォームでのシバンをサポートしました。 このことで、deno.json への記述が少々楽になります。

リリースノートを参考に次のように記述できます。

[main.ts]

#!/usr/bin/env -S deno run
console.log("Hello there!");

[deno.json]

{
  "tasks": {
    "hi": "main.ts"
  }
}

実行すると、次のようになります。

$ deno task hi
Task hi ./hi.ts
Hello there!

終了ステータス変数のサポート

Deno task クロスプラットフォームシェルが、終了ステータス変数をサポートしました。

リリースノートを参考に次のように記述できます。

{
  "tasks": {
    "output": "deno eval 'Deno.exit(10)' || echo $?",
    "safe": "deno eval 'console.log(`...`)' || exit $?",
    "throw": "deno eval 'throw new Error()' || exit $?"
  }
}

動かすと、次のようになります。

$ deno task output
Task output deno eval 'Deno.exit(10)' || echo $?
10
$ deno task safe
Task safe deno eval 'console.log(`...`)' || echo $?
...
$ deno task throw
Task throw deno eval 'throw new Error()' || echo $?
error: Uncaught (in promise) Error
throw new Error()
      ^
    at file:///usr/src/app/1_42/$deno$eval:1:7

リダイレクトサポートの強化

入力リダイレクト他、リダイレクトサポートが強化されました。

リリースノートの紹介では、次のように使用できます。

{
  "tasks": {
    "input-redirect": "gzip < file.txt",
    "stdout-err": "deno run main.ts >&2",
    "stderr-out": "deno run main.ts 2>&1"
  }
}

タスクの説明をサポート

JSONCファイルを使用するとき、コメントを使用してタスクに説明を追加できます。

{
  "tasks": {
    // This task prints "Hello, World!"
    "hi": "./hi.ts",
    /* This task prints "Goodbye, World!" */
    "output": "deno eval 'Deno.exit(10)' || echo $?",
    /**
     * Throw Error
     */
    "throw": "deno eval 'throw new Error()' || echo $?",
    "safe": "deno eval 'console.log(`...`)' || echo $?"
  }
}

以上のように、コメント追加すると、deno task を実行すると次のように表示されます。

$ deno task
Available tasks:
- hi
    // This task prints "Hello, World!"
    ./hi.ts
- output
    // This task prints "Goodbye, World!"
    deno eval 'Deno.exit(10)' || echo $?
- throw
    //
    // Throw Error
    deno eval 'throw new Error()' || echo $?
- safe
    deno eval 'console.log(`...`)' || echo $?

Deno 2 での deno install の仕様変更について

deno install は、これまでグローバルに実行可能コードをインストールすることができるツールでした。

しかし、フィードバックとして今回登場した deno add のように、依存関係をインスト―ルするツールとして機能することを期待したという意見が上がったそうです。

Deno 2では、deno install は、deno add のエイリアスになります。 これまで通りの動作は、deno install -gまたは、deno install --globalで実行できるようになります。

パフォーマンスの向上

Deno 1.42 では、パフォーマンスが大幅に向上しています。 その中でもリリースノートでは、Linux環境での起動時間の10%向上、setTimeout setInterval の改善などが挙げられています。

V8、 TypeScript のアップデート

Deno 1.42 にはTypeScript 5.4.3が同梱されます。 また、V8 12.3が同梱されます。 Iterator.prototype.map などが使用できるようになります。

環境変数 DENO_FUTURE の追加

環境変数 DENO_FUTURE が追加されました。
DENO_FUTURE=1 を設定することで、Deno 2で行われる変更が有効になります。

この環境変数を適用することで、window グローバルの削除や Deno 名前空間のメソッドの削除が行われます。

比較すると、次のようになります。

$ deno eval 'console.log(window)'
Window {}

$ DENO_FUTURE=1 deno eval 'console.log(window)'
undefined

window グローバルが削除されていることが確認できます。

その他

  • Node.js と npm の互換性
    crypto の関数の追加や、各種機能のサポート
  • deno lint --fix
    deno lint --fix で自動修正が可能になりました。自動修正可能なルールは今後も拡充予定です
  • --watch-exclude=... フラグの導入
    --wathc を使用する際に、特定ファイルは再起動をしたくない場合に使用できます
  • jsrタグと、リントルール verbatim-module-syntax の追加
  • アプリケーションの実行時に、型チェックを行わなくなりました
  • LSP(言語サーバー)の改善

まとめ

Deno 1.42 のリリースノートを見てきました。

Deno 1.41 のリリースノート記事でも紹介した新しいパッケージレジストリJSRへの対応が紹介されました。 先日、プライベートでJSRにモジュールを登録してみましたが、比較的簡単にモジュール公開まで出来ました。 公開されているメソッドが自動的にドキュメントになったり、コメントを適切に設定していくことでそれもまたページに反映されます。 使いやすくて見やすくスコアも示されるなど、モチベーションを喚起するようなデザインも一つの特徴と感じました。 ぜひ触ってみてください。

Deno 1.43が5月1日に公開されています。こちらの記事も近日公開予定です。

採用情報

虎の穴では一緒に働く仲間を募集中です!

この記事を読んで、興味を持っていただけた方はぜひ弊社の採用情報をご覧下さい。

カジュアル面談やエンジニア向けイベントも随時開催中です。ぜひチェックしてみてください。 toranoana-lab.co.jp