2022/10/10〜2022/10/16の最新情報

deno taskの安定化について deno taskコマンドを安定化することが検討されているようです。 以下のPRではdeno taskを実行した際の警告メッセージが削除されています。 feat(task): remove warning about being unstable (#16281) この変更はv1.27での導入が検討されているようです。 deno lspでtextDocument/inlayHintが実装 以下のPRでdeno lspにtextDocument/inlayHintが実装されています。 feat: support inlay hints (#16287) textDocument/inlayHintの挙動については、TypeScript公式の以下のページがわかりやすそうです。 Inlay Hints こちらについてもv1.27でのリリースが検討されているようです Bartek Iwańczuk’s “Vite Got Deno-fied” at ViteConf 2022 Bartek Iwańczuk氏によるViteConf 2022での発表内容が公開されています。 Bartek Iwańczuk’s “Vite Got Deno-fied” at ViteConf 2022 DenoでViteの開発環境をセットアップし、Deno Deployへデプロイするまでの手順が解説されています。 https://twitter.com/deno_land/status/1580356550966722560 denoland/fresh_charts Deno公式でFresh向けのチャートライブラリが公開されています。 denoland/fresh_charts チャートを描画するための<Chart>コンポーネントやハンドラ向けのユーティリティなどが提供されているようです。 Chart.jsやred-agate-svg-canvasなどを活用して作成されているようです。 https://github.com/denoland/fresh_charts

October 16, 2022

2022/10/03〜2022/10/09の最新情報

Deno v1.26.1 Deno v1.26.1がリリースされました。 Node-APIの実装 DenoでNode-APIが実装されました。 Node-APIで実装されたアドオンのrequire()での読み込みがサポートされます。 Node-APIを有効化するためには、今のところ、--allow-ffiの指定が必要なようです。 (ただし、将来的にオプションが変わる可能性はあるようです) いまのところ、lightningcssやlz4-napiなどが動作することが確認されているようです。(napi-rs/napi-rs#900) Node.js互換に関する改善 Node-APIの実装以外に関する改善として、npm:経由で読まれたパッケージの依存関係の解析結果がキャッシュされるようになりました。 これにより、キャッシュが存在する場合は、Viteの起動が3倍近く高速化されているようです。 キャッシュの仕組みはSQLiteをベースに実装されており、$DENO_DIR/node_analysis_cache_v1にデータベースが作成されます。 その他の改善として、deno cacheでのnpm:のサポートやrequire()でのJSONファイルの読み込みなどがサポートされています。 Web Cache APIのバグ修正 Deno v1.26で追加されたCache APIに関するバグ修正が実施されています。 Cache.put()に渡したResponseオブジェクトがconsumed状態にならない問題が修正 Cache.put()に渡したResponseに紐づくReadableStreamの読み込みでエラーが起きると、リソースリークが発生する問題が修正 Cache.put()で書き込みに失敗したときに、中途半端にキャッシュが保存されないように改善 その他の修正 --unstableを付けないと、Deno.hostname()がundefinedになる問題が修正 (Deno.hostname()はDeno v1.26で安定化されています) リクエストボディの読み込みが最適化 (perf(ext/fetch): consume body using ops (#16038)) 一度、Request#text()などでリクエストボディを消費したにも関わらず、再度Request.bodyを参照するとRequest.bodyUsedがfalseに戻ってしまう問題が修正 Deno.serve()で、ステータスコードが204の際はContent-Lengthが設定されないように修正 SubtleCrypto.deriveBits()でlength引数に与えられた長さが考慮されない問題が修正 https://github.com/denoland/deno/releases/tag/v1.26.1 deno_std v0.159.0 deno_std v0.159.0がリリースされました。 std/textprotoの非推奨化 以下の理由などから、std/textprotoが非推奨化されました。 現在はdeno_stdの内部で使われていないこと deno_stdの方針として、GoスタイルのAPI(Deno.Reader/Deno.Writer)からWeb Streams APIベースへ移行されていること 今後は、このモジュールの使用は避けることが推奨されます。 std/streams/conversion: iterateReaderのバグ修正 iterateReaderに長年存在していたバグが修正されています。 具体的な修正内容については、以下の記事で詳細に内容が解説されています。 Deno のめっちゃ難しいバグを修正した - Qiita また、この修正に関連してiterateReader()の実装が効率化されています。(perf(streams): memory optimizations by avoiding large buffer allocation in a loop (#2748))...

October 9, 2022

2022/09/26〜2022/10/02の最新情報

Deno v1.26 Deno v1.26がリリースされました。 以下に変更内容をまとめたため、よろしければ参照ください。 Deno v1.26 deno_std v0.158.0 deno_std v0.158.0がリリースされました。 std/node child_processパッケージでexec/execFileSync/execSyncが実装されています。 その他には、process.getuid()とprocess.getgid()が実装されています。 また、fsパッケージのread()やWriteStreamなどの互換性が向上しています。 std/http/server handlerが返却したResponseのボディがすでに消費されている場合に、500エラーが発生するように修正されています。 https://github.com/denoland/deno_std/releases/tag/0.158.0 plug v1.0.0-rc.0 Deno FFI(Deno.dlopen)のヘルパーモジュールであるplugのv1.0.0 RC版が公開されています。 このリリースでの主要な変更点として、ダイナミックライブラリを読み込むためのprepare()がdlopen()にリネームされています。 https://github.com/denosaurs/plug/releases/tag/1.0.0-rc.0

October 2, 2022

Deno v1.26

Deno v1.26がリリースされました。 この記事では主な変更点などについて解説します。 --allow-sysオプションの追加 Deno.osReleaseやDeno.systemMemoryInfoなどのシステム情報を取得するためのAPIの利用を制御するために、--allow-sysオプションが追加されました。 $ deno run --unstable --allow-sys=osRelease,systemMemoryInfo main.js 元々、これらのAPIを使うには--allow-envの指定が必要でした。 ただ、これらのAPIの利用に--allow-envを要求することの副作用として、全ての環境変数にアクセスできるようになってしまうという問題がありました。 この問題を解決するため、--allow-sysという新しいパーミッションが導入されました。 Cache APIのサポート DenoにCache APIが実装されました。 const cache = await caches.open("v1"); const req = new Request("https://example.com/"); console.assert(await cache.match(req) === undefined); const res = new Response("foobar"); await cache.put(req, res); const cachedRes = await cache.match(req); console.assert(await cachedRes?.text() === "foobar"); 挙動について localStorageなどと同様にSQLiteをベースに実装されており、利用する際は特にパーミッションなどは要求されません。 ただし、localStorageとは異なり、DENO_DIRではなく/tmp/deno_cacheにSQLiteのデータベースやキャッシュされたコンテンツなどが保存されます。 制限 現時点では、いくつかの制限があるようです。 ignoreSearchやignoreMethodなどのクエリオプションはまだサポートされてないようです。 Cache.deleteを呼んだ際に、SQLiteデータベースに保存されたメタデータは削除されるものの、キャッシュされたコンテンツは削除されないようです。 npmパッケージサポートの改善 今回のv1.26のリリースでは、--no-npmオプションが実装されています。 これにより、npm:によるnpmパッケージのimportを無効化できます。 $ deno run --no-npm main.ts また、Denoでnpmパッケージのimportがサポートされたことにより、Deno v1....

October 2, 2022

2022/09/19〜2022/09/25の最新情報

Deno v1.25.4 Deno v1.25.4がリリースされました。 --node-modules-dirのサポート node_modulesディレクトリの存在に依存したnpmパッケージを動かせるようにするために、--node-modules-dirオプションが実装されました。 $ deno run -A --unstable --node-modules-dir npm:vite このオプションを指定すると、pnpmライクなレイアウトでnode_modulesが作られます。 これによって、npm installなしでViteが動かせるようになったようです。 詳しくは以下を参照いただければと思います。 vite-deno-example --reload=オプションでnpmパッケージがサポート --reload=npm:で全npmパッケージの再読込み、--reload=npm:<package>で指定されたパッケージだけを再読込みができます。 パフォーマンスチューニング いくつかのパフォーマンスチューニングが実施されています。 例) CLIの起動の高速化 console.log()などで文字列を出力する際のパフォーマンスが3倍近くまで高速化 TextEncoder.encodeInto()が5.4倍近くまで高速化 ファイルシステム関連のAPIの最適化 CLIの起動の高速化については、現在、様々なアイデアが検討されており、詳細については以下を参照いただければと思います。 perf: ideas to improve startup time (#15945) その他の変更点 同一ファイルに対して複数回deno docを実行すると、処理が失敗してしまう問題が修正されています。 Windows上でdeno compileを実行したときに、拡張子が非.exe形式の場合に、それが取り除かれてしまう問題が修正されています。 Deno.env.get/Deno.env.setに不正な変数名を指定した際のエラーメッセージが改善されています。 https://github.com/denoland/deno/releases/tag/v1.25.4 deno_std v0.157.0 deno_std v0.157.0がリリースされました。 std/collections/deep_merge.tsのバグ修正 ネストされたプロパティにおいてdeepMerge()のreplaceオプションが機能しない問題が修正されています。 std/nodeの改善 child_process.spawnSyncが実装されています。 また、FreeBSDでもstd/nodeが動作するように修正が行われています。 その他には、以下の改善などが実施されています。 fs.read()やfs.ReadStreamの互換性の向上 net.connect()が失敗したときに、'error' ⇒ 'close'の順にイベントが発火されるように修正されています。 process.envに不正な文字を含む環境変数が指定されたときに、TypeErrorを投げるのではなくundefinedを返すように修正されています。 Windows上でprocess.on('SIGTERM')が無視されるように修正されています。 https://github....

September 25, 2022

2022/09/12〜2022/09/18の最新情報

Deno v1.25.3 Deno v1.25.3がリリースされました。 npmパッケージサポートの改善 esm形式のモジュールからcjs形式のモジュールをimportする際の挙動のNode.jsとの互換性が向上しています。 deno run --unstable npm:<package>@version/subpathで.js形式または拡張子なしのファイルを実行できるようになりました。 typescript/tscを実行できない問題があったようです。 パッケージのサブパスにpackage.jsonがあれば、その定義内容を元にエントリポイントが解決されるようになりました。 --unstableが指定されたときは、NODE_DEBUGとNODE_OPTIONS環境変数に対して--allow-envのチェックがスキップされるように変更されました。 Flash(Deno.serve)の改善 同時に一つのリクエストしか処理できなかった問題が解消されています。 https://github.com/denoland/deno/releases/tag/v1.25.3 deno_std v0.156.0 deno_std v0.156.0がリリースされました。 std/node Deno本体のnpmパッケージサポートの改善に合わせて、バグ修正などが実施されています。 今回のリリースによってcpy-cliなどが動かせるようになったようです。 変更点: fs: ReadStreamとWriteStreamがnewなしで作成できるようになりました。 process: "FOO" in process.envなどでprocess.envを利用した際に、全パーミッションが要求される問題が解消されています。(内部的にDeno.env.toObject()が使用されないように修正されています) process: process.execPathが書き込み可能なプロパティに変更されました。(pnpmなどの書き込みを行うパッケージが存在したため) std/fs すでにシンボリックリンクが存在する場合にensureSymlinkが失敗しないように改善されています。 std/http/file_server serveFileにディレクトリのパスが指定された場合、404エラーが返却されるように修正されました。 (今までは200が返却されるものの、ボディを読もうとするとエラーが発生していたようです) https://github.com/denoland/deno_std/releases/tag/0.156.0 Mongooseサポートに向けたunstable APIの安定化について Mongooseのサポートに向けて、下記のAPIの安定化が検討されています。 Deno.consoleSize() Deno.hostname() Deno.osRelease() Deno.consoleSize()とDeno.hostname()についてはすでにPRが作成されており、次のv1.26あたりで安定化される可能性がありそうです。 Ultra v2.0.0-beta.6 Island Architectureのサポートなどが追加されています。 /examples/with-islands https://github.com/exhibitionist-digital/ultra/releases/tag/v2.0.0-beta.6 deno-sqlite v3.5.0 PreparedQueryに.first()と.firstEntry()が追加されています。 その影響で既存の.one()と.oneEntry()は非推奨化されています。 const query = db....

September 18, 2022

2022/09/05〜2022/09/11の最新情報

Deno v1.25.2 Deno v1.25.2がリリースされました。 (破壊的変更) Node.js互換モード(--compat)の削除 Deno v1.25.0でnpmパッケージのサポートが追加されたため、Node.js互換モード(--compat)が削除されました。 FFI Rustのdynasmrt crateを使用して、JITの仕組みが再実装されています。 こちらのコメントによると、これにより以下の点などが改善されているようです。 Windows x64 PCでもv8 Fast APIを使用した最適化が適用されるようになりました。 Denoからtinyccへの依存がなくなりました。 SElinuxが有効化されている環境でもFFIが動作するようになりました。 その他には、bool型のサポートが追加されています。 const dylib = Deno.dlopen(libPath, { "do_something_with_bool": { parameters: ["bool"], result: "bool", }, }); npmパッケージサポートの改善 pre-releaseタグがサポートされています。(例: npm:some-package@1.2.3-alpha.4) また、パッケージのバージョンが指定されなかった際に、そのパッケージの最新バージョンがインストールされるように改善されています。(dist-tagsのlatest で指定されたバージョンがダウンロードされます) その他には、npm:経由で読み込んだパッケージ内ではwindow変数が削除され、cjsモジュールが再帰的に解析されるように改善されています。 これによりVue.jsがimportできるようになっているようです。 import { createApp } from "npm:vue@3.2.39" console.log(createApp); deno_std v0.155.0 deno_std v0.155.0がリリースされました。 std/encoding/csv: stringify()のシグネチャが変更 (破壊的変更) stringify()が同期的に動作するように変更されています。 また、columnsオプションがオプショナルに変更されています。 具体的には、以下のように型定義が変更されています。 v0.154.0: stringify( data: DataItem[], columns: Column[], options?...

September 11, 2022

2022/08/29〜2022/09/04の最新情報

Deno v1.25.1 Deno v1.25.1がリリースされました。 Node.js互換に関する変更点 依存関係の解析結果に関するキャッシュが存在する場合、deno compileが失敗する問題が修正されています。 npm:URLで読み込まれたパッケージ内で、globalとglobalThisが一致するように修正されました。 node-fetchなどのglobal.Promiseを参照するパッケージが動かない問題があったようです。 semverの取り扱いに関するnpmとの互換性の向上 元々、Rustのsemver crateが使われていましたが、自前でパーサが実装されたようです。 *付きのConditional exportsがサポートされています。 { "exports": { ".": { "types": "./types/src/index.d.ts", "require": "./cjs/index.cjs", "import": "./esm/index.js" }, "./driver": { "types": "./types/src/driver/index.d.ts", "import": "./esm/driver/index.js" }, "./driver/*": { "types": "./types/src/driver/*.d.ts", "import": "./esm/driver/*.js" } } } package....

September 4, 2022

2021/08/22〜2022/08/28の最新情報

Deno v1.25.0 Deno v1.25.0がリリースされました。 以下の記事に変更点をまとめたため、詳しくはそちらを参照いただければと思います。 Deno v1.25 deno_std v0.153.0 deno_std v0.153.0がリリースされました。 std/encoding/csv: parse()が同期的に動作するように (破壊的変更) parse()の引数からBufReaderが削除されています これに伴い、parse()の戻り値がstring[][] | Record<string, unknown>[]に変更されています。 import { parse } from "https://deno.land/std@0.153.0/encoding/csv.ts"; const records = parse(`id,name 1,foo 2,bar`); console.log(records); // Output: [ [ "id", "name" ], [ "1", "foo" ], [ "2", "bar" ] ] std/http/cookie_mapモジュールが追加 MapライクなAPIをベースにCookieを管理するためのユーティリティモジュールが追加されました。 CookieMapはリクエスト及びレスポンスに関するCookieの管理に利用することができます。 import { CookieMap, mergeHeaders } from "https://deno.land/std@0.153.0/http/cookie_map.ts"; const req = new Request("http://localhost:3000", { headers: { cookie: "foo=bar; hoge=piyo;" }, }); const cookies = new CookieMap(req); cookies....

August 28, 2022

Deno v1.25

Deno v1.25がリリースされました。 この記事では主な変更点などについて解説します。 npmパッケージのサポート Denoでnpmパッケージのimportや実行が実験的にサポートされました。 npm installやnode_modulesなどを必要とせずにnpmパッケージを利用することができます。 import express from "npm:express@4.18.1"; const app = express(); app.get("/", (req, res) => { res.send("Hello"); }); app.listen(3000); このファイルを実行すると、npmパッケージがダウンロードされた後、ExpressによってHTTPサーバが起動します。 $ deno run --unstable --allow-env --allow-read --allow-net main.mjs $ curl http://localhost:3000 Hello 他のサードパーティモジュールなどと同様に、初回実行時のみnpmパッケージがダウンロードされ、DENO_DIRにキャッシュされます。(DENO_DIR/npm/registry.npmjs.orgに保存されるようです) また、npxライクにコマンドを実行することもできます。 $ deno run --unstable --allow-env --allow-read --allow-write npm:make-dir-cli@3.0.0 src/components 制限 現時点では利用するには--unstableが必要になります。 また、--allow-envや--allow-readも必要になります。 ロックファイル/型チェック/deno vendor/deno lsp/deno installなどでは、この機能はまだサポートされていません。 新しいHTTPサーバ (Flash) DenoにはHyperをベースにしたHTTPサーバ(Deno.serveHttp)が組み込まれています。 このHTTPサーバのさらなる高速化などを目的に、Flashという新しいHTTPサーバが実装されました。 Deno.serveというAPIによって、Flashを起動することができます。 const ac = new AbortController(); Deno....

August 28, 2022