Denoばた会議 Monthly 第11回

Deno v1.24

--checkオプション指定時のトランスパイルの挙動の変更

型チェック トランスパイル
--check (v1.23) tsc tsc
--no-check (v1.23) - swc
--check (v1.24) tsc swc
--no-check (v1.24) - swc

また、tscの実行結果をSQLiteにキャッシュする仕組みも導入されており、型チェックの効率化も図られています。

FFI(Deno.dlopen)の改善

  • V8 Fast API Calls+JITコンパイル(tinycc)による最適化 (最大で200倍の高速化を実現)
  • Deno.UnsafeCallbackが追加され、関数ポインタを取り扱えるようになりました。
  • Deno.UnsafePointerが削除され、ポインタはbigintで取り扱われるように変更されました。

Deno.Child.unref & Deno.Child.ref

const child = await Deno.spawnChild("some_long_running_process", { args });
child.unref();

これにより、子プロセスがDenoの停止をブロックしなくなります。(Deno.unrefTimerと同様の挙動)

import.meta.resolve()のサポート

const worker = new Worker(import.meta.resolve("./worker.js")); // => "file:///home/uki00a/dev/worker.js"

Import mapsも解釈してくれます。

{
  "imports": {
    "redis": "https://deno.land/x/redis@v0.26.0/mod.ts"
  }
}
import.meta.resolve("redis"); // => "https://deno.land/x/redis@v0.26.0/mod.ts"

"unhandledrejection"イベントのサポート

addEventListener("unhandledrejection", (event) => {
  console.error(event.reason); // error: Uncaught (in promise) Error: foo
});

Promise.reject(new Error("foo"));

"beforeunload"イベントのサポート

let called = false;
addEventListener("beforeunload", (event) => {
  if (!called) {
    called = true;
    event.preventDefault();
    setTimeout(() => console.log(3), 50);
  }
});

setTimeout(() => {
  console.log(1);
  setTimeout(() => console.log(2), 200);
}, 100);

deno.json(c)deno testがカスタマイズできるように

{
  "test": {
    "files": {
      "exclude": ["vendor"]
    }
  }
}

https://github.com/denoland/deno/blob/f0e01682cce638303e3b6997788667a0f71dff8d/cli/schemas/config-file.v1.json#L325-L349

deno test--parallelオプションがサポート

テストケースを並列実行できます。

$ deno test --parallel

DENO_JOBS環境変数で並列数を調整できます。

$ DENO_JOBS=4 deno test --parallel

このオプションの追加により、既存の--jobsオプションは非推奨化されています。

その他の変更点

  • (破壊的変更) Deno.ChildDeno.SpawnOutputの型定義に変更が加わっています。
  • deno lspimport-map-remapコードアクションがサポート

deno_stdのアップデート

semverモジュールの追加

import * as semver from "https://deno.land/std@0.149.0/semver/mod.ts";

console.log(semver.valid("v1.2.3")); // => 1.2.3
console.log(semver.gt("2.0.0", "1.2.4")); // => true
console.log(semver.satisfies("1.4.2", ">=1.x")); // => true

Deno でコマンドラインツールを雑に作ったので感想の記事がきっかけで入ったようです🙄

encoding/json/streamモジュールの追加

import { JSONParseStream } from "https://deno.land/std@0.149.0/encoding/json/stream.ts";
import { readableStreamFromIterable } from "https://deno.land/std@0.149.0/streams/conversion.ts";

const readable = readableStreamFromIterable([
  `{"name": "foo"}`,
  `{"a": 1, "b": true}`,
]).pipeThrough(new JSONParseStream());

for await (const json of readable) {
  console.log(json);
  // Output:
  // { name: "foo" }
  // { a: 1, b: true }
}

Deno raises $21M

Denoが$21Mを調達

この記事では、DenoやDeno Deployがどのような背景・目的で開発されているのかについても解説されています。

Fresh v1.0.0がリリース

これに合わせて、Freshのリポジトリがdenoland organization配下に移動されています。

また、公式でFreshの紹介記事も公開されています。

Bunのソースコードが公開

JavaScriptCoreベースのJavaScriptランタイムであるBunのソースコードが公開されました。