Denoの2023年 Q1のロードマップが公開されました。

このページでは、新しく実装が検討されている機能などについて紹介いたします。

deno.jsonでのimportsフィールドのサポート

今までDenoでImport Mapsを利用するには、専用のファイルを用意しておき、それを--import-mapオプションで読むこむ必要がありました。

現在、deno.jsonで直接Import Mapsを定義できるようにするため、importsオプションの追加が検討されています。

これが実現されれば、以下のようにdeno.jsonで直接マッピングを定義できるようになります。

{
  "imports": {
    "redis": "https://deno.land/x/redis@v0.29.0/mod.ts",
    "dax": "https://deno.land/x/dax@0.24.0/mod.ts"
  },
  "tasks": {
    "start": "deno run --allow-net --allow-env ./main.ts"
  }
}

Deno公式が公開している02-deno-canonical-appにも使用例があるため、よろしければそちらも参照いただければと思います。

deno:URLのサポート

deno:という新しいURLスキームの導入が検討されており、これにより、deno.land/xからのモジュールの読み込みを簡略化できます。

import $ from "deno:dax@24.0/mod.ts";

await $`echo foobar`;

また、deno.land/xでも機能の拡張が予定されているようで,/x/some-packageにアクセスされた際は/x/some-package/mod.tsにリダイレクトさせることが検討されているようです。

例えば、deno:dax@24.0と記述した場合、/x/dax@0.24.0/mod.tsが読み込まれます。

package.jsonのサポート

Deno本体でpackage.jsonのサポートが検討されているようです。

例えば、以下のような内容のpackage.jsonがあったとします。

{
  "type": "module",
  "scripts": {
    "main": "deno run -A main.ts"
  },
  "dependencies": {
    "chalk": "^5.0",
    "deno-redis": "deno:redis@~0.29.0/mod.ts"
  }
}

Denoはpackage.json"dependencies"で定義された依存関係を元に、コード中のbare specifierを解釈します。(もしImport Mapsファイルまたはdeno.jsonでもマッピングが定義されている場合は、package.jsonよりもそれらのファイルの設定が優先されます)

例えば、以下のようなスクリプトが存在する場合、deno-redishttps://deno.land/x/redis@v0.29.0/mod.tsとして解釈され、chalkについてはnpmレジストリからv5.xがダウンロードされます。

import { connect } from "deno-redis";
import chalk from "chalk";

const redis = await connect({
  hostname: "127.0.0.1",
  port: 6379,
});
const value = await redis.get("foo");
console.log(chalk.blue.bold(value));

また、deno taskによるpackage.jsonscriptsの実行もサポートが検討されているようです。

例えば、以下のコマンドによって、package.jsonscripts.mainで定義されたスクリプトを実行できるようになりそうです。

$ deno task main

将来的には{ "type": "commonjs" }もサポートし、CommonJS形式で書かれたアプリも動かせるようにすることが検討されているようです。

また、まだ未確定ではあるものの、deno from-nodeコマンドを実装し、package.jsonからdeno.jsonの生成を自動化できるようにすることなども検討されているようです。


node:URLのサポート

ユーザーコードからNode.jsの組み込みモジュールをimportできるようにするために、node:のサポートが検討されています。

例えば、以下はNode.jsのeventsパッケージを利用する例です。

import { EventEmitter } from "node:events";

const emitter = new EventEmitter();
emitter.on("foo", (x) => console.log(x));
emitter.emit("foo", "bar");

deno bundleコマンドの非推奨化

deno bundleコマンドの非推奨化が予定されています。

以前にdeno bundleコマンドの代替として検討されていたdeno packコマンドの導入については、今のところ行われない予定のようです。

その代わり、ユーザーランドで同じ問題が解決できるような手段の提供は検討されているようです。

例えば、deno_graphなどのように、Deno公式のパッケージとしてdeno.land/xからパッケージが提供される可能性なども考えられそうです。

おわりに

以上となりますが、以下のissueでこのロードマップについて活発に議論が行われています。

議論やフィードバックの内容次第では、方針などが変更される可能性もあるかもしれません。

もし今後の動きなどに興味がありましたら、こちらのissueをSubscribeするとよさそうです。