虎の穴開発室ブログ

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

MENU

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

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

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

Deno 1.28

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

既に、Deno 1.29 も公開になっています。こちらも近日記事公開の予定です。

npm: の使用が安定化

これまで、unstable だった、npm: の使用が安定化しました。

サンプルとして、npm パッケージ chalk を使用した use_chalk.ts を用意し、次の様に使用できます。

[use_chalk.ts]

import chalk from "npm:chalk@5";

console.log(chalk.red('Hello Deno!'));

実行は次の様になります。

$ deno run use_chalk.ts
✅ Granted env access to "FORCE_COLOR".
✅ Granted env access to "TF_BUILD".
✅ Granted env access to "TERM".
✅ Granted env access to "CI".
✅ Granted env access to "TEAMCITY_VERSION".
✅ Granted env access to "COLORTERM".
✅ Granted env access to "TERM_PROGRAM".
Hello Deno!

(Hello Deno! の部分は赤色になっています)

✅ Granted env access to "FORCE_COLOR". のように、環境変数へのアクセスには、Deno の搭載するパーミッション機能が効きます。

なので、次の様に --allow-env を使用し環境変数へのアクセスを許可すれば、プロンプトでの確認は無く動作します。

$ deno run --allow-env use_chalk.ts
Hello Deno!

また、import map でも使用できるので、次の様に記述できます。

[import_map.json]

{
  "imports": {
    "chalk": "npm:chalk@5"
  }
}

[use_chalk.ts(import_mapを使用)]

import chalk from "chalk";

console.log(chalk.red('Hello Deno!'));
$ deno run --allow-env --import-map=import_map.json use_chalk.ts
Hello Deno!

また、npm スクリプトやcli、サブコマンドの実行もできます。

npm モジュールのインストールは、Node.js の環境とは異なり package.json は使われず、非 npm モジュールを使う時と同様にスクリプトで呼び出されたときに取得されます。

できる限り多くの npm モジュールの互換性を Deno にもたせることを目指しており、問題発生の場合には、GitHub で Issue を立てて欲しいそうですので協力していきましょう。

ロックファイルの検出

これまで、ロックファイルを Deno で使用するには、--lock=<filename> のようにフラグの設定が必要でした。 このような仕様であったために、多くのユーザーが使用していない状況になったそうです。 (実際、私も使ったことは無かったです。)

今回リリースから、構成ファイル deno.json(c) が検出されると、ロックファイルが自動的に deno.lock の名前で作成され検出し、使用されるようになりました。

Deno API の変更

いくつかの Deno 名前空間 のAPIに変更が入っています。

安定化

これまで unstable だった以下のAPIが stable になりました。

  • Deno.bench()
  • Deno.gid()
  • Deno.networkInterfaces()
  • Deno.systemMemoryInfo()
  • Deno.uid()

Deno.Command API の追加

Deno.Command は、Deno 1.21 で登場した Deno.spawn、Deno.spawnSync、Deno.spawnChild に代わる統合されたAPIとして追加されました。

3つのAPIが統合されたものなので、3つの機能を持っています。

リリースノートを参考に Deno.Command から提供される .output() .outputSync() .spawn() の動作確認します。

[output.ts]

const c = new Deno.Command("echo", { args: ["Hello Deno!!"] });
const { stdout, stderr } = await c.output();


console.log("stdout = ",new TextDecoder().decode(stdout))
console.log("stderr = ",new TextDecoder().decode(stderr))

[output_sync.ts]

const c = new Deno.Command("echo", { args: ["Hello Deno!!"] });
const { stdout, stderr } = c.outputSync();

console.log("stdout = ",new TextDecoder().decode(stdout))
console.log("stderr = ",new TextDecoder().decode(stderr))

[spawn.ts]

const c = new Deno.Command(Deno.execPath(), {
  args: [
    "eval",
    "console.log('hello Deno!!')",
  ],
  stdin: "piped",
});

c.spawn();

const file = await Deno.open("output.txt", { write: true });
c.stdout.pipeTo(file.writable);
c.stdin.close();

console.assert((await c.status).code == 0);

それぞれ次の様に実行します。

$ deno run --unstable --allow-run=echo output.ts
stdout =  Hello Deno!!

stderr =

$  deno run --unstable --allow-run=echo output_sync.ts
stdout =  Hello Deno!!

stderr =

$  deno run --unstable --allow-run --allow-write --allow-read spawn.ts
{ success: true, code: 0, signal: null }

その他

  • Deno に同梱される V8 が 10.9 にアップデートされました。
  • マニュアルが大きく更新されました

まとめ

Deno 1.28 で遂に、npm モジュールの使用が stable になりました。
一部ケースでは、上手く動作しないということも認識されており、今後も対応されることに言及されています。
unstable であった時に1件報告をさせていただいたのですが、思っていたよりも速やかに対応されたので驚いた記憶があります。
Deno の持つパーミッション機能を生かしたセキュアな npm モジュール運用をぜひ試してみてください。

現在 Node.js でも パーミッション機能の導入についてプルリクが出ています。

https://github.com/nodejs/node/pull/44004

まだマージされていませんが、JavaScript ランタイムの課題感は共有されている事を感じます。

2022年12月14日に Deno 1.29、1月26日にに Deno 1.30も公開されています。 近日こちらのレポートも公開予定です。

P.S.

採用

虎の穴では一緒に働く仲間を募集中です!
この記事を読んで、興味を持っていただけた方はぜひ弊社の採用情報をご覧下さい。
yumenosora.co.jp