marko
You are an expert in Marko, the HTML-first UI framework by eBay that powers ebay.com. You help developers build high-performance web applications with streaming server rendering, automatic partial hydration, a concise tag-based syntax, and reactive state — optimized for fast first-paint and minimal client-side JavaScript through fine-grained reactivity and compiler optimizations.
下記のコマンドをコピーしてターミナル(Mac/Linux)または PowerShell(Windows)に貼り付けてください。 ダウンロード → 解凍 → 配置まで全自動。
mkdir -p ~/.claude/skills && cd ~/.claude/skills && curl -L -o marko.zip https://jpskill.com/download/15109.zip && unzip -o marko.zip && rm marko.zip
$d = "$env:USERPROFILE\.claude\skills"; ni -Force -ItemType Directory $d | Out-Null; iwr https://jpskill.com/download/15109.zip -OutFile "$d\marko.zip"; Expand-Archive "$d\marko.zip" -DestinationPath $d -Force; ri "$d\marko.zip"
完了後、Claude Code を再起動 → 普通に「動画プロンプト作って」のように話しかけるだけで自動発動します。
💾 手動でダウンロードしたい(コマンドが難しい人向け)
- 1. 下の青いボタンを押して
marko.zipをダウンロード - 2. ZIPファイルをダブルクリックで解凍 →
markoフォルダができる - 3. そのフォルダを
C:\Users\あなたの名前\.claude\skills\(Win)または~/.claude/skills/(Mac)へ移動 - 4. Claude Code を再起動
⚠️ ダウンロード・利用は自己責任でお願いします。当サイトは内容・動作・安全性について責任を負いません。
🎯 このSkillでできること
下記の説明文を読むと、このSkillがあなたに何をしてくれるかが分かります。Claudeにこの分野の依頼をすると、自動で発動します。
📦 インストール方法 (3ステップ)
- 1. 上の「ダウンロード」ボタンを押して .skill ファイルを取得
- 2. ファイル名の拡張子を .skill から .zip に変えて展開(macは自動展開可)
- 3. 展開してできたフォルダを、ホームフォルダの
.claude/skills/に置く- · macOS / Linux:
~/.claude/skills/ - · Windows:
%USERPROFILE%\.claude\skills\
- · macOS / Linux:
Claude Code を再起動すれば完了。「このSkillを使って…」と話しかけなくても、関連する依頼で自動的に呼び出されます。
詳しい使い方ガイドを見る →- 最終更新
- 2026-05-18
- 取得日時
- 2026-05-18
- 同梱ファイル
- 1
📖 Claude が読む原文 SKILL.md(中身を展開)
この本文は AI(Claude)が読むための原文(英語または中国語)です。日本語訳は順次追加中。
Marko — HTML-First UI Framework
You are an expert in Marko, the HTML-first UI framework by eBay that powers ebay.com. You help developers build high-performance web applications with streaming server rendering, automatic partial hydration, a concise tag-based syntax, and reactive state — optimized for fast first-paint and minimal client-side JavaScript through fine-grained reactivity and compiler optimizations.
Core Capabilities
Components
// components/product-card.marko — HTML-first syntax
<let/count=0/>
<div class="product-card">
<img src=input.imageUrl alt=input.name />
<h3>${input.name}</h3>
<p class="price">$${input.price.toFixed(2)}</p>
<div class="rating">
<for|star| of=Array.from({length: 5})>
<span class=(star < input.rating ? "filled" : "empty")>★</span>
</for>
</div>
<div class="actions">
<button onClick() { count++ }>
Add to Cart ${count > 0 ? `(${count})` : ""}
</button>
</div>
</div>
style {
.product-card {
border: 1px solid #e5e7eb;
border-radius: 8px;
padding: 16px;
transition: box-shadow 0.2s;
}
.product-card:hover {
box-shadow: 0 4px 12px rgba(0,0,0,0.1);
}
.filled { color: #f59e0b; }
.empty { color: #d1d5db; }
}
Streaming SSR
// pages/products.marko — Streaming server rendering
<let/products = fetch("/api/products").then(r => r.json()) />
<html>
<head>
<title>Products</title>
</head>
<body>
<h1>Our Products</h1>
<!-- Streams immediately, fills in when data arrives -->
<await|products| from=products>
<@placeholder>
<div class="skeleton-grid">
<for|_| of=Array(8)>
<div class="skeleton-card" />
</for>
</div>
</@placeholder>
<@then>
<div class="product-grid">
<for|product| of=products>
<product-card
name=product.name
price=product.price
imageUrl=product.image
rating=product.rating
/>
</for>
</div>
</@then>
<@catch|error|>
<div class="error">Failed to load products: ${error.message}</div>
</@catch>
</await>
</body>
</html>
Reactive State
// components/todo-list.marko
<let/todos=[]/>
<let/newTodo=""/>
<form onSubmit(e) {
e.preventDefault();
if (newTodo.trim()) {
todos = [...todos, { id: Date.now(), text: newTodo, done: false }];
newTodo = "";
}
}>
<input value=newTodo onInput(e) { newTodo = e.target.value }
placeholder="Add a todo..." />
<button type="submit">Add</button>
</form>
<ul>
<for|todo, index| of=todos>
<li class=(todo.done ? "done" : "")>
<input type="checkbox" checked=todo.done
onChange() {
todos = todos.map((t, i) =>
i === index ? { ...t, done: !t.done } : t
);
}
/>
<span>${todo.text}</span>
</li>
</for>
</ul>
<p>${todos.filter(t => t.done).length}/${todos.length} completed</p>
Installation
npx @marko/create my-app
cd my-app && npm install
npm run dev # Dev server with hot reload
Best Practices
- HTML-first — Write HTML with embedded JS, not JS that returns HTML; natural template syntax
- Streaming SSR — Use
<await>for async data; browser gets HTML progressively, no blank page - Automatic partial hydration — Marko only sends JS for interactive components; static parts stay as HTML
- Fine-grained reactivity —
<let/>creates reactive state; only changed DOM nodes update - Scoped styles — CSS in
style {}is scoped to the component; no class name collisions - Tags API — Components are custom tags;
<product-card>auto-resolves fromcomponents/directory - eBay scale — Powers ebay.com serving billions of pages/day; battle-tested for performance
- Compiler optimized — Build step optimizes component boundaries, splits server/client code automatically