Deno 1.45 変更まとめ - Workspace対応が入ります - - 虎の穴ラボ技術ブログ

虎の穴ラボ技術ブログ

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

MENU

Deno 1.45 変更まとめ - Workspace対応が入ります -

皆さんこんにちは。最近、高圧洗浄機を購入しました。奥谷です。

去る 2024 年 7 月 11 日に Deno 1.45 がリリースされました。
このリリースでは、workspaceとモノレポのサポートが導入されました。 その他、これまでのリリースNode.js互換性の向上他、多数の改善が行われています。 気になるところを中心に紹介します。

Deno 1.45

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

workspaceとモノレポのサポート

Deno 1.45 では、workspaceとモノレポのサポートが導入されました。

workspace機能としては、npm は v7 導入時の2020年10月、yarnでは、2020年以前から導入されていた機能です。

Deno はdeno.json での管理と、package.jsonに記述する npm workspaces の2つでの管理をサポートします。

以下のようにディレクトリが構成されています。

$ tree
.
|-- deno.json
|-- func.ts
|-- main
|   |-- app.ts
|   \-- deno.json
\-- sub
    |-- app.ts
    \-- deno.json

./deno.json は以下のように記述されています。

// ./deno.json
{
  "tasks": {
    "dev-main": "deno run main/app.ts",
    "dev-sub": "deno run sub/app.ts"
  },
  "imports": {
    "func": "./func.ts"
  },
  "workspace": ["./main", "./sub"]
}

この記述により、func.tsは func 記述することで workspace に含まれる全てのディレクトリからインポート可能になります。

以下のように記述します。

// ./main/app.ts
import {func} from "func";

console.log(`main: ${func()}`)
// ./func.ts
export function func(){
  return "Hello World! from root.";
}

また、./main/deno.json は以下のように何もimportを記述していません。

// ./main/deno.jsonc
{
  "imports": {
  }
}

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

$ deno task dev-main
Task dev-main deno run main/app.ts
main: Hello World! from root.

親ディレクトリの func.ts がmainディレクトリのapp.tsで参照されていることが確認できます。

ちなみに、こちらをDeno 1.45で実行すると、次のようになります。

$ deno task dev-main
Task dev-main deno run main/app.ts
error: Relative import path "func" not prefixed with / or ./ or ../ and not in import map from "file:///usr/src/app/1_45/main/app.ts"
    at file:///usr/src/app/1_45/main/app.ts:1:20

Deno 1.45がワークスペース全体のパッケージ管理できていることがわかります。

また、ワークスペースはメンバーとなるディレクトリのdeno.jsonで上書き可能です。

sub/func.ts を作成し、以下のように記述します。

// ./sub/func.ts
export function func(){
    return "Hello World! from sub.";
}

合わせて、subディレクトリのdeno.jsonを以下のように記述します。

// ./sub/deno.json
{
  "imports": {
    "func": "./func.ts"
  }
}

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

$ deno task dev-sub
Task dev-sub deno run sub/app.ts
sub: Hello World! from sub.

sub/deno.json に記述された内容でモジュールインポートが上書きできていることがわかります。

ここで気になったのは、mainディレクトリに移動したうえで実行するとどうなるのか?ですが、ご心配無用で認識されており問題なく動作します。

$ deno task
Available tasks:
- dev-main
    deno run main/app.ts
- dev-sub
    deno run sub/app.ts

$ cd ./main

$ deno task
Available tasks:
- dev-main (workspace)
    deno run main/app.ts
- dev-sub (workspace)
    deno run sub/app.ts

$ deno task dev-main
Task dev-main deno run main/app.ts
main: Hello World! from root.

ロックファイルの固定化対応 --frozen, --frozen-lockfile

Deno 1.45 では、--frozen-lockfileフラグと--frozen エイリアスが追加されました。

このフラグの追加により、ロックファイルが古くなった際にエラーを発生させられるようになります。

依存関係に予期しない変更が起きていないのか?を確認するために、CIで役に立つものと紹介されています。

deno install の変更

deno install は、これまで、パッケージをグローバルにインストールしてきました。 Deno 2では、パッケージをローカルにインストールするようになります。

これまで同様に、グルーバルにインストールするには、-g フラグを使用します。

グローバルインストールは、以下のように試すことができます。

$ deno install -g install-global-app.ts
✅ Successfully installed install-global-app

ローカルへのインストールは、どうやら、JSRへの登録が無いと難しいようです。

$ DENO_FUTURE=1 deno install install-local-app.ts
⚠️ `deno install` behavior will change in Deno 2. To preserve the current behavior use the `-g` or `--global` flag.
error: jsr:install-local-app.ts was not found.

何か回避策が見つかれば、また紹介できればと思います。

deno init --lib の導入

deno init はDeno 1.25 で登場し、main.ts,main_test.ts,deno.jsonを生成してくれるサブコマンドでした。

--lib フラグが導入され、JSRに公開されるプロジェクトを作成することができるようになりました。 以下のようになります。

$ deno init --lib
✅ Project initialized

Run these commands to get started

  # Run the tests
  deno test

  # Run the tests and watch for file changes
  deno task dev

  # Publish to JSR (dry run)
  deno publish --dry-run

$ tree
.
|-- deno.json
|-- mod.ts
\-- mod_test.ts

1 directory, 3 files  

$ cat deno.json
{
  "name": "lib",
  "version": "1.0.0",
  "exports": "./mod.ts",
  "tasks": {
    "dev": "deno test --watch mod.ts"
  }
}

deno test ファイル検出の更新

deno test では、これまで以下のような名称のファイルをテスト対象として検知していました。

  • ファイルの末尾が _test である
  • ファイルの末尾が .test である
  • ファイル名が test である

このリリースより、__tests__ ディレクトリ内のファイルもテスト対象として検知するようになりました。

以下動作させて確認します。

$ tree
.
|-- __tests__
|   \-- add.ts
|-- main.test.ts
|-- main_test.ts
\-- test.ts


$ deno -V
deno 1.44.0

$  deno test
running 1 test from ./main.test.ts
addTest ... ok (4ms)
running 1 test from ./main_test.ts
addTest ... ok (0ms)
running 1 test from ./test.ts
addTest ... ok (0ms)

ok | 3 passed | 0 failed (62ms)


$ deno -V
deno 1.45.0

$ deno test
running 1 test from ./__tests__/add.ts
addTest ... ok (0ms)
running 1 test from ./main.test.ts
addTest ... ok (0ms)
running 1 test from ./main_test.ts
addTest ... ok (0ms)
running 1 test from ./test.ts
addTest ... ok (0ms)

ok | 4 passed | 0 failed (71ms)

Deno 1.45 では、__tests__ 以下がテスト対象になっていることが確認できます。

deno compile--env フラグのサポートを追加

--env フラグは、Deno 1.38 で追加された .env ファイルを読み込むためのフラグです。

このフラグが、deno conpile にも対応し、生成結果に環境変数を含められるようになりました。

以下のように使用できます。

$ cat .env
ENV_TEXT='Hello Deno'

$ cat app.ts
console.log(Deno.env.get("ENV_TEXT"));

# dneo run では、以前から対応していました。
$ deno run --env --allow-env app.ts 
Hello Deno

# Deno 1.45 では、deno compile でも対応しています。
$ deno compile --env --allow-env app.ts
Compile file:///hoge/app.ts to app
Archive:  /tmp/.tmpNzDRq5/denort.zip
  inflating: denort
Warning Environment variables from the file ".env" were embedded in the generated executable file

# 実行すると環境変数が含まれていることが確認できます。
$ ./app
Hello Deno

deno compile --env を使用すると、.env が埋め込まれたファイルであることの警告が表示されます。

std library の安定化が進んでいます

Deno 1.45 リリースノート時点では、以下の13件のモジュールが安定化となりました。

  • @std/assert
  • @std/bytes
  • @std/collections
  • @std/crypto
  • @std/data-structures
  • @std/encoding
  • @std/html
  • @std/media-types
  • @std/msgpack
  • @std/path
  • @std/regexp
  • @std/toml
  • @std/uuid

2024年7月末時点ではこれらに加え以下のモジュールも安定化しています。

  • @std/async
  • @std/cli
  • @std/fs
  • @std/streams
  • @std/expect
  • @std/front-matter
  • @std/internal
  • @std/json
  • @std/jsonc
  • @std/yaml
  • @std/testing
  • @std/text
  • @std/ulid

その他

  • Node.js 互換性の改善
  • npmライフサイクルスクリプトのサポート
  • Blob.bytes() の導入
  • Jupyterノートブックの改善
    • confirm 関数のインタラクティブ性の向上
  • 言語サーバーの改善

まとめ

Deno 1.45 で導入された workspace のサポートが個人的に今作っているアプリケーションの開発に刺さっています。 管理しやすくなり、とても効率が上がりました。 最近のリリースでは、コアの機能で何か拡張が入るよりも、全体にDeno 2を念頭に置いた安定化に舵を切っている感じます。 std library の安定化も進み約半数が安定化となりました。

Web標準への準拠もあれ、極個人的にはKVやQueuesのようなDeno Deployでも使える機能の導入に魅力を感じている側面は少なからずあります。 Deno 2以降にこういった方向の機能拡張にもまた期待したいです。

また、次回のリリースも追いかけます。

Fantia開発採用情報

虎の穴ラボでは現在、一緒にFantiaを開発していく仲間を積極募集中です!
多くのユーザーに使っていただけるtoCサービスの開発をやってみたい方は、ぜひ弊社の採用情報をご覧ください。
toranoana-lab.co.jp