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)として読み込む形式で記述してください。 - エラーハンドリングは最小限で構いません。