Denoばた会議 Monthly 第3回

Deno Deploy Beta 3

内容

deployctlがアーカイブ

Deno DeployのCLIツールであるdeployctlがアーカイブされました。

今後はDeno CLIを使って開発していくようアナウンスされています。

Slackの次世代開発プラットフォーム

Slackが次世代の開発プラットフォームを発表し、それでDenoが採用されるようです。

CLISDKがDenoに依存しているようです。

Deno v1.16

React 17のJSX Transformのサポート

.jsxまたは.tsxファイル中で@jsxImportSourceを使うことで有効化されます。

/** @jsxImportSource https://esm.sh/preact@10.5.15 */

export function Hello(props) {
  return (
    <div>Hello, {props.name}</div>
  )
}

また、--configオプションで指定する設定ファイルで有効化することも可能です。

{
  "compilerOptions": {
    "jsx": "react-jsx",
    "jsxImportSource": "https://esm.sh/react@17.0.2"
  }
}

--locationを指定せずにlocalStorageが利用できるようになりました。

localStorage.getItem("foo");
# http://localhostをオリジンとして扱う
$ deno run --location http://localhost main.ts

# tsconfig.jsonのパスをオリジンとして扱う 
$ deno run --config tsconfig.json main.ts

# main.tsのパスをオリジンとして扱う
$ deno run main.ts

fetchでローカルファイルのダウンロードがサポート

利用するには--allow-readパーミッションが必要です。

const res = await fetch("file:///home/uki00a/.vimrc");
console.log(await res.text());

新しいシグナルAPI (unstable)

const signalListener = () => {
  // ...
};
Deno.addSignalListener("SIGTERM", signalListener);
Deno.removeSignalListener("SIGTERM", signalListener);

この変更に合わせて、既存のDeno.signalは削除されています。

テストケースごとのパーミッション指定が安定化

Deno.test({
  name: "This should fail",
  permissions: {
    net: false, // --allow-netを無効化
  },
  fn: async () => {
    const _ = await fetch("https://example.com"); // --allow-netが無効化されているため、失敗します
  },
});

Node.js互換モードの機能向上(--compat)

https:blob:インポートがサポートされました。 (.mjsファイル中やpackage.json"type": "module"が指定された際に有効化されます)

import { distinct } from "https://deno.land/std@0.114.0/collections/distinct.ts";
import { EventEmitter } from "node:events";

console.log(distinct);
console.log(EventEmitter);

また、Import mapsとの統合もサポートされています。

Deno.startTlsが安定化

Deno.startTlsが安定化され--unstableフラグなしでも利用できるようになりました。

これにより、deno-postgres--unstableに依存しなくなりました。

シンボリックリンク関連のAPI

Deno.symlinkなどのシンボリック関連のAPIが--allow-writeに加えて--allow-readパーミッションを要求するように変更されました。

await Deno.symlink(oldpath, newpath);

deno_std v0.114.0

http/server (part 1)

serveListener()関数が追加されました。使用法はv0.113.0までのserve()関数と同様です。

import { serveListener } from "https://deno.land/std@0.114.0/http/server.ts";

const listener = Deno.listen({ port: 8000 });
await serveListener(listener, (request) => {
  return new Response("Hello", { status: 200 });
});

http/server (part 2)

また、既存のserve()の使用法が変更されています。こちらはDeno.Listenerを渡す必要がありません。

import { serve } from "https://deno.land/std@0.114.0/http/server.ts";

await serve((request) => {
  return new Response("Hello", { status: 200 });
}, { addr: ":8000" });

http/server (part 3)

また、下記関数が非推奨化されています。

  • listenAndServe (今後はserveの使用が推奨されます)
  • listenAndServeTls (今後はserveTlsの使用が推奨されます)

その他のアップデートなど

Freshのアップデート

Middlewareサポートが追加

利用する際はpagesディレクトリ配下に_middleware.tsファイルを用意し、handler関数をexportする必要があります。

export async function handler(req: Request, handle: () => Promise<Response>) {
  const start = Date.now();
  const resp = await handle();
  const end = Date.now();
  console.log(`${req.method} ${req.url} - ${end - start}ms`);
  return resp;
}

CSPサポート

import type { PageConfig } from "../deps.ts";

export const config: PageConfig = { csp: true };

これでContent-Security-Policyヘッダが出力されます。

また、Content-Security-Policyヘッダをカスタマイズしたいときは、useCSPを使用します。

useCSP((policy) => {
  changeDirectives(policy.directives);
});

2021年のDeno Advent Calendarが公開

Qiitaで2021年のDeno Advent Calendarが公開されました。