Upgrade to Pro — share decks privately, control downloads, hide ads and more …

モダンJSフレームワークのビルドプロセス 〜なぜReactは503行、Svelteは12行なのか〜

Avatar for Maple Maple
November 18, 2025

モダンJSフレームワークのビルドプロセス 〜なぜReactは503行、Svelteは12行なのか〜

JSConf 2025 の登壇資料です。

Avatar for Maple

Maple

November 18, 2025
Tweet

More Decks by Maple

Other Decks in Programming

Transcript

  1. Version Bundler Build Command React 19.1.1 esbuild 0.19.0 esbuild --bundle

    --minify --format=esm React Version Bundler Build Command Svelte 5.0.0 Vite 5.0.0 vite build --minify Svelte ビルド環境情報 5
  2. ビルド前ソースコード 1 2 3 4 5 6 7 8 9

    10 11 import from export default function const return button button { useState } ; () { [count, setCount] ( ); ( < onClick={() (count )}> Count: {count} </ > ); } 'react' Counter useState setCount = => + 0 1 1 2 3 4 5 6 7 < > let count = 0; </ > < on:click={() count }> Count: {count} </ > script script button button => ++ React Svelte 6
  3. ビルド後ソースコード 1 2 3 4 5 6 7 8 9

    var var var var var var var function return __create Object.create; __defProp Object.defineProperty; __getOwnPropDesc Object.getOwnPropertyDescriptor; __getOwnPropNames Object.getOwnPropertyNames; __getProtoOf Object.getPrototypeOf; __hasOwnProp Object.prototype.hasOwnProperty; (cb, mod) () { mod ( , cb[ (cb)[ ]])((mod { exports {} }).exports, mod), mod.exports; }; = = = = = = = => || = : __commonJS __require __getOwnPropNames 0 0 1 2 3 4 5 6 7 8 9 10 11 12 13 import as from var export default function let var var $ ; root $. ( ); ($anchor) { count $. ( ); button (); text $. (button); $. (() $. (text, ${$. (count) } )); $. ( , button, () $. (count)); $. ($anchor, button); } * = = = = => ?? => 'svelte/internal/client' `<button> </button>` `Count: '' ` 'click' template Button state root child template_effect set_text get event update append 0 React 503行 Svelte 12行 8
  4. 第1層:Component Foundation System createElement, Component基盤、 共通ユーティリティ 第2層:JSX Transformation System JSX変換、動的コンポーネント生成、

    Props管理 第3層:UI Update Optimization System UI最適化 第5層:State Management System 状態管理、副作用処理、ライフサイクル 抽象化 第4層:Rendering Control System レンダリング制御 抽象化アーキテクチャ概要 12 ※これは私がReactのビルド後コードを理解しやすくするために整理した独自の分類です
  5. createElement: JSX→Virtual DOM Component基底クラス 開発時型チェック Context API基盤 実行時に必要な処理 React ランタイムで処理

    コンパイル時で処理 テンプレート→直接DOMコード コンポーネントコンパイル TypeScript統合型チェック 自動依存追跡 同じ目標を異なる戦略で達成 Svelte VS 14
  6. 実行時に必要な処理 useState, useReducer useEffect 副作用制御 useMemo, useCallback カスタムHooks React ランタイムで処理

    コンパイル時で処理 ネイティブlet/const $: リアクティブ文 自動依存追跡 JavaScript関数 同じ目標を異なる戦略で達成 Svelte VS 22
  7. 抽象化層をすべて削除する Component Foundation System JSX Transformation System UI Update Optimization

    System Rendering Control System State Management System 削除される5層 残る必要最小限の機能 直接DOM操作 イベントハンドラー 状態更新関数 25
  8. 私が考えるこれまでの変遷と未来予想 2006-2014 jQuery時代 シンプルなDOM操作API プラグインエコシステムの充実 2015-2018 Virtual DOM時代 React, Vue

    2が主流 ランタイム抽象化による開発者体験向上 2019-2024 Svelte, Solid.js 認知拡大 パフォーマンス重視へ回帰 ランタイムオーバーヘッドの削減 2025- ハイブリッド時代 React Compiler 既存フレームワークでコンパイル最適化を採用 28