
この記事は、 弁護士ドットコム Advent Calendar 2024 の 15 日目の記事です。
弁護士ドットコムで Web エンジニア業務をしている @koukibuu3 です。
2024/10/09、Deno のメジャーアップデートが行われ 2.0 となりました。
4 years after Deno 1.0, the next generation of JavaScript is ready for production at scale.
— Deno (@deno_land) October 9, 2024
Deno 2 is out today:
🐢 Fully backwards compatible with Node and npm 📦 Package management and node_modules and package.json
📅 Long term supporthttps://t.co/LsV4D4Too8 pic.twitter.com/F6EI3whmX8
ひっそりと動向を探っていた Deno ですが、今回 2.0 になったということで、今までと違い何ができるようになったか、実際のプロダクトに採用する際の課題はあるかを調べてみました。
▼公式リリースノートはこちら https://deno.com/blog/v2.0
2.0 のアップデートに含まれる網羅的な内容は公式リリースノートをご参照いただく、今回は以下依存関係の管理方法と、モノレポ・ワークスペースに関して触ってみます。
依存関係の管理方法に関するアップデート
コマンドの仕様変更
deno installdeno adddeno remove
今までもあったこれらの依存関係を管理するコマンドに変更が入ったようです。
どうやら、npm と jsr を明示的に指定する必要ができました。
今までのように勢いでひとまず打ってみたところ、分かりやすく指摘されました。
> deno install dayjs error: preact is missing a prefix. Did you mean `deno install npm:dayjs`?
dayjs は npm で提供されているので npm:dayjs を付けて再度実行します。
> deno install npm:dayjs Add npm:dayjs@1.11.13
無事インストールされたようです。
インストールされたものは deno.json の imports に追加されます。
"imports": { "dayjs": "npm:dayjs@^1.11.13", ...
package.json のサポート
Node.js-first project using
package.json, as well as hybrid projects using bothdeno.jsonandpackage.jsonto enable easy migration path.
(翻訳)
package.json を使用する Node.js ファースト・プロジェクト、および deno.json と package.json の両方を使用するハイブリッド・プロジェクトは、移行パスを容易にします。
ここで上記の記述が気になり、deno install のドキュメントを見に行ったところ以下の記述がありましたが、これのことでしょうか。
https://docs.deno.com/runtime/reference/cli/install/#examples
If your project has a
package.jsonfile, the packages coming from npm will be added todependenciesinpackage.json. Otherwise all packages will be added todeno.json.
(翻訳)
プロジェクトに package.json ファイルがある場合、npm から来たパッケージは package.json の依存関係に追加されます。 そうでない場合は、すべてのパッケージが deno.json に追加されます。
試しに空の package.json をプロジェクトルートに用意して再度、実行します。
deno install npm:dayjs
今度は package.json の dependencies に追加されました。
/package.json
{ "dependencies": { "dayjs": "^1.11.13", } }
利用側は package.json にあろうが deno.json にあろうが以下のように書くだけです。
import dayjs from "dayjs";
つまり、npm 経由で取得したモジュールは package.json があれば、今後もそのまま package.json で管理ができます。
Node.js で動いていた巨大なプロジェクトを Deno に移行するときは役に立ちそうです。
モノレポ・ワークスペースに関するアップデート
とうとう Deno がワークスペースをサポートしました。
これが一番待ち望んでいたアップデート内容なので、早速試してみます。
ワークスペースの設定
ひとまずこのような構成のプロジェクトを作成します。
/
├── deno.jsonc
├── main.ts
├── package1/
│ └── index.ts
└── package2/
└── index.ts
/deno.jsonc
{ "workspace": ["./package1", "./package2"], }
ルートディレクトリにて deno install を実行してみます。
❯ deno install error: Could not find config file for workspace member in 'file:///{path to project}/package1/'.
config file がない、と言われたので用意します。
ちなみに前章を参考に package1/ には deno.jsonc を、package2/ には package.json を置いてみることにします。
変更後のファイル構成はこちら。
/
├── deno.jsonc
├── main.ts
├── package1/
│ ├── deno.jsonc
│ └── index.ts
└── package2/
├── package.json
└── index.ts
再度、deno install を実行してみたところ、正常に動作しました。config file としては deno.jsonc もしくは package.json があれば良いようです。いいですね、既存プロジェクトの膨大な package.json を deno.jsonc に移行しなくても済みそうです。
共通モジュールの読み込み
プロジェクトルートの deno.jsonc に以下の記述を用意します。
{ "imports": { "dayjs": "npm:dayjs@^1.11.13" } }
それぞれの package で以下のように利用可能です。
import dayjs from 'dayjs'
ワークスペースで管理しているそれぞれで export したモジュールは、以下のようにすると別モジュールでも利用可能です。
/package1/deno.jsonc
{ "name": "@scope/package1", "exports": "./index.ts", }
/package2/package.json
{ "name": "@scope/package2", "exports": "./index.ts", }
/main.ts
import { hello as hello1 } from '@scope/package1' import { hello as hello2 } from '@scope/package2' hello1() hello2()
終わりに
Deno 2.0 のアップデートにより更新があった内容を 2 点絞って見てみました。
deno.jsonc や package.json を使用して共通モジュールの読み込みが簡単になりました。既存の package.json をそのまま使えるため、移行も容易です。
モノレポライブラリが備える基本的な機能は備えているため、ワークスペース機能を使うことで、各モジュール間の相互利用は十分現実的な印象を受けました。