>100 Views
March 24, 26
スライド概要
2026-03-24 v-tokyo Meetup #24
https://vuejs-meetup.connpass.com/event/385025/
Fresh(https://fresh.deno.dev/)についての紹介、
FreshでのIslands Architecture
Freshの使い方
虎の穴ラボ株式会社は、主にとらのあな関連サービスのシステム開発を専門に担う、エンジニアの会社です。
Deno Fresh の現在 2026/03/24 v-tokyo Meetup #24 虎の穴ラボ オクタニ Copyright (C) 2025 Toranoana Lab Inc. All Rights Reserved.
自己紹介 1 奥谷 一陽 所属:虎の穴ラボ株式会社 仕事:Fantiaの開発 Ruby on Rails、 React 興味:Deno、TypeScript 購読中:数字であそぼ。 X:@okutann88 github:Octo8080X toranoana.deno 運営の1人 Copyright (C) 2025 Toranoana Lab Inc. All Rights Reserved.
自己紹介 2 2021年より足掛け 6年目 現在#24 番外含め 26回開催 エンジニア積極募集中です ! 技術書典 20 新刊出ます! Copyright (C) 2025 Toranoana Lab Inc. All Rights Reserved.
Deno 使ってる人 ✋ Copyright (C) 2025 Toranoana Lab Inc. All Rights Reserved.
Fresh 使ってる人 ✋ Copyright (C) 2025 Toranoana Lab Inc. All Rights Reserved.
アジェンダ - Fresh の現在 - Fresh での Islands Architecture - Fresh 私の使い方 Copyright (C) 2025 Toranoana Lab Inc. All Rights Reserved.
Fresh Copyright (C) 2025 Toranoana Lab Inc. All Rights Reserved.
Fresh 公式 https://fresh.deno.dev/ Copyright (C) 2025 Toranoana Lab Inc. All Rights Reserved. - シンプル - 使いやすい - 生産性高い
Fresh の現在 - 来歴から - 2022 年 6月 14日 : First Commit - 2022 年 6月 28日 : Fresh 1.0 登場 - Preact 採用 - この時点で Islands architecture を導入済み - 2023 年 6月 15日 : Fresh 1.2発表 - メインメンテナーが、 Luca Casonato氏から、 Marvin Hagemeister 氏へ交代 - Marvin Hagemeister 氏は、 Preactのメンテナー Copyright (C) 2025 Toranoana Lab Inc. All Rights Reserved.
Fresh の現在 - 来歴から - 2024 年 3月 15日 : The road to Fresh 2.0 公開 - ある種の 0->1のやり直し宣言 - 2025 年 9月 10日 : Fresh 2.0 登場 - Vite 基盤の上で動く FWに変貌 - HMR(Hot module reloading)の導入 - ミドルウェア周りは、 Express、Hono っぽい(極めて主観 )に変わった。 Copyright (C) 2025 Toranoana Lab Inc. All Rights Reserved.
Fresh の Islands architecture 導入 - プロジェクトルート 以下の islands ディレクトリに置いたものは、 Island として解釈。 => フロントエンドで動的に動く 「島」 になる。 Copyright (C) 2025 Toranoana Lab Inc. All Rights Reserved.
ハイドレーションされる前のレスポンス平文 (抜粋)
<body>
<div class="px-4 py-8 mx-auto fresh-gradient min-h-screen">
<div
class="max-w-screen-md mx-auto flex flex-col items-center justify-center"
>
<!--frsh:island:Counter:0:-->
<div class="flex gap-8 py-6">
<button id="decrement" class="px-2 py-1 border-gray-500 border-2 rounded-sm bg-white hover:bg-gray-200 transition-colors">
-1
</button>
<p class="text-3xl tabular-nums">3</p>
<button id="increment" class="px-2 py-1 border-gray-500 border-2 rounded-sm bg-white hover:bg-gray-200 transition-colors" >
+1
</button>
</div>
<!--/frsh:island-->
</div>
</div>
<script type="module" nonce="14e764dfa2894c5b9714e9a43910eb7a">
import { boot } from "/assets/client-entry-DidaFX42.js";
import Counter from "/assets/fresh-island__Counter-B2qLLSyD.js";
boot({
Counter,
}, '[[1],{"slots":2,"props":3},[],{"count":4},["Signal",5],3]');
</script>
</body>
Copyright (C) 2025 Toranoana Lab Inc. All Rights Reserved.
ハイドレーションされた後 (抜粋)
<body>
<div class="px-4 py-8 mx-auto fresh-gradient min-h-screen">
<div
class="max-w-screen-md mx-auto flex flex-col items-center justify-center"
>
<div class="flex gap-8 py-6">
<button id="decrement" class="px-2 py-1 border-gray-500 border-2 rounded-sm bg-white hover:bg-gray-200 transition-colors">
-1
</button>
<p class="text-3xl tabular-nums">3</p>
<button id="increment" class="px-2 py-1 border-gray-500 border-2 rounded-sm bg-white hover:bg-gray-200 transition-colors">
+1
</button>
</div>
</div>
</div>
<script type="module" nonce="14e764dfa2894c5b9714e9a43910eb7a">
import { boot } from "/assets/client-entry-DidaFX42.js";
import Counter from "/assets/fresh-island__Counter-B2qLLSyD.js";
boot(
{ Counter },
'[[1],{"slots":2,"props":3},[],{"count":4},["Signal",5],3]',
);
</script>
</body>
Copyright (C) 2025 Toranoana Lab Inc. All Rights Reserved.
IslandsとSignals - Island 同士は原則独立した世界です。それゆえ、状態共有は少々難しい。 - Preactは、Signalを提供しています。 特にPreactのSignalとは 親和性が高いものになっています。 - propsとしてSignalを渡せるように 1.2で改修された過去もあるくらいに、 「Fresh Islands Love Signals.」 と言っても過言ではないでしょう。 Copyright (C) 2025 Toranoana Lab Inc. All Rights Reserved.
Islands呼び出し側からの、 Signalを渡す。
// routes/signal_demo.tsx
import { useSignal } from "@preact/signals";
import { define } from "../utils.ts";
import Counter from "../islands/Counter.tsx";
export default define.page(function Home(ctx) {
const count = useSignal(3);
console.log("Shared value " + ctx.state.shared);
return (
<div class="px-4 py-8 mx-auto fresh-gradient min-h-screen">
<div class="max-w-screen-md mx-auto flex flex-col items-center justify-center">
<Counter count={count} />
<Counter count={count} />
</div>
</div>
);
});
Islandsの間で値の共有のための storeのようなものを置く必要がなく、
何に依存し値が共有されているのか?を定義と合わせて一意に定められる。
Copyright (C) 2025 Toranoana Lab Inc. All Rights Reserved.
Fresh 使い方 Copyright (C) 2025 Toranoana Lab Inc. All Rights Reserved.
Fresh 使い方 どんなものにつかってもいい! Copyright (C) 2025 Toranoana Lab Inc. All Rights Reserved.
公式 Showcase 世界中の開発者が 登録する Showcase 様々なものがあります https://fresh.deno.dev/showcase Copyright (C) 2025 Toranoana Lab Inc. All Rights Reserved.
LPサイト - Deno Fest https://deno-fest-2023.deno.dev/ Copyright (C) 2025 Toranoana Lab Inc. All Rights Reserved.
ドキュメントサイト - Thoth Doc ・ プレイグラウンド https://thoth-doc.deno.dev/ Copyright (C) 2025 Toranoana Lab Inc. All Rights Reserved.
Webアプリ - Pile-Up ・ リッチなフロントエンド ・ API https://pile-up.deno.dev/ Copyright (C) 2025 Toranoana Lab Inc. All Rights Reserved.
ゲーム - Deno Sandbox API Test Game ・ ゲーム ・ リッチなフロントエンド ・(Sandbox) https://deno-sandbox-api-test.octo8080x.deno.net/ Copyright (C) 2025 Toranoana Lab Inc. All Rights Reserved.
まとめ - Fresh は、Deno のWeb アプリケーションフレームワーク - Islands Architecture - Preact - Vite - Islands Architecture のIsland 間の連携が容易な仕組みを持つ - Freshは、何に使ってもいい Copyright (C) 2025 Toranoana Lab Inc. All Rights Reserved.
ぜひ、Freshを使ってみて deno run -Ar jsr:@fresh/init Copyright (C) 2025 Toranoana Lab Inc. All Rights Reserved.
ありがとうございました! Copyright (C) 2025 Toranoana Lab Inc. All Rights Reserved.