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

Deno v1.30

Deno v1.30がリリースされました。 この記事では主な変更点などについて解説します。 Node.js互換性の改善 2023年 Q1のロードマップで発表されていたNode.js組み込みパッケージの利用が正式にサポートされました。 以下のように、node:<パッケージ名>の形式でimportを記述すると、Node.js組み込みパッケージをDenoから利用することができます。 import { EventEmitter } from "node:events"; const emitter = new EventEmitter(); emitter.on("foo", console.log); emitter.emit("foo", "bar"); また、Node-APIの互換性の改善も引き続き実施されており、以下のAPIなどの互換性が向上されています。 napi_adjust_external_memory napi_detach_arraybuffer napi_is_detached_arraybuffer deno.jsonでのImport Mapsの定義がサポート こちらも2023年 Q1のロードマップで発表されていた機能になります。 deno.jsonでimportsやscopesなどが定義されていると、--import-map使用時と同様に、deno.jsonの定義内容を元にDenoがbare specifierが解釈してくれます。 例えば、以下のような内容のdeno.jsonが存在したとします。 { "imports": { "dax": "https://deno.land/x/dax@0.24.0/mod.ts" } } この場合、ソースコードでは以下のようにしてdaxモジュールを利用することができます。 import { $ } from "dax"; await $`echo foobar`; deno fmtでセミコロンの有無を制御できるように 今まで、Denoに搭載されたフォーマッタであるdeno fmtコマンドでは、ソースコードにおける行末のセミコロンの有無をカスタマイズすることができませんでした。 今回のリリースでは、deno.jsonでfmt.options.semiColonsオプションがサポートされました。 このオプションにfalseを設定すると、deno fmtの実行時に行末のセミコロンが取り除かれます。 { "fmt": { "options": { "semiColons": false } } } また、--options-no-semicolonsオプションにより、CLI経由でセミコロンの有無を制御することも可能です。...

January 29, 2023

Deno v1.29

Deno v1.29がリリースされました。 この記事では主な変更点などについて解説します。 サブプロセスAPIに関する変更 Deno.spawn, Deno.spawnSync, Deno.spawnChildの削除 Deno v1.28でDeno.Commandが実装されたため、下記のAPIが削除されています。 Deno.spawn Deno.spawnSync Deno.spawnChild このあたりの背景などについては、下記の記事で詳しく解説されています。 Deno.run と Deno.spawn と Deno.Command のどれを使えば良いのか また、Deno.Commandについてもv1.28.3でAPIが若干変更されています。 Deno.spawn系統のAPIからDeno.Commandへの移行について Deno.spawn()はDeno.Child#output(), Deno.spawnSync()はDeno.Child#outputSync()で代用できます。 const command = new Deno.Command("deno", { args: ["info", "--json"], }); const status = await command.output(); if (status.success) { console.info(new TextDecoder().decode(status.stdout)); } Deno.spawnChild()はDeno.Child#spawn()で代用できます。 const command = new Deno.Command("deno", { args: ["fmt", "--ext=json", "-"], stdin: "piped", stdout: "piped" }); const child = command....

December 18, 2022

Deno v1.28

Deno v1.28がリリースされました。 この記事では主な変更点などについて解説します。 npmパッケージサポートの安定化 Deno v1.25で実装されたnpmパッケージサポートが安定化されました。 今後は--unstableなしでnpmパッケージを読み込むことができます。 $ cat main.js import chalk from "npm:chalk@5.1.2"; console.log(chalk.green("Deno")); $ deno run --allow-read --allow-env main.js ただし、リモートモジュールの中にnpm:が含まれていた際は、従来どおり--unstableが要求されるため注意が必要そうです。 その他にも以下の改善などが実施されています。 peerDependenciesがサポート deno info --jsonでnpm:がサポート import.meta.resolveでnpm:が無効化 今後npmパッケージサポートに関して計画されている変更内容についてはロードマップを参照ください。 ロックファイルの自動適用と生成がサポート Denoにはアプリケーションが依存するサードパーティモジュールの内容を元にハッシュ値を計算し、ロックファイルと呼ばれるファイルに保存する機能があります。 アプリケーションを実行する際にサードパーティモジュールから再度ハッシュ値を計算し、ロックファイルに書き込まれたハッシュ値と比較することで、サードパーティモジュールの内容が改ざんされていないことを保証することができます。(インテグリティチェック) この挙動を有効化するには、従来では--lockと--lock-writeの指定が必要でした。 このリリースでは、deno.json(c)が存在する場合、ロックファイル(deno.lock)の生成とインテグリティチェックが自動で実施されるように挙動が変更されました。 $ ls deno.json main.js $ deno run main.js $ ls deno.json deno.lock main.js この変更に合わせて、既存のオプションやインテグリティチェックに関する挙動も一部変更されています。 --lockオプションの引数がオプショナルに変更 (デフォルトはdeno.lock) ロックファイルに列挙されていないパッケージが見つかった際に、インテグリティチェックが失敗しないように挙動が変更 新しく検出されたパッケージについては、ハッシュが自動でロックファイルに書き込まれます。そのパッケージのインテグリティチェックについては、次回以降のDenoの実行から適用されます。 また、このロックファイルの自動適用と生成を無効化するために--no-lockという新しいオプションも追加されています。 Deno.Commandの追加 Deno.CommandというDenoからサブプロセスを生成するための新しいAPIが実装されました。 利用するには--unstableと--allow-runの指定が必要です。 使用例 コマンドの実行結果の非同期での取得: const command = new Deno....

November 20, 2022

Deno v1.27

Deno v1.27がリリースされました。 この記事では主な変更点などについて解説します。 npmパッケージサポートの改善 Deno v1.25で追加されたnpmパッケージのサポートに関する改善が実施されています。 型チェックのサポート npm:で読み込んだnpmパッケージに対して型定義が適用されるようになりました これにより、deno checkなどのコマンドを実行した際に、npmパッケージを使用しているコードについても適切に型チェックが実行されます。 import { default as stringWidth } from "npm:string-width@5.1.2"; console.info(stringWidth("foo")); // => 3 console.info(stringWidth(123)); // => 型エラー このように、型定義ファイルを同梱したパッケージについては、自動でそれが読み込まれて適用されます。 型定義ファイルを同梱していないパッケージについては、@deno-typesを使用することで型定義を適用することができます。 // @deno-types="npm:@types/express@4.17.14" import { default as express } from "npm:express@4.18.2"; console.info(express("foo")); // => 型エラー Node-APIのサポート Deno本体にNode-APIのサポートが入りました。 Node-APIは、CやC++などを使用してネイティブアドオンを記述するためにNode.jsから提供されている仕組みです。 import { compress, uncompress } from "npm:lz4-napi@2.2.0" const data = await Deno.readFile("./deno.json"); const compressed = await compress(data); const uncompressed = await uncompress(compressed); Node-APIのサポートが入ったことにより、例えば、Prismaのクエリエンジンやnode-sqlite3などのパッケージも動かせる可能性が出てきました。...

October 30, 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

Fresh v1.1

Fresh v1.1がリリースされました。 この記事では主な変更点などについて解説します。 アップデート用スクリプトの追加 Freshのアップデート用スクリプトが追加されています。 $ deno run -A https://fresh.deno.dev/update . このスクリプトを実行すると、各種依存関係や後述するcompilerOptionsやTwindプラグインなどに関する変更が適用されます。 compilerOptions.jsxとcompilerOptions.jsxImportSourceのサポート Freshのプロジェクトの初期化時に、compilerOptions.jsxとcompilerOptions.jsxImportSourceが自動で設定されるようになりました。 これにより、.jsx/.tsxファイルで以下2行の指定が不要になります。 /** @jsx h */ import { h } from "preact"; 前述のアップデートスクリプトを実行すると、既存のプロジェクトにもこの設定が適用されます。 プラグインシステム ユーザがFreshの挙動を拡張できるようにするために、プラグインシステムが実装されました。 現時点では、生成されたHTMLに対するスクリプトやスタイルの注入などがサポートされています。将来的には、プラグイン経由でRouteやMiddlewareなどを追加できるようにすることが予定されているようです。 例として、公式でTwindプラグインが提供されており、start()のpluginsオプションで有効化できます。 // main.ts import { start } from "$fresh/server.ts"; import twindPlugin from "$fresh/plugins/twind.ts"; import manifest from "./fresh.gen.ts"; import twindConfig from "./twind.config.ts"; await start(manifest, { plugins: [twindPlugin(twindConfig)] }); このTwindプラグインを有効化すると、twを使わずにclassを指定できるようになります (PreactのOption Hooksを使用して twが自動で適用されます) <div class="font-bold">foobar</div> 前述のアップデートスクリプトを実行することで、twを使わずにclassを記述する形式へ自動で変換されます。 Preact Devtoolsのサポート Preact Devtoolsのサポートが追加されています。 devモード(deno task start)時は自動で有効化されるため、特に設定などは不要です。...

September 11, 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

Deno v1.24

Deno v1.24がリリースされました。 この記事では主な変更点などについて解説します。 --checkオプション指定時のトランスパイルの挙動が変更 tscがトランスパイル用途では使用されなくなりました。 型チェック トランスパイル --check (v1.23) tsc tsc --no-check (v1.23) - swc --check (v1.24) tsc swc --no-check (v1.24) - swc これにより、トランスパイルの効率化が見込まれます。 また、tscの実行結果をSQLiteにキャッシュする仕組みも導入されており、型チェックについても効率化が図られています。($DENO_DIR/check_cache_v1にSQLiteのデータベースファイルが作成されます) FFI(Deno.dlopen)の改善 v1.23.3でV8 Fast API Calls+JITコンパイルの導入による最適化が実施されました。 今回のリリースでは、64ビット値を取り扱う関数に対してもV8 Fast API Callsを利用した最適化が適用されるように改善されています。 サブプロセスAPIへの変更 Deno v1.21 で入ったサブプロセスAPIに変更が加わっています。 Deno.Child.unref()とDeno.Child.ref()のサポート 挙動としてはDeno.refTimerやDeno.unrefTimerと同様で、Deno.Child.unref()を呼ぶと、対象の子プロセスがDenoの終了をブロックしなくなります。 const child = await Deno.spawnChild("some_long_running_process", { args }); child.unref(); (破壊的変更) Deno.Childの型定義が変更 Deno.spawnChildで返却されるDeno.Childのstdio関連のプロパティに関する型定義が変更されています。 v1.23.4...

July 24, 2022

Deno v1.23

Deno v1.23がリリースされました。 この記事では主な変更点などについて解説します。 deno runやdeno cacheなどのコマンドでデフォルトの型チェックが無効化されました 下記コマンドで、デフォルトで型チェックが行われなくなります。 deno run deno cache deno eval deno repl 今後、型チェックを行いたい場合は、deno checkコマンドを使うか--checkオプションを指定する必要があります。 $ deno check mod.ts その他のdeno testなどのコマンドでは、引き続きローカルモジュールの型チェックがデフォルトで実行されます。 deno runが失敗する場合の対処方法 Denoは、型チェックを行わない場合、swcを使用してトランスパイルを行います。 その関係で、コードの実行時に、まれに問題が発生することがあるようです。 https://github.com/denoland/deno/issues/14900 問題に遭遇した場合は、--checkオプションを指定するとtscが使用されるため、問題を回避できる可能性があります。 $ deno run --check mod.ts Deno.sleepSync()の削除 Atomics.waitで代替可能であったり、イベントループを完全にブロックしてしまうなどの問題を抱えていたため、Deno.sleepSync()が削除されました。 Intl.v8BreakIteratorの削除 非標準APIであるため、Intl.v8BreakIteratorが削除されました。 代わりにIntl.Segmenterの使用が推奨されます。 deno taskコマンドの改善 --cwdオプションのサポート --cwdオプションにより、タスク実行時のカレントディレクトリを変更できるようになりました (デフォルトでは、deno.json(c)の配置場所がカレントディレクトリに設定されます) $ deno task --cwd ./src build リダイレクションのサポート タスクの定義でリダイレクションがサポートされました。 { "tasks": { "test": "echo foo > test.txt" } } また、/dev/nullにリダイレクトすると、出力が捨てられます (Windowsでも動きます)...

June 19, 2022