fresh v1.3

fresh v1.3がリリースされました。 この記事では主な変更点などについて解説します。 非同期Routeコンポーネント 非同期Routeコンポーネントがサポートされました。 例えばデータベースや外部のAPIなどから非同期に取得したデータをRouteコンポーネントに渡すためには、今までは以下のようにhandlerを定義する必要がありました。 // routes/users/[id].tsx import type { Handlers, PageProps } from "$fresh/server.ts"; export const handler: Handlers<Data> = { async GET(req, ctx) { const user = await findUserByID(ctx.params.id); if (user == null) { return ctx.renderNotFound(); } const resp = await ctx.render(user); return resp; }, }; export default async function User(props: PageProps<User>) { return <UserDetail user={props.data} />; } 非同期Routeコンポーネントを利用することで、handlerを記述せずに非同期でのデータの取得とコンポーネントのレンダリングが行えるようになります。...

July 23, 2023

2023/07/10〜2023/07/16の最新情報

Deno v1.35.1 Deno v1.35.1がリリースされました。 Node.js互換性 node_modules/.deno/setup-cache.binという独自のキャッシュファイルが導入されています。 このファイルはnode_modules/.denoに関するディレクトリ構造を記録しており、このファイルを活用してシンボリックリンクの作成を効率化することで、node_modulesのセットアップを高速化することが狙いのようです。 https://github.com/denoland/deno/pull/19787 Deno.listenTls Deno.listenTlsのalpnProtocolsオプションを--unstableを指定せずに利用できるようになりました。(元々、Deno v1.35のリリース時に安定化される予定でしたが、今回のリリースで改めて安定化されました) https://github.com/denoland/deno/pull/19732 Deno.serve Deno.serveでBrotliによる圧縮が適用された際のパフォーマンスを改善するため、以下のパラメータが設定されています。 BROTLI_PARAM_QUALITY: 6 (ngx_brotliのデフォルトと同じ値) BROTLI_PARAM_LGWIN: 22 (brotliのデフォルトのウィンドウサイズ) https://github.com/denoland/deno/pull/19758 deno lsp deno.jsonのexcludeで指定されたファイルがdeno lspで取り扱われなくなるように挙動が改善されています。 https://github.com/denoland/deno/pull/19791 deno vendor deno.jsonのcompilerOptions.jsxImportSourceにImport Mapsで定義されたマッピングが指定された際に、対象のモジュールがベンダリングされない問題が修正されました。 https://github.com/denoland/deno/pull/19724 deno_std v0.194.0 deno_std v0.194.0がリリースされました。 std/msgpackが追加 MessagePackを取り扱うためのモジュールがdeno_stdに追加されています。 import { decode, encode } from "https://deno.land/std@0.194.0/msgpack/mod.ts"; const message = decode(encode({ type: "foo", message: "bar" })); console.info(message); // => `{ type: "foo", message: "bar" }` https://github....

July 16, 2023

2023/07/03〜2023/07/09の最新情報

Deno v1.35 Deno v1.35がリリースされました。 以下に内容をまとめたため、よろしければそちらを参照いただければと思います。 Deno v1.35 deno_std v0.193.0 deno_std v0.193.0がリリースされました。 std/http/user_agent.ts std/httpにユーザーエージェントを取り扱うためのユーティリティが追加されています。 import { UserAgent } from "https://deno.land/std@0.193.0/http/user_agent.ts"; const ua = new UserAgent("Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/114.0.0.0 Safari/537.36"); console.info(ua.browser); // => { name: "Chrome", version: "114.0.0.0", major: "114" } 直近でリリースされたOak v12.6.0にも、このstd/http/user_agent.tsを使用したUser-Agentのサポートが入っています。 std/json/concatenated_json_parse_stream.ts nullnullのように、セパレータなしで連続してnullやtrueなどの値が現れた際に、適切に処理が行われるように修正されました。 import { ConcatenatedJsonParseStream } from "https://deno.land/std@0.193.0/json/concatenated_json_parse_stream.ts"; const result = []; for await ( const x of ReadableStream.from(["nullnull", "1"])....

July 9, 2023

Deno v1.35

Deno v1.35がリリースされました。 この記事では主な変更点などについて解説します。 Deno API Deno.serveの安定化 Denoに組み込まれたHTTPサーバを起動するためのAPIであるDeno.serveが安定化されました。今後は--unstableを指定しなくても利用できます。 const ac = new AbortController(); setTimeout(() => ac.abort(), 10000); const server = Deno.serve({ signal: ac.signal, }, (req) => new Response("Hello Deno!")); await server.finished; これに合わせて、Deno.connectTlsのalpnProtocolsオプションも安定化されています。 Deno.listenTlsのalpnProtocolsオプションについては、おそらくv1.35.1で正式に安定化されるのではないかと思います。 新しいAPI Deno.errors配下に以下の新しいエラーが追加されています: NotADirectory FilesystemLoop IsADirectory NetworkUnreachable また、Deno.AtomicOperationが公開されています (今までは型定義のみが公開されていて、Deno名前空間では実際には定義されていませんでした) Web API ReadableStream.from ReadableStream.fromが実装されました。AsyncIteratorなどからReadableStreamを作成することができます。 function sleep(ms) { return new Promise((ok) => setTimeout(ok, ms)); } async function* gen() { for (let i = 0; i < 5; i++) { await sleep(i * 1000); yield i; } } const readableStream = ReadableStream....

July 9, 2023

2023/06/26〜2023/07/02の最新情報

deno_lint v0.48.0 deno_lint v0.48.0がリリースされています。 fresh向けにfresh-server-event-handlersという新しいルールが実装されています。 routes/ディレクトリに配置されたコンポーネントでイベントハンドラを設定しているコードがあればエラーが発生します。(このディレクトリのコンポーネントはhydrationされないため、イベントハンドラを設定しても動作しないためです) このルールは、おそらくDeno v1.35以降のバージョンから利用できるようになると思います。 注意点として、このルールにはデフォルトで有効化されるrecommendedタグは付与されていないため、利用したい際は以下のいずれかの方法で有効化する必要がありそうです。 deno.jsonのlint.rules.includeでfresh-server-event-handlersを指定する deno.jsonのlint.rules.tagsにfreshを指定する また、このfresh-server-event-handlersルール以外にも、fresh-handler-exportというルールの実装も進んでいるようで、freshに関するルールのdeno lintへの搭載が少しずつ進められているようです。 denoland/deno_core 今までdenoland/denoリポジトリ内で開発が進められていたdeno_core crateのリポジトリが独立されたようです。(#19658) 今後は以下のリポジトリで開発が進められていくようです。 https://github.com/denoland/deno_core cliffy v1.0.0-rc.1 DenoのCLIフレームワークであるcliffy v1.0.0のRCバージョンが公開されています。 新機能としてCommandクラス(cliffy/command)へのglobalActionメソッドの実装や、cliffyの内部で使われていたテスト用のヘルパーモジュール(cliffy/testing)の追加などが行われているようです。 また、cliffy/flagsのparseFlagsでのオプション名の見直しや、cliffy/promptのInput.promptでデフォルトのインデントの削除など、いくつか破壊的変更が行われているようです。 https://github.com/c4spar/deno-cliffy/releases/tag/v1.0.0-rc.1 fresh-tailwindcss freshからTailwind CSSを利用するためのプラグイン fresh-tailwindcss daisyUIの使用例なども公開されています。

July 2, 2023

2023/06/19〜2023/06/25の最新情報

Fresh Devtools Fresh本体にFresh Devtoolsという開発者ツールを実装することが検討されているようです。 Fresh Devtools #1321 経緯としては、Freshのバックエンドで動作する各種ハンドラなどはPreact Devtoolsではカバーしきれないという課題などの解消が狙われているようです。 また、Nuxt DevToolsのように、Freshアプリケーションの一部として開発者ツールをレンダリングできるようにすることなども考慮されているようです。 例えば、このFresh Devtoolsでroutesタブやpluginsタブ、Preact Devtools向けのタブなどを提供することで、生産性やデバッグなどのサポートをすることが構想されています。 denoland/kv_api Deno KVのデータをREST API経由で管理できるようにしてくれるモジュールが公開されています。 denoland/kv_api 現状はFreshのみがサポートされていますが、今後、Oakのサポートが追加されることも検討されているようです。 deno_std/msgpack deno_stdにMessagePackのサポートを追加するPRが作成されています。 feat: msgpack encoding #3460 まだマージはされていませんが、近いタイミングでリリースされる可能性もあるかもしれません。 Global database comparison Deno KVやDynamoDBなどのDeno Deployからの利用に適していると考えられる各種データベースについて、詳しく比較を行っているWebページが公開されています。 https://global-db-comparison.deno.dev/

June 25, 2023

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

fresh v1.2 fresh v1.2がリリースされました。 変更内容について以下のページにまとめたため、よろしければ参照いただければと思います。 fresh v1.2 Deno v1.34.3 Deno v1.34.3がリリースされました。 Deno KVにキューが実装 Deno.KvにenqueueとlistenQueueメソッドが追加されています。 const kv = await Deno.openKv(":memory:"); // メッセージを追加します。 const res = await kv.enqueue({ id: 1, payload: "foo" }); assert(res.ok); let message; // キューを購読します const listenPromise = kv.listenQueue((_message) => { message = _message; }); kv.close(); await listenPromise; // closeするとresolveされます console.info(message); // Output: { id: 1, payload: "foo" } Deno.Kv.enqueueには以下のオプションを指定できます。 オプション 説明 keysIfUndelivered メッセージの処理に失敗した際にKVに設定したいエントリを指定できます delay 配送までの遅延時間を指定できます(最大で1週間まで指定できて、デフォルトは0です) listenQueueに渡したコールバックが失敗した際は、自動的にリトライされます。(リトライ回数は最大で5回のようです)...

June 18, 2023

fresh v1.2

fresh v1.2がリリースされました。 この記事では主な変更点などについて解説します。 このリリースに合わせて、PreactのメンテナーであるMarvin Hagemeister氏がDeno社に入社されたことが発表されています。これからMarvin Hagemeister氏を中心に、フルタイムでFreshの開発が進められていくことが計画されているようです。 アップデートについて freshはアップデート用のスクリプト(update.ts)を提供しています。 以下のコマンドを実行すると、v1.2へアップデートすることができます。 $ deno run -A -r https://fresh.deno.dev/update . また、このバージョン以降からinit.ts (freshのプロジェクト初期化用のスクリプト)で作成したプロジェクトでは、deno task updateでもfreshをアップデートすることができます。 Islandコンポーネントに関する改善 props.childrenのサポート Islandコンポーネントでprops.childrenがサポートされました。 import type { PageProps } from "$fresh/server.ts"; import Collapse from "../islands/Collapse.tsx"; function Content() { return <div>foobar</div>; } export default function Index(props: PageProps) { return ( <Collapse> <Content /> </Collapse> ); } またIslandコンポーネントをネストすることもできます。 export default function Index(props: PageProps) { return ( <Collapse> <Collapse> <Content /> </Collapse> </Collapse> ); } 制限として、children以外のpropsにコンポーネントを渡すことはまだサポートされていません。...

June 18, 2023

2023/06/05〜2023/06/11の最新情報

Deno v1.34.2 Deno v1.34.2がリリースされました。 Node.js互換性 node:http2が追加されました。 http2.connectとhttp2.createServerの基本的な実装が追加されています。 node:fs/promises: FileHandleの以下のメソッドが実装されました。 readFile() read() write() close() node:child_process: spawnのstdioオプションで[0, 1, 2]の指定がサポートされました。 node:process: process.stdoutにpipeされたReadableストリームがクローズされた際に、process.stdoutも一緒にクローズされてしまう問題が修正されています。 Web API 巨大なArrayBufferをconsole.logなどで表示しようとした際に、誤ってdetached状態として表示される問題が修正されました。 EventTargetのリスナ内で同一イベントへのリスナを新しく登録した際に、登録されたばかりのリスナが即座に呼ばれてしまう問題が修正されました。 パフォーマンス改善 主にHTTPサーバ(Deno.serve)に対して、様々なパフォーマンス改善が実施されています。 perf: use sendto syscalls #19414 perf(ext/http): Add a sync phase to http serving #19321 perf(ext/http): Use flat list of headers for multiple set/get methods #19336 perf(ext/http): Migrate op_http_get_request_headers to v8::Array #19354 perf(ext/http): Migrate op_http_get_request_method_and_url to v8::Array #19355 perf: optimize RegExp usage in JS #19364 perf(http): avoid flattening http headers #19384 deno_std v0....

June 11, 2023

2023/05/29〜2023/06/04の最新情報

Deno v1.34.1 Deno v1.34.1がリリースされました。 deno compile DENO_DIRが読み取り専用であった際に、deno compileで作ったバイナリがうまく動かない問題が修正されました。 npmパッケージ内に含まれるファイルを読む際に、deno compileに--allow-readを指定しているにも関わらず、バイナリの実行時に再度--allow-readが求められる問題が修正されました。 Node-API napi_get_cb_infoでdata引数が適切に取り扱われるように改善されました。 Deno.createHttpClient オプションとしてhttp2: falseとhttp1: trueの両方が指定された場合に、ALPNでh2が指定されないように修正されました。 denoland/deno_kv_oauth Deno公式で、Deno KVをベースにOAuthのアクセストークンやセッションなどの管理を行ってくれるモジュールが公開されています。 https://github.com/denoland/deno_kv_oauth ロードマップについては、以下で公開されています。 https://github.com/denoland/deno_kv_oauth/issues/1 window変数の削除について Deno 2.0でwindow変数の削除が検討されているようです。 remove window variable #13367 背景としては、既存のライブラリにはwindow変数の有無に応じて現在の環境(ブラウザ or Node.js)を判断しているものが多く存在し、Denoでそういったライブラリを利用する際に、意図せずしてブラウザであると判定されてしまうことを防ぎたい、という狙いがあるようです。 次のマイナーリリースであるDeno 1.35では、window変数が参照された際に警告を表示する変更を入れることが検討されているようです。 feat(runtime): log deprecated message on first usage of window global #19319 esbuild_deno_loader v0.8.0 esbuild_deno_loader v0.8.0がリリースされました。 npm:URLやnode_modulesのサポートが行われています。 "native"ローダーでは、通常のDenoにおけるnpm:などと同様に、依存するnpmパッケージはDenoのグローバルキャッシュ(DENO_DIR)から読み込みやダウンロードなどが行われるようです。 ただし、Deno Deployなどでも動作する"portable"ローダーでは、--node-modules-dirなどによって事前にnode_modulesディレクトリが作成されていないと動作しないなどの制限があるようです。 freshでのnpm:サポート またマージはされていませんが、esbuild_deno_loader v0.8.0を活用してfreshにnpm:のサポートを入れる対応が進められているようです。 feat: limited npm: specifier support #1245

June 4, 2023