Denoばた会議 Monthly 第9回

Deno v1.22

リモートモジュールの型チェックがデフォルトで無効化

deno rundeno testなどの各コマンドでリモートモジュールの型チェックがデフォルトで無効化されました。

もしリモートモジュールの型チェックが必要な際は、--check=allオプションまたはdeno check --remoteコマンドを使用する必要があります。

また、次のv1.23のリリースでdeno rundeno cacheコマンドの型チェックがデフォルトで無効化される予定なので注意!

移行について

例えば、CIでdeno rundeno cacheなどのコマンドを実行して型チェックをされている場合は、今のうちにdeno checkなどに移行しておくと安全だと思います。

# mod.tsの型チェックを行う
$ deno check mod.ts

# deno run実行時に型チェックも行う
$ deno run --check main.ts

設定ファイルの自動探索の無効化

--no-configオプションがサポートされました。

このオプションを指定すると、deno.json(c)の自動的な探索を無効化できます。

$ deno run --no-config main.ts

(破壊的変更) Worker内でデフォルトでDeno APIが有効化

// v1.21 (denoオプションでの有効化が必要)
new Worker(new URL('./worker.js', import.meta.url).href, {
  deno: { namespace: true },
  type: "module",
});

// v1.22 (denoオプションでの有効化は不要)
new Worker(new URL('./worker.js', import.meta.url).href, { type: "module" });

(破壊的変更) Deno.emit()の削除

Deno公式でdenoland/deno_emitという代替モジュールが公開されているので、Deno.emit()を使用されている場合は、そちらへ移行できます。

import { bundle } from "https://deno.land/x/emit@0.0.2/mod.ts";

const { code } = await bundle("https://deno.land/std@0.140.0/examples/chat/server.ts");
await Deno.writeTextFile("bundle.js", code);

サブプロセスAPIのアップデート

AbortSignalのサポート

const controller = new AbortController();
const child = Deno.spawnChild(Deno.execPath(), {
  args: [
    "eval",
    "setTimeout(() => console.log('foobar'), 10000)",
  ],
  signal: controller.signal,
});
queueMicrotask(() => controller.abort());

const status = await child.status;
console.assert(!status.success);

(破壊的変更) ChildStatus.signalが数値から文字列へ変更

const child = Deno.spawnChild(Deno.execPath(), { args });

// ...

const status = await child.status;
status.signal; // => "SIGTERM" (v1.21までは数値が設定)

Response.json()がサポート

application/json形式のレスポンスを簡易的に作成できます。

const res = Response.json({ name: "foo" });

res.status; // => 200
res.headers.get("content-type"); // => "application/json"
await res.json(); // => { name: "foo" }

ヘッダのカスタマイズ

Response.json({ id: 1 }, { headers: { "x-foo": "foo" } });

その他の変更

  • deno lspでリントがデフォルトで有効化
  • deno testでテストレポートの出力が改善 (Uncaught errorの出力など)
  • Deno.resolveDns()でNSやSOAレコードなどの問い合わせがサポート
  • performance.timeOriginperformance.toJSON, navigator.userAgentなどのAPIがサポート

deno_stdのアップデート

encoding/jsonc (v0.139.0)

JSONCパーサが実装されました。

import { parse } from "https://deno.land/std@0.139.0/encoding/jsonc.ts";

console.log(parse(`{
  // hello
  "foo": 1
}`)); // => { foo: 1 }

Denoの動向

deno.json(c)でのパーミッションの宣言

deno.json(c)でパーミッションを宣言できるようにするPRが作成されています。

[WIP] feat: support “permissions” in config file (#14520)

{
  "permissions": {
    "read": true,
    "env": ["PORT"]
  }
}

WASMモジュールのimport

Denoで.wasmファイルをimportできるようにするPRが作成されています。

WIP: wasm modules in core (#14485)

import { some_function } from "./some_module.wasm";

SQLiteバインディング

正式に入るかどうかはまだわかりませんが、DenoでSQLiteのバインディングを公開するPRが作成されています。

experiment(runtime): expose SQLite bindings (#14627)

const { Connection } = Deno.sqlite;
const conn = new Connection("sqlite.db");
const stmt = conn.prepare(`SELECT * FROM users WHERE id = ?`);
stmt.query(123);

deno_stdへのdeno-sqliteの追加

deno_stddeno-sqliteモジュールを追加するPRが作成されています。

[WIP] feat: Add sqlite database driver (#2230)

こちらも正式に入るかどうかはまだ不明です🙄

Web-interoperable Runtimes Community Group (WinterCG)

DenoやNode.js, Cloudflare Workersなどの非ブラウザ上で動作する各種JavaScriptランタイムの相互運用性の向上を目的としたコミュニティグループ

議論の内容やドキュメントなどはGitHub上で公開されています。

denoland/deno_blog

import blog from "https://deno.land/x/blog@0.0.1/blog.tsx";

blog(import.meta.url, {
  title: "My first blog",
  author: "uki00a",
  header: "Hello world!",
  style: "body { padding: 8rem 0; background-color: #f0f0f0; }",
});

これでDeno Deployで動作するブログが作れるようです。

RemixがDenoを公式でサポート

今まではRemixでのDenoサポートは実験的という位置づけでしたが、Remix v1.5.0でDenoの公式サポートが発表されました。

$ npx create-remix@latest --template deno

Aleph.jsのアップデート

Deno Newsが再開

#42: Deno News is back! Featuring v1.21, Netlify Edge Functions, and JavaScript Containers

メールやRSSフィードなどで購読できるようなので、もし興味がありましたら購読しておくとよいかもしれません。