AI×Vibeコーディングの費用対効果を徹底検証! JavaScriptとTypeScript、あなたのプロジェクトに最適なのはどっち。という感じで検証してみました。
出来上がりはJS/TSどちらも同じこんなTODO Webアプリです。

ソース: https://github.com/mzsima/learn-mcp/tree/main/vibe-skillcheck-js-ts
Model
- gemni-2.5-pro-preview-03-25
結果
javascript win!
lang | input tokens | output tokens | total tokens | cost |
---|---|---|---|---|
javascript | 63.9k | 2.7k | 66.6k | $0.1069 |
typescript | 226.5k | 4.8k | 231.3k | $0.3314 |
ルール
プロジェクトのルートに配置した.rule ファイルに下記のルールを配置。AI Agentに「.ruleを読んでWebアプリを最後まで作り上げて」と指示する。
概要
シンプルなWebベースのTODOリストアプリケーションをHTML、CSS、typescriptで作成してください。
要件
- 使用技術:
- HTML
- CSS (標準的なCSSを使用してください。CSSはHTMLファイル内の
<style>
タグに記述するか、別途CSSファイルを作成してください。) - typescript (フレームワークは使用しないでください)
- 機能:
- タスク追加:
- テキスト入力フィールドと「追加」ボタンを設置してください。
- 入力フィールドにテキストを入力し、「追加」ボタンをクリックすると、新しいタスクがリストに追加されるようにしてください。
- 追加後、入力フィールドは空にしてください。
- 空のテキストは追加できないようにしてください。
- タスク表示:
- 追加されたタスクはリスト形式で表示してください。
- 各タスクには、完了状態を示すチェックボックス、タスク名、削除ボタンを表示してください。
- タスク完了/未完了切り替え:
- チェックボックスをクリックすると、タスクの完了/未完了状態が切り替わるようにしてください。
- 完了したタスクには打ち消し線を表示するなど、視覚的に完了状態がわかるようにしてください。
- タスク削除:
- 各タスクの隣にある削除ボタンをクリックすると、そのタスクがリストから削除されるようにしてください。
- データ永続化:
- ブラウザの
localStorage
を使用して、タスクの状態(内容、完了/未完了)を保存し、ページをリロードしてもタスクが保持されるようにしてください。
- ブラウザの
- タスク追加:
- UIデザイン (CSSでのスタイリング):
- 全体レイアウト:
- ページ全体 (
body
) の背景色は薄いグレー (#f3f4f6
) とし、コンテンツが垂直方向に中央揃えになるようにしてください。 - コンテナ (
div
など) は白い背景 (#ffffff
)、適切なパディング (1.5rem
程度)、角丸 (border-radius: 0.5rem;
)、影 (box-shadow: 0 4px 6px rgba(0, 0, 0, 0.1);
) をつけ、最大幅 (max-width: 28rem;
) を設定し、ページ中央に配置してください。
- ページ全体 (
- タイトル:
h1
タグで “TODOリスト” と表示し、フォントサイズを大きく (font-size: 1.5rem;
)、太字 (font-weight: bold;
)、下マージン (margin-bottom: 1rem;
) をつけ、中央揃え (text-align: center;
) にしてください。
- 入力エリア:
- 入力フィールドと追加ボタンを横並び (
display: flex;
) にし、下マージン (margin-bottom: 1rem;
) をつけてください。 input[type="text"]
は、横幅いっぱいに広がるように (flex-grow: 1;
) し、パディング (padding: 0.5rem;
)、ボーダー (border: 1px solid #ccc;
)、左側の角丸 (border-top-left-radius: 0.5rem; border-bottom-left-radius: 0.5rem;
) を設定してください。フォーカス時に枠線が目立つようにしてください (outline: none; border-color: #3b82f6; box-shadow: 0 0 0 2px rgba(59, 130, 246, 0.5);
)。プレースホルダーは「新しいタスクを入力」としてください。- 追加ボタン (
button
) は、背景色を青 (#3b82f6
)、文字色を白 (#ffffff
)、パディング (padding: 0.5rem 1rem;
)、右側の角丸 (border-top-right-radius: 0.5rem; border-bottom-right-radius: 0.5rem;
) を設定し、ホバー時に背景色が少し濃くなるようにしてください (background-color: #2563eb;
)。テキストは「追加」としてください。
- 入力フィールドと追加ボタンを横並び (
- タスクリスト:
ul
タグを使用し、リストマーカーを非表示 (list-style: none;
)、パディングをリセット (padding: 0;
) し、タスク間のスペース (gap: 0.5rem; display: flex; flex-direction: column;
) を設定してください。
- 各タスク (
li
):- 各タスク項目は、要素を中央揃え (
display: flex; align-items: center;
)、背景色を薄いグレー (#f9fafb
)、パディング (padding: 0.5rem;
)、角丸 (border-radius: 0.5rem;
) を設定してください。 - チェックボックス (
input[type="checkbox"]
) には右マージン (margin-right: 0.5rem;
) を設定してください。 - タスク名 (
span
) は、横幅いっぱいに広がるように (flex-grow: 1;
) してください。完了時は打ち消し線 (text-decoration: line-through;
) と文字色をグレー (color: #6b7280;
) にしてください。 - 削除ボタン (
button
) は、背景色を赤 (#ef4444
)、文字色を白 (#ffffff
)、左右パディング (padding: 0.25rem 0.5rem;
)、角丸 (border-radius: 0.5rem;
)、小さいフォントサイズ (font-size: 0.75rem;
) を設定し、ホバー時に背景色が少し濃くなるようにしてください (background-color: #dc2626;
)。左マージン (margin-left: 0.5rem;
) を設定してください。テキストは「削除」としてください。
- 各タスク項目は、要素を中央揃え (
- 全体レイアウト:
- その他:
- typescriptコードには、処理内容がわかるようにコメントを追加してください。
- CSSはHTMLファイル内の
<style>
タグに記述するか、別途CSSファイル(例:style.css
)として読み込む形式で記述してください。 - エラーハンドリングは最小限で構いません。