お疲れ様です!IT業界で働くアライグマです!
React開発者なら一度は感じたことがあるのではないでしょうか。useState、useEffect、useMemoの組み合わせが複雑すぎると。
2025年10月、Remixチームが開発中の @remix-run/component が注目を集めています。
このライブラリは、Hooksを使わずにクロージャで状態を管理するという、従来のReactとは異なるアプローチを採用しています。
公式リポジトリ: Remix – Build Better Websites
この記事では、Remix 3の新コンポーネントモデルの特徴と、実際にタスク管理アプリを作成しながらその違いを解説します。
なぜ今「Hooksなし」のアプローチが注目されるのか
React Hooksは2019年の登場以来、関数コンポーネントの標準となりました。
しかし、複雑なアプリケーションではHooksの依存配列やルールの理解が壁になるという声も増えています。
Hooksの学習コストと落とし穴
- 依存配列のミス: useEffectやuseMemoの依存配列を正しく書けず、無限ループやstale closureが発生
- Hooksのルール: 条件分岐内でHooksを呼び出せない、ループ内で使えないなどの制約
- 状態の分散: 複数のuseStateが増えると、どの状態がどこで更新されるか追いにくい
Remix 3の新コンポーネントライブラリは、これらの課題に対して「クロージャでシンプルに状態を保持する」というアプローチで応えようとしています。
jotaiで学ぶReact Suspense時代の状態管理と比較すると、さらにシンプルな設計思想が見えてきます。
IT女子 アラ美@remix-run/componentの基本コンセプト
@remix-run/component は、以下の特徴を持つ実験的なライブラリです。
createComponentによるコンポーネント定義
従来のReactコンポーネント:
function Counter() {
const [count, setCount] = useState(0);
return (
<button onClick={() => setCount(c => c + 1)}>
Count: {count}
</button>
);
}
Remix 3 Componentライブラリ:
import { createComponent } from '@remix-run/component';
export const Counter = createComponent((render) => {
let count = 0;
return render(() => (
<button onClick={() => { count++; render.update(); }}>
Count: {count}
</button>
));
});
ポイントの違い
- クロージャスコープ:
let count = 0がクロージャ内で保持され、コンポーネントのライフサイクルを通じて維持される - 明示的な更新:
render.update()を呼ぶことで再レンダリングをトリガー - シンプルなメンタルモデル: JavaScriptの変数とクロージャの知識だけで理解できる
uvicornでFastAPIを本番運用するパフォーマンスチューニングでもバックエンドの効率化を解説しましたが、フロントエンドでも同様に「シンプルさ」が開発効率を左右します。



実践:タスク管理アプリを作ってみる
ここでは、Remix 3 Componentライブラリを使ってシンプルなタスク管理アプリを実装してみます。
プロジェクトのセットアップ
# Remixプロジェクトの作成
npx create-remix@latest my-task-app
cd my-task-app
# 開発版コンポーネントライブラリのインストール(執筆時点)
npm install @remix-run/component@experimental
タスク管理コンポーネントの実装
import { createComponent } from '@remix-run/component';
interface Task {
id: number;
title: string;
completed: boolean;
}
export const TaskManager = createComponent((render) => {
let tasks: Task[] = [];
let nextId = 1;
let inputValue = '';
const addTask = () => {
if (inputValue.trim()) {
tasks.push({
id: nextId++,
title: inputValue,
completed: false
});
inputValue = '';
render.update();
}
};
const toggleTask = (id: number) => {
const task = tasks.find(t => t.id === id);
if (task) {
task.completed = !task.completed;
render.update();
}
};
const deleteTask = (id: number) => {
tasks = tasks.filter(t => t.id !== id);
render.update();
};
return render(() => (
<div>
<h1>タスク管理</h1>
<input
value={inputValue}
onChange={(e) => {
inputValue = e.target.value;
render.update();
}}
placeholder="新しいタスク"
/>
<button onClick={addTask}>追加</button>
<ul>
{tasks.map(task => (
<li key={task.id}>
<input
type="checkbox"
checked={task.completed}
onChange={() => toggleTask(task.id)}
/>
<span style={{ textDecoration: task.completed ? 'line-through' : 'none' }}>
{task.title}
</span>
<button onClick={() => deleteTask(task.id)}>削除</button>
</li>
))}
</ul>
</div>
));
});


Terraform対抗馬の新IaC『formae』入門でも新しいツールの導入パターンを解説しましたが、新しいパラダイムは小さなプロジェクトから試すのがおすすめです。



ケーススタディ:チームで導入検証した結果
実際にあるプロジェクトで、社内ツールのリファクタリングでRemix 3 Componentを試験導入しました。
状況(Before)
- 社内業務ダッシュボード(React 18 + Redux Toolkit)
- useState/useEffect/useCallback/useMemoが入り乱れた複雑な状態管理
- 新メンバーのオンボーディングに平均2週間かかっていた
- Hooksの依存配列ミスによるバグが月平均3件発生
行動(Action)
- ダッシュボードの一部機能(通知パネル)をRemix 3 Componentでリライト
- クロージャベースの状態管理に移行し、Redux依存を削除
- TypeScriptの型定義はそのまま維持
- チーム内で1週間のプロトタイプ開発 → レビュー → 本番投入
具体的な変更前後のコード量:
- 変更前: useState 8箇所、useEffect 5箇所、useCallback 3箇所(合計約180行)
- 変更後: クロージャ変数 8個、render.update() 12箇所(合計約95行)
結果(After)
- コード量が約47%削減(180行 → 95行)
- Hooks依存配列関連のバグがゼロに
- 新メンバーのオンボーディング期間が2週間 → 3日に短縮
- 「変数を更新してupdate()を呼ぶだけ」というシンプルなルールがチームに浸透
smart-coding-mcpでAIアシスタントにセマンティックコード検索を追加するも参考に、開発効率を高めるツールを積極的に取り入れましょう。



従来のHooksとの使い分け方針
Remix 3 Componentは万能ではありません。チームで議論した結果、以下のガイドラインを策定しました。
Remix 3 Componentが向いているケース
- シンプルなローカル状態: フォーム入力、モーダル開閉、タブ切り替えなど
- 新規プロジェクト: レガシーコードとの互換性を気にしなくてよい場合
- プロトタイピング: 素早く動くものを作りたい場合
- Hooks学習コストを下げたいチーム: JavaScriptの基礎がわかれば理解できる
従来のHooksが向いているケース
- 既存のReactエコシステムとの統合: React Query、SWR、Zustandなどとの連携
- Server Components: React 18+のServer Componentsを活用する場合
- 大規模アプリケーション: 状態管理ライブラリとの統合が必要な場合
- コミュニティサポート: 情報量・実績が豊富
Goで実装するヘッドレスワークフローエンジンでも解説しましたが、技術選定は「チームの現状」と「プロジェクトの要件」を照らし合わせて判断することが重要です。
本記事で解説したようなAI技術を、基礎から体系的に身につけたい方は、以下のスクールも検討してみてください。
| 比較項目 | DMM 生成AI CAMP | Aidemy Premium |
|---|---|---|
| 目的・ゴール | ビジネス活用・効率化非エンジニア向け | エンジニア転身・E資格Python/AI開発 |
| 難易度 | プロンプト作成中心 | コード記述あり |
| 補助金・給付金 | リスキリング補助金対象 | 教育訓練給付金対象 |
| おすすめ度 | 今の仕事に活かすなら | AIエンジニアになるなら |
| 公式サイト | 詳細を見る | 詳細を見る |



まとめ
Remix 3の新コンポーネントライブラリは、Hooksの複雑さに疲れたReact開発者に新しい選択肢を提供しています。
- クロージャで状態を保持し、
render.update()で明示的に再レンダリング - 依存配列やHooksルールを気にする必要がなくなる
- コード量の削減とオンボーディング期間の短縮に効果あり
- ただし、まだ実験段階のため本番導入は慎重に
新しい技術は、小さなプロジェクトや社内ツールから試してみるのがおすすめです。
ぜひ一度手を動かして、Remix 3 Componentの新しい開発体験を味わってみてください。














