diff --git a/content/articles/2024/06/02.md b/content/articles/2024/06/02.md new file mode 100644 index 00000000..51cb8cb2 --- /dev/null +++ b/content/articles/2024/06/02.md @@ -0,0 +1,44 @@ +--- +title: 2024/05/27〜2024/06/02の最新情報 +tags: + - Deno + - deno_std + - Hono + - jsr +categories: + - news +date: 2024-06-02 +description: Deno v1.44がリリース, @std/uuid@0.224.3, @std/data-structures@0.225.0, Hono v4.4.0 (JSRにパッケージが公開) +--- + +## Deno v1.44 + +Deno v1.44がリリースされています。 + +以下に内容をまとめたため、よろしければこちらを参照いただければと思います。 + +* [Deno v1.44]({{< ref "articles/deno/v1.44.md" >}}) + +## `deno_std`のリリース + +`deno_std`が[リリース](https://github.com/denoland/deno_std/releases/tag/release-2024.05.29)されています。 + +### [`@std/uuid@0.224.3`](https://jsr.io/@std/uuid@0.224.3) + +#### `@std/uuid/v1` + +[generate](https://jsr.io/@std/uuid@0.224.3/doc/v1/~/generate)の`buf`と`offset`引数が非推奨化されています。 + +また、`V1Options`が`GenerateOptions`にリネームされています。 + +### [`@std/data-structures@0.225.0`](https://jsr.io/@std/data-structures@0.225.0) + +[`BinarySearchNode`](https://jsr.io/@std/data-structures@0.224.1/doc/~/BinarySearchTree)がprivate APIに変更されています + +## Hono v4.4.0 + +[Hono v4.4.0](https://github.com/honojs/hono/releases/tag/v4.4.0)がリリースされています。 + +HonoがJSRに公開されています。 + +- [@hono/hono](https://jsr.io/@hono/hono@4.4.0) diff --git a/content/articles/deno/v1.44.md b/content/articles/deno/v1.44.md new file mode 100644 index 00000000..590e7d39 --- /dev/null +++ b/content/articles/deno/v1.44.md @@ -0,0 +1,283 @@ +--- +title: Deno v1.44 +tags: + - Deno + - React +categories: + - release +date: 2024-06-02 +description: Deno v1.44がリリース。.npmrcのサポート, Node.js互換性の改善によりNext.jsが動作するように, Deno.exitCodeが追加, FFIでi64とu64が常にbigintで取り扱われるように, DENO_FUTURE=1が指定された際は--unstable-*なしでFFIやWebGPUが利用できるように, Deno.upgradeWebSocketのidleTimeoutのデフォルト値が変更, RequestとResponseでbytesメソッドが実装, deno testで時間がかかっているテストケースへ警告が表示されるように, deno lintにno-boolean-literal-for-argumentsルールが追加, deno serveに--port=0を指定するとランダムなポートが採番されるように, v8のPointer Compressionの有効化, キャッシュ用のSQLiteデータベースでWALモードが有効化, など +--- + +Deno v1.44がリリースされました。 + +この記事では主な変更点などについて解説します。 + +## Node.js互換性の改善 + +### `.npmrc`のサポート + +プライベートレジストリからnpmパッケージを読み込むために、`.npmrc`のサポートが追加されています。 + +現時点では`package.json`または`deno.json`と同一ディレクトリにある`.npmrc`のみが探索されます (ホームディレクトリなどからの読みこみはまだサポートされていません) + +`.npmrc`の設定内容は`npm:`などによりnpmパッケージを利用する場合に適用されます。設定内容としては、現時点では`_authToken`と`_auth`のみがサポートされています。 + +### 組み込みパッケージ + +主に[grpc-node](https://github.com/grpc/grpc-node)やNext.js, Eleventyなどに関連したNode.js組み込みパッケージの互換性が改善されています。 + +#### Next.jsのサポートについて + +公式ブログによると、`DENO_FUTURE=1`の指定が必要なもののNext.jsが動作するようになったようです (後日ブログポストが公開予定とのこと) + +#### `@google-cloud/vision`のサポート + +[@google-cloud/vision](https://www.npmjs.com/package/@google-cloud/vision)も動作するようになったようです。 + +#### 主な変更点 + +- `node:buffer`: `isUtf8`と`isAscii`が実装されています +- `node:fs`: `fstatSync`で`throwIfNoEntry`オプションがサポートされています +- `node:fs`: `write`などで`position`引数がうまく機能しない問題が修正されています +- `node:http`: `ServerResponse`で`statusCode`のデフォルト値が`undefined`から`200`に変更されています + - [@11ty/eleventy-dev-server](https://github.com/11ty/eleventy-dev-server)を動かすための対応 ([#78](https://github.com/11ty/eleventy-dev-server/issues/78)) + +### `node_modules/.bin` + +Denoが`node_modules`を作成する際に、`node_modules/.bin`が作成されるようになりました。 + +```shell +$ deno run --allow-env --allow-read --node-modules-dir npm:cowsay@1.6.0 hi + +$ ls node_modules/.bin +cowsay cowthink +``` + +### `deno.lock`サポート + +今まで`deno.lock`は`deno.json`がある場合は自動的に生成されていました。今回のリリースで`package.json`がある場合にも自動で`deno.lock`が作成されるように挙動が変更されました。 + +また`DENO_FUTURE=1`が設定された状態で`deno install`を実行した際に、`deno.lock`をベースにパッケージを解決することによりパフォーマンスの改善も図られています ([#23918](https://github.com/denoland/deno/pull/23918)) + +### `deno task` + +`deno task`でスクリプトを実行する際に、そのスクリプトで`npm run`が利用されていて かつ `npm run`にフラグが指定されていなければ、`npm run`を`deno task`に置きかえた上で`package.json`のスクリプトが実行されるように挙動が変更されています。 + +例えば、以下のような内容の`deno.json`と`package.json`が存在する場合、`deno task test`を実行すると、`package.json`の`hi`スクリプトが実行されます。 + +**`deno.json`:** + +``` +{ + "tasks": { + "hi": "echo deno.json", + "test": "npm run hi" + } +} +``` + +**`package.json`:** + +``` +{ + "scripts": { + "hi": "echo package.json" + } +} +``` + +## Deno API + +### `Deno.exitCode` + +`Deno.exitCode`が追加されました。`process.exitCode`と同様に、プロセス終了時の終了コードを設定することができます。 + +```shell +$ deno eval 'Deno.exitCode = 1;’ +$ echo $? +1 +``` + +### FFI (`Deno.dlopen`) + +`i64`と`u64`型が`number | bigint`型から`bigint`型で取り扱われるように変更されています。 + +### 安定化 + +#### `Deno.FsFile` + +`Deno.FsFile`の下記メソッドが安定化されました。(`--unstable-fs`なしで利用できます) + +- `sync` +- `syncSync` +- `syncData` +- `syncDataSync` +- `lock` +- `lockSync` +- `unlock` +- `unlockSync` + +### `DENO_FUTURE=1` + +`DENO_FUTURE=1`が設定された場合、下記の機能を`--unstable-*`オプションなしで利用できるようになりました。 + +- FFI (`Deno.dlopen`など) +- WebGPU API +- unstableなファイルシステムAPI (`Deno.umask`など) + +### `Deno.upgradeWebSocket`の`idleTimeout`のデフォルト値の変更 + +`Deno.upgradeWebSocket`の`idleTimeout`オプションのデフォルト値が`120`から`30`に変更されています。Nginxなどはデフォルトで60秒を想定しており、その影響で120秒だと想定よりも早く`Deno.upgradeWebSocket`でWebSocket接続が切れてしまう問題があったようです。 + +## Web API + +### `Request#bytes()`/`Response#bytes()` + +`Request`と`Response`で`bytes`メソッドがサポートされました。リクエストまたはレスポンスのボディを`Uint8Array`として取得できます + +```javascript +const response = new Response("OK"); +const body = await response.bytes(); +console.assert(body instanceof Uint8Array); +console.assert(new TextDecoder().decode(body) === "OK"); +``` + +### `ReadableStream.from`の改善 + +`ReadableStream.from`で`IterableIterator`だけでなく`Iterable`もサポートされました。 + +```javascript +const readable = ReadableStream.from({ + [Symbol.iterator]() { + let done = false; + return { + next() { + if (done) { + return { done: true }; + } else { + done = true; + return { value: 123, done: false }; + } + }, + }; + }, +}); +console.info(await Array.fromAsync(readable)); // => [ 123 ] +``` + +また、`ReadableStream.from`で`Symbol.asyncIterator`/`Symbol.iterator`の取り扱いが改善されています。これらに`null`が設定されていた場合に、`undefined`が指定された場合と同様に振る舞うように挙動が変更されています。 + +## CLI + +### `deno test` + +#### 時間がかかっているテストケースへの警告 + +`deno test`でテストケースの実行に時間がかかっている場合に警告が表示される機能が追加されました。 + +デフォルトでは`DENO_SLOW_TEST_TIMEOUT*(2**n)`ごとの間隔で警告が表示されます (`DENO_SLOW_TEST_TIMEOUT`のデフォルト値は`60`のため、60秒 → 120秒 → 240秒…といった間隔で警告が表示されます) + +```shell +$ DENO_SLOW_TEST_TIMEOUT=5 deno test test.js +running 1 test from ./test.js +slowTestCase ...'slowTestCase' has been running for over (5s) +'slowTestCase' has been running for over (10s) +'slowTestCase' has been running for over (20s) +``` + +#### `--clean`オプションが追加 + +`deno test`コマンドに`--clean`オプションが追加されています。`--coverage`オプションとの併用が想定されていて、このオプションが指定されている場合はテストの実行前に`coverage`ディレクトリが削除されます。 + +### `deno coverage` + +`deno coverage`コマンドで`--ignore`オプションが動作しない問題が修正されています。また、`coverage`ディレクトリにリモートスクリプト(`https:`)に対するjsonファイルが生成されてしまう問題も解消されています。 + +### `deno lint` + +#### `no-boolean-literal-for-arguments`ルールの追加 + +`no-boolean-literal-for-arguments`ルールが実装されています。以下のように`boolean`リテラルを関数の引数として指定している箇所に対して警告されます。 + +```typescript +function renderReport(verbose: boolean) { + // ... +} +renderReport(true); // => エラー +renderReport(false); // => エラー +``` + +以下のように定数を利用することで警告を解消できます。 + +```typescript +const VERBOSE = true; +const CONCISE = false; +function renderReport(verbose: boolean) { + // ... +} +renderReport(VERBOSE); +renderReport(CONCISE); +``` + +このルールはデフォルトでは無効化されているため、利用する際は`deno.json`などで明示的に有効化する必要があります。 + +```json +{ + "lint": { + "rules": { + "include": ["no-boolean-literal-for-arguments"] + } + } +} +``` + +#### `no-unused-vars`ルールの改善 + +`no-unused-vars`ルールがJSX/TSXファイルでも動作するように改善されています。 + +### `deno serve` + +[`deno serve`]({{< ref "articles/deno/v1.43.md" >}})コマンドの`--port`オプションに`0`を指定した場合、ランダムな空きポートが採番されるように改善されました。 + +### `vendor` + +`vendor`ディレクトリ(`deno.json`に`"vendor": true`を指定すると作成されます)のリモートファイルを編集しても、`deno.lock`による検証でエラーが発生しないように挙動が改善されています。 + +### `deno -v` + +`deno -v`でバージョンを表示できます。 + +```shell +$ deno -v +deno 1.44.0 +``` + +## パフォーマンス改善 + +### メモリ消費の改善 + +v8の[Pointer Compression](https://v8.dev/blog/pointer-compression)を有効化することで、メモリ使用量の最適化が図られています。 + +### キャッシュ用のSQLiteデータベースでWALモードが有効化 + +`DENO_DIR`配下に作成される各種キャッシュ用のSQLiteデータベースで`journal_mode=WAL`が適用されるようになりました。(v8コードキャッシュや`deno lint`, `tsc`による型チェックの高速化などで活用されています) + +これにより起動の高速化などが期待されるようです。この変更の影響でデータベースのファイル名がv2に変更されています (例: `$DENO_DIR/v8_code_cache_v2`) + +### `node_modules` + +`node_modules`のセットアップに関するパフォーマンスが改善されています。特にmacOSでは`copyfile`の代わりに`clonefile`を使うようにする最適化が導入されており、大幅な改善が見込まれるようです。([#23980](https://github.com/denoland/deno/pull/23980)) + +### 処理の並列化 + +swcによるソースの解析などを並列化することで、スクリプトの起動の高速化が図られています。 + +## バグ修正 + +`Deno.writeFile`に`ReadableStream`を渡すと、元のファイルの内容が部分的に置き換えられてしまう問題が修正されています。 + +## 参考 + +- https://github.com/denoland/deno/releases/tag/v1.44.0 +- [Deno 1.44: Private npm registries, improved Node.js compat, and performance boosts](https://deno.com/blog/v1.44)