2023/03/20〜2023/03/26の最新情報

Deno v1.32 Deno v1.32がリリースされました。 以下に内容をまとめたため、よろしければそちらを参照いただければと思います。 Deno v1.32 Deno v1.32.1 Deno v1.32.1がリリースされました。 Resizable ArrayBufferの無効化 Resizable ArrayBufferが無効化されています。 CVE-2023-28445 もしDeno v1.32.0を使用されている場合は、v1.32.1へのアップデートが推奨されます。 その他 deno run -に与えられたソースがJavaScriptではなくTypeScriptとして解釈されるように修正されています。(Deno v1.32.0での--extオプション導入時のリグレッションのようです) オブジェクトの値に改行が入った文字列があった際に、Deno.inspectで非compactな形式で結果が返されるように改善されています。 deno lspでenablePathsに末尾の/なしでパスが与えられた際も適切に動作するように修正されています。 (https://github.com/denoland/vscode_deno/issues/827) https://github.com/denoland/deno/releases/tag/v1.32.1 deno_std v0.181.0 deno_std v0.181.0がリリースされました。 std/front_matter - +++ブロックがサポート +++ブロックがサポートされました。 このブロック内ではTOML形式でメタデータを宣言できます。 +++ title = ”hello” +++ 本文... Hugoなどでこの形式がサポートされているようです。 std/testing/asserts 各種アサーション関数にカスタムのメッセージが与えられた際のエラーメッセージが改善されています。 例えば、assertEqualsにカスタムのmsg引数を渡した際に、msgに加えてdiffの内容も一緒に表示されるように挙動が改善されています。 assertEquals(1, 2, "カスタムメッセージ"); 上記のようなコードがあった場合、v0.181.0とv0.180.0ではそれぞれ以下のように出力されます。 v0.181.0 error: Uncaught AssertionError: Values are not equal: カスタムメッセージ [Diff] Actual / Expected - 1 + 2 throw new AssertionError(message); v0....

March 26, 2023

Deno v1.32

Deno v1.32がリリースされました。 この記事では主な変更点などについて解説します。 WebGPU APIの削除 Deno v1.8で追加されたWebGPU APIが削除されました。 バイナリサイズや起動速度に影響があったというのが理由のようです。 ただし、削除は一時的なもののようで、将来的には再びWebGPU APIが追加される想定のようです。 KVストア Deno本体にKVストアが実装されています。 ただし、こちらについてはまだ公式では紹介などはされておらず、今後、APIなどに大きな変更が入る可能性もあります。 詳細については、以下の記事を参照いただければと思います。 Deno v1.32でKVストアが実装されました TypeScript TypeScript v5.0.2へのアップデート Deno内部に搭載されているTypeScriptがv5.0.2へアップデートされました。 ただし、制限として、ES Decoratorsのサポートについては現時点では除外されているようです。 --allを指定しなかった際の初回の型チェックの実行が高速化 Denoでは型チェックの実行結果をSQLiteにキャッシュしておくことで、型チェックの効率化を図っています。 しかし、初回の型チェック実行時についてはこのキャッシュの仕組みが効かないため、型チェックの実行効率が少し落ちてしまいます。 この問題を解消するために、--allが指定されていない際は、ローカルのファイルのみを型チェックするように挙動が変更されました。 これによって、キャッシュが効いていない場合でも、場合によっては2倍程度の高速化が見られることもあるようです。 CLIに関する改善 deno compileでdynamic importとWeb Workerがサポート deno compileでdynamic importとWeb Workerを使用したコードのバイナリが作成できるようになりました。 例えば、以下のようなファイルがあったとします。 // sum.js export function sum(...numbers) { return numbers.reduce((a, b) => a + b, 0); } // main.js const { sum } = await import("./sum.js"); console.info(sum(1, 2, 3)); このようにシンプルなケースでは、特に設定などは不要でうまく動いてくれます。 $ deno compile -o main main....

March 26, 2023

Denoでpackage.jsonやnpmパッケージのサポートが入った理由について

Denoの公式ブログで、Deno v1.31でpackage.jsonサポートが実装された背景に関する解説が公開されました。 Why We Added package.json Support to Deno このページでは、こちらの記事を参考に内容を要約していきます。 背景について Denoにnpmパッケージやpackage.jsonのサポートが導入されたのは、以下における各課題の解決や既存のNode.jsプロジェクトを直接Denoで動作させられるようにすることが目的のようです。 依存関係の重複問題 例えば、アプリケーションが依存しているモジュールAとモジュールBがそれぞれ以下のモジュールに依存していたとします。 https://deno.land/std@0.180.0/async/deferred.ts https://deno.land/std@0.181.0/async/deferred.ts もし仮にstd/async/deferred.tsの内容が0.180.0と0.181.0で同一であったとしても、URL importの性質上、これらの両方のバージョンがモジュールグラフの中に含まれてしまうという課題があります。 既存のリモートモジュール管理における課題 Denoではdeps.tsやImport mapsなどによってリモートモジュールを管理する方法がありますが、これらには以下のような課題があります。 deps.ts package.jsonなどと比較すると冗長になってしまいがち ただし、Module DeclarationsやModule Source Importsなどの仕組みにより、ある程度改善の余地はある模様です Import Maps 合成可能ではないという欠点があること (プロセスにつき1つしかImport Mapsを使用できない) CDNに関する課題 Denoではesm.shなどを活用することで一部のnpmパッケージを利用することはできるものの、性質上、どうしてもサポートができないnpmパッケージがでてきてしまうという課題があります。 対象のnpmパッケージがtarアーカイブ中に特定のテキストファイルなどが含まれていることを前提としている場合などは、動作させることが困難になってしまいます。 例としては、bullmqなどのように、パッケージ内でテキスト形式でLuaスクリプトを管理しているパッケージなども存在し、こういったパッケージをサポートすることが難しくなります。 今後について npmパッケージやpackage.jsonなどのサポートがDenoに入ったとしても、URL importなどの既存のDenoの仕組みは将来に渡ってもサポートが予定されているということが説明されています。 また、新しいメジャーバージョン (Deno v2)を数カ月後にリリースすることを目標に開発が進められているようです。 Deno v2では、上記の依存関係の重複問題などの解消を目的に、deno:URLのサポートなどが検討されているようです。 import $ from "deno:dax@24.0/mod.ts"; await $`echo foobar`; Deno本体でsemverの解決をできるようにすることで、依存関係の重複問題などを緩和することなどが計画されているようです。

March 26, 2023

2023/03/13〜2023/03/19の最新情報

Deno v1.31.3 Deno v1.31.3がリリースされました。 CLI/APIに関する改善 deno infoとdeno docコマンドで--no-lock/--lockオプションがサポートされました。(挙動はdeno runコマンドなどと同様です) deno.jsonなどでcompilerOptions.typesエントリが定義されていると、型エラーが起きる問題が修正されています。 REPLでglobalThis.Denoやその配下で定義されたプロパティを削除しようとすると、プロセスがパニックする問題が修正されています。 Deno.makeTempFile(Sync)でファイルがすでに存在した際にリトライが行われるように挙動が改善されています。 Deno.serveHttp()でレスポンスエラーが発生した際に、nextRequestから返されるRequestのsignalがabortedに設定されるように修正されました。 Node.js互換性に関する改善 package.jsonが存在する または --node-modules-dirオプションが指定されたが、実行されたスクリプトではnpmパッケージがimportされていない場合に、node_modulesが作成されないように挙動が改善されました。 node_modulesのセットアップ中にプログレスバーが表示されるように挙動が改善されました。(#18136) node:crypto: createCipheriv()が実装されました。 (aes-128-cbcのみサポート) node:fs: writeFile()でencoding: "ascii"オプションがサポートされました。 https://github.com/denoland/deno/releases/tag/v1.31.3 deno_std v0.180.0 deno_std v0.180.0がリリースされました。 std/encoding関連モジュールのディレクトリ構造の見直し (破壊的変更) std/encodingで提供されていたcsv/front_matter/json/jsonc/toml/yamlモジュールが、トップレベルのモジュールとして独立しました。 今後は、例えば、csvモジュールを利用したい場合はstd/csv/mod.ts、yamlモジュールを利用したい場合はstd/yaml/mod.tsから読み込む必要があります。 ディレクトリの移動に合わせて、以下の変更も実施されています。 csvモジュールの細分化 以下のファイルが追加されており、必要なAPIのみを個別に読み込めるようになりました。 csv/stringify.ts csv/parse.ts csv/stream.ts jsonモジュールの細分化 以下のファイルが追加されており、必要なAPIのみを個別に読み込めるようになりました。 json/json_parse_stream.ts json/json_stringify_stream.ts json/concatenated_json_parse_stream.ts tomlモジュールの細分化 以下のファイルが追加されており、必要なAPIのみを個別に読み込めるようになりました。 toml/parse.ts toml/stringify.ts std/http/server_sent_event....

March 19, 2023

2023/03/06〜2023/03/12の最新情報

Deno v1.31.2 Deno v1.31.2がリリースされました。 Node.js互換性の改善 循環依存のあるpeerDependenciesの解決が改善 例えば、以下のようなシナリオにおいて、初回実行時はうまくいくものの、ロックファイルが適用されるとうまく動かないケースがあったようで、この問題が修正されています。 a -> b -> c -> d -> c -> b (peer) その他の改善 npm:URLを使っていると、依存関係が変わっていなくても、毎回Lockfileがtouchされてしまう問題が修正されています。 複数のDenoプロセスが同時にnode_modulesを更新できないように制御が入りました。 package.jsonの依存関係の解析に失敗しても、npmパッケージが実際にimportされるタイミングまではエラーが起きないように修正されています。 これにより、package.jsonは存在するものの、スクリプト内でnpmパッケージを利用していないようなケースでエラーが発生しなくなります。 node:cryptoのcreateHashが高速化されています。 util.types.isSharedArrayBufferが動作しない問題が修正されています。 .d.tsファイルの型チェックに関する修正 以下のようなケースで、deno checkなどでうまく型チェックが行われていなかった問題が修正されています。 エントリポイントに指定した.d.tsファイル エントリポイントに含まれるX-TypeScript-Types/<reference types="..." />経由で読み込まれる.d.tsファイル .d.tsファイル内のファイルタイプが指定されていないコードブロック (deno test --docの実行時のみ) Deno.UnsafePointer.ofの改善 Deno.UnsafePointer.ofでバッファのメモリを取得する際に、もしユーザーがバッファの参照をどこかに保持していなかった場合、孤立したポインタができてしまう可能性がありました。 この問題を解消するため、Deno.UnsafePointer.ofの内部でWeakMapを使ってポインタとバッファのマッピングが管理されるようになりました。 その他 WindowsでDeno.stdin.setRaw(false)によって適切にrawモードが無効化されるように修正されています localStorageへのアイテムのINSERT時に、事前に入力内容のサイズがチェックされるように挙動が修正されています https://github.com/denoland/deno/releases/tag/v1.31.2 deno_std v0.179.0 deno_std v0.179.0がリリースされました。 std/encoding/varint.tsの追加, std/encoding/varint/mod.tsの非推奨化 TypeScriptをベースに実装されたstd/encoding/varint.tsが追加されました。 (実装はhttps://deno.land/x/varintがベースのようです) これに合わせて、WASMベースのstd/encoding/varint/mod.tsが非推奨化されています。 std/fsの改善 std/fs/expand_glob: expandGlob()にfollowSymlinksオプションが追加されました (trueを指定すると、シンボリックリンクが解決されます) std/fs/ensure_dir: ensureDir()を同じディレクトリに対して並列で呼んだときに、Deno.errors.AlreadyExistsがthrowされる問題が修正されています。 std/fs/ensure_symlink: ensureSymlink()でtargetに対する相対的なリンクを作ろうとすると、意図せぬパスを指すリンクが作成されてしまう問題が修正されています (#2312) std/http/cookie - =の取り扱いが改善 Cookieの値に=が含まれていると、getSetCookiesが意図せぬ値を返す問題が修正されています。...

March 12, 2023

2023/02/20〜2023/02/26の最新情報

Deno v1.31 Deno v1.31がリリースされています。 以下に内容をまとめたため、よろしければそちらを参照いただければと思います。 Deno v1.31 Deno v1.31.1 Deno v1.31.1がリリースされています。 package.jsonサポートに関する改善 以下のいずれかの手段によって、package.jsonの自動探索を無効化できるようになりました。 DENO_NO_PACKAGE_JSON環境変数に1を設定する --no-configまたは--no-npmを指定する また、package.jsonが見つかった際のnpmパッケージのダウンロードに関する挙動が改善されています。package.jsonで依存関係として指定されたいずれかのパッケージが利用されるタイミングまでnpmパッケージのダウンロードが遅延されます。 これにより、npmパッケージに依存しないスクリプトを実行する場合は、package.jsonがあってもnpmパッケージがダウンロードされなくなります。 その他には、package.jsonの以下のスキームから始まるspecifierが無視されるように修正されています。 workspace: file: git: http: https: Deno.serve()でリモートアドレスの取得がサポート Deno.serve()に渡したhandlerの第2引数にオプションが渡されるようになりました。remoteAddrプロパティ(Deno.NetAddr)からリモートアドレスが取得できます。 Deno.serve({ handler: (req, { remoteAddr }) => { return Response.json(remoteAddr); }, }); その他のバグ修正 リモートモジュールからdata:URLをimportできなくなっていた問題が修正されています。 静的に解析ができないdynamic importが複数同時に実行された際に、まれにDenoがパニックする問題が修正されています。 Import Mapsでローカルモジュールへのマッピングが定義されていた場合、リモートモジュールからそのローカルモジュールをimportできない問題が修正されています。 https://github.com/denoland/deno/releases/tag/v1.31.1 deno_std v0.178.0 deno_std v0.178.0がリリースされました。 std/nodeの削除 Deno v1.31でDeno本体にstd/nodeが組み込まれました。 その影響により、std/nodeが削除されています。 もし、今後もstd/nodeを利用したい場合は、バージョンを明示した上でimportをするとよさそうです。 import { EventEmitter } from "https://deno....

February 26, 2023

Deno v1.31

Deno v1.31がリリースされました。 この記事では主な変更点などについて解説します。 package.jsonサポート Denoでpackage.jsonがサポートされました。 具体的には、以下のような機能などが実装されています。 package.jsonの自動探索 dependencies/devDependenciesの定義内容によるbare specifierの解決 deno taskによるscriptsの実行 package.jsonの自動探索 deno.jsonなどのファイルと同様に、Denoがpackage.jsonも自動で探索してくれるようになりました。 もしpackage.jsonが見つかった場合、必要に応じてdependenciesやdevDependenciesで記述された依存パッケージを自動でダウンロードし、デフォルトでnode_modulesディレクトリに保存してくれます。 (従来通り、package.jsonが存在しない状態でnpm:経由でnpmパッケージをimportした際は、--node-modules-dirを指定しない限り、node_modulesは作成されません) もし、package.jsonの自動探索を無効化したい場合は、以下のいずれかの手段で無効化できます (以下の機能は、それぞれ次のリリースであるv1.31.1で追加された機能のためご注意!) --no-configまたは--no-npmオプションを指定する。 DENO_NO_PACKAGE_JSON環境変数に1を指定する dependencies/devDependenciesによるbare specifierの解決 Denoがpackage.jsonのdependenciesやdevDependenciesで定義された依存関係を元に、Import Mapsライクにbare specifierを解決してくれるようになりました。 例えば、以下のような内容のpackage.jsonが存在したとします。 { "dependencies": { "chalk": "^5.2.0", "koa": "2" } } この場合、アプリケーションでは以下のようにbare specifierを記述することがでます。 import chalk from "chalk"; // => `npm:chalk@^5.2.0` import Koa from "koa"; // => `npm:koa@2` const app = new Koa(); app.use((ctx) => { ctx.body = "Hello world"; }); app....

February 26, 2023

2023/02/13〜2023/02/19の最新情報

先週のDenoの変更点 先週はDenoのリリースが行われていないため、直近のコミット内容をいくつか紹介いたします。 これらの変更が含まれると思われるDeno v1.31については、今週にリリースされる予定のようです。 deno_std/nodeのDeno本体への組み込み 今まで、deno_std/nodeとDeno本体は別々に開発されていた都合もあり、Denoからnpmパッケージを利用する際は、https://deno.land/std/nodeのダウンロードが背後で行われていました。 以下のコミットなどにおいて、V8のスナップショットの仕組みを利用して、deno_std/nodeをDeno本体へ組み込む変更が行われています。 refactor: allow to provide polyfills for Node modules from the snapshot (denoland/deno#17706) feat(ext/node): embed std/node into the snapshot (denoland/deno#17724) feat: wire up ext/node to the Node compatibility layer (denoland/deno#17785) これにより、https://deno.land/std/nodeからのモジュールのダウンロードが不要になるため、起動の高速化などが期待されます。 また、deno_std/nodeがDeno本体へ組み込まれたことにより、Node.js互換レイヤーの実装でDenoの内部APIの活用が行いやすくなり、パフォーマンスの向上や今まで実装が難しかったモジュールの対応などが進みやすくなりそうです。具体的には、以下のPRでnode:v8の実装が追加されています。 feat(ext/node): implement node:v8 (denoland/deno#17806) 今後、Node.js互換レイヤーの実装をJavaScriptからRustに置き換えていくことも検討されているようで、以下のissueで今後の計画が列挙されています。 Rewrite some of JavaScript API in “ext/node” to Rust (denoland/deno#17809) また、これらの変更を受けて、deno_std/nodeについては削除が検討されているようです。(今後は、Deno本体のリポジトリで開発が進められるようです) Remove std/node, it was merged into Deno itself (denoland/deno_std#3206) 今後、もしdeno_std/nodeを利用したいケースが出てきた際は、削除前のバージョンを明示してimportをする必要が出てくるかもしれません。...

February 19, 2023

2023/02/06〜2023/02/12の最新情報

Deno v1.30.3 Deno v1.30.3がリリースされました。 esm.shやunpkg.comなどからパッケージを読み込むと、deno lspが停止してしまう問題が修正されています。 また、console.log()などでclassを出力する際のフォーマットも改善されています。 class User {} console.info(User); // v1.30.3: `[Class: User]` // v1.30.2: `[Function: User]` https://github.com/denoland/deno/releases/tag/v1.30.3 deno_std v0.177.0 deno_std v0.177.0がリリースされました。 std/encoding/csv - BOMのサポート stringify()にbomオプションを指定できるようになりました。 trueを指定すると、出力されるCSVの先頭にBOMが付与されます。 また、trimLeadingSpaceオプションが未設定の場合でもparse()がBOMを認識するように改善されています。 std/node 以下のバグが修正されています。 node:child_process: execFile()にutil.promisify()がうまく適用されない問題が修正されています。 node:process: 標準入力にファイルがリダイレクトされている場合に、ファイルの末尾に達してもprocess.stdinからnullが返却されない問題が修正されています。 std/semver semver.increment()のmetadata引数に空文字列が渡された際に、ビルドメタデータが未設定にならない問題が修正されています。 import * as semver from "https://deno.land/std@0.177.0/semver/mod.ts"; const v = semver.increment( "1.2.3+1", // version "major", // release undefined, // options undefined, // identifier "", // metadata ); assert(v === "2....

February 12, 2023

2023/01/30〜2023/02/05の最新情報

Deno v1.30.1 Deno v1.30.1がリリースされました。 Node.js互換性の改善 Node-APIの互換性が改善されています。 napi_get_globalでDenoのglobalThisではなくglobalオブジェクトが返されるように修正されています。 napi_create_functionでlengthパラメータが誤ってチェックされていた問題が修正されています。 これらの変更により、Denoでref-napiが動くようになったようです。 その他には、deno replでnode:URLを使った際に、以下のエラーメッセージが表示されてしまう問題が解消されています。 Could not set npm package requirements. Error getting response at https://registry.npmjs.org/@types/node: An npm specifier not found in cache: "@types/node", --cached-only is specified. deno lspの改善 Import Maps関連のバグ修正が実施されています。 Import Mapsを更新した際に、LSPの再起動やコードの編集をせずとも更新内容が反映されるように挙動が改善されました Import Mapsが存在すると、fs形式のimportをnode:fsの形式へ変換するquickfixが機能しなくなる問題が修正されています その他の修正 performance.markのdetailオプションにArrayBufferやTypedArrayを指定するとエラーが発生する問題が修正されています https://github.com/denoland/deno/releases/tag/v1.30.1 Deno v1.30.2 Deno v1.30.2がリリースされています。 v1.30.1でCPU使用率の増加が見られたため、それを修正するために、急遽リリースされる運びになったようです。 deno version 1.30.1 large cpu increase #17629 https://github.com/denoland/deno/releases/tag/v1.30.2 deno_std v0.176.0 deno_std v0....

February 5, 2023