皆さんこんにちは。最近、高圧洗浄機を購入しました。奥谷です。
去る 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