dev-server について
dev-serverは、Vite、Next.jsなどのツールチェーンをインストール済みのローカルランタイムに接続するEditframeスキルです。エディタールート、ソースのミラーリング、任意のローカルメディアルートを説明します。
主な機能
- 01ViteとNext.jsのランタイムアダプター
- 02選択したソースファイルのミラーリング
- 03ローカルメディアルートとトランスコード
- 04字幕生成とURL署名
- 05スタンドアロンサーバーまたはミドルウェア設定
活用シーン
- 01ViteまたはNext.jsアプリとEditframeの接続
- 02開発中のコンポジションファイル同期
- 03ローカルメディアと字幕の提供
- 04他のツールチェーンへのEditframeルート追加
インストール
コマンドをコピーしてターミナルで実行します。
npx skills add https:/ / github.com/ editframe/ skills --skill dev-serverインストール後、Claude Code で/dev-serverを入力して読み込まれたか確認します。
詳細
開発サーバー
Editframe フレームワークアダプターは、アプリをインストール済みの Editframe ランタイムに接続します。このランタイムはローカルブリッジです。ランタイムの状態、コンパイル、メディア、エクスポートを管理します。アダプターはブラウザーエディターへのローカルルートを追加します。また、選択したソースファイルをコンポジションにミラーリングすることもできます。
まず、https://editframe.com/agent からランタイムをインストールしてください。npm パッケージにブリッジは含まれていません。
フレームワークに応じて、統合方法を 1 つ選択してください。
- Vite(
npm create @editframeのhtml/reactテンプレート):@editframe/vite-plugin。 - Next.js(
nextjsテンプレート):@editframe/nextjs-plugin。 - ブリッジを使わないローカルメディアルート(JIT トランスコード、ローカルキャプション、URL 署名):これらのプラグインの
/advancedエントリー、または@editframe/dev-serverを使用します。「高度な設定:ローカルメディアルート」を参照してください。
スキャフォールドされたプロジェクトには、適切なアダプターがすでに含まれています。editframe-create スキルを参照してください。
ブリッジを選択する
各アダプターには、絶対パスの projectRoot とインストール済みのブリッジが必要です。次のいずれかの方法でブリッジを指定してください。
executable:ブリッジ実行ファイルの絶対パス。componentRoot:検証済みコンポーネントのインストール先の絶対パス。- どちらのオプションも省略した場合は、
EDITFRAME_BRIDGE_PATHまたはEDITFRAME_COMPONENT_ROOT環境変数を使用します。
スキャフォールドされたテンプレートではどちらのオプションも省略されているため、環境変数が読み込まれます。ブリッジ実行ファイル単体では、エディターとコンパイラーのアセット(editorDir、compilerPack)も必要になる場合があります。検証済みコンポーネントには、これらのアセットが含まれています。
editframe CLI も、--bridge、--component、または同じ環境変数を使って、同じ方法でブリッジを選択します。editframe-api スキルを参照してください。
Vite の設定
// vite.config.ts
import path from "node:path";
import { defineConfig } from "vite";
import { vitePluginEditframe } from "@editframe/vite-plugin";
export default defineConfig({
plugins: [
vitePluginEditframe({
projectRoot: path.resolve(__dirname),
executable: "/absolute/editframe-bridge", // or componentRoot, or an environment variable
}),
],
});
Vite 開発サーバーで /@ef/workspace を開いてください。プラグインは認証済みのブラウザーエディターにリダイレクトします。アプリがエディターのベアラートークンを受け取ることはありません。このルートはローカルリクエストのみを受け付けます。ホスト型エディターのエンドポイントとして公開しないでください。
以前の root および cacheRoot オプションは @editframe/vite-plugin/advanced に属します。デフォルトのプラグインはメディアサーバーを起動しません。
Next.js の設定
オプションはサーバー専用のファイル 1 つに記述してください。これにより、以下の両方の呼び出しで同じ値が使われます。
// editframe.config.mjs
import path from "node:path";
import { fileURLToPath } from "node:url";
export default {
projectRoot: path.dirname(fileURLToPath(import.meta.url)),
executable: "/absolute/editframe-bridge", // or componentRoot, or an environment variable
};
// next.config.mjs
import { withEditframe } from "@editframe/nextjs-plugin";
import editframe from "./editframe.config.mjs";
export default withEditframe(editframe, {
// your Next.js config
});
Node.js のルートハンドラーを追加してください。app ディレクトリの場所に合わせて相対インポートを調整してください。
// src/app/api/editframe/workspace/route.ts
import { createEditframeRoute } from "@editframe/nextjs-plugin";
import editframe from "../../../../../editframe.config.mjs";
export const runtime = "nodejs";
export const GET = createEditframeRoute(editframe);
Next.js 開発サーバーで /@ef/workspace を開いてください。リライトによってリクエストがルートハンドラーに転送されます。ハンドラーは認証済みのブラウザーエディターにリダイレクトします。ローカルリクエストとトークンに関する Vite のルールもここに適用されます。
以前のサイドカーオプションは @editframe/nextjs-plugin/advanced に属します。
アプリのソースをミラーリングする
source を設定すると、選択したプロジェクトファイルをコンポジションにミラーリングできます。ブリッジはファイルをコンパイルし、各リビジョンをチェックします。
vitePluginEditframe({
projectRoot: path.resolve(__dirname),
source: {
kind: "html", // "source" for a React or TypeScript entry
entryPath: "src/composition.html",
files: ["src/composition.html"],
onError: console.error,
},
}),
projectRootからの相対パスを使用してください。- コンポジションの各ファイルを
filesに列挙してください。エントリーファイルも含めてください。 filesには最大 256 個の一意なパスを指定できます。- アダプターは新しいファイルやアセットを検出しません。新しいファイルはそれぞれ、自分で
filesに追加してください。 - オプションのフィールド:
compositionId、title、width、height、durationMs、onCommitted。
ランタイムが利用できない場合でも、Vite 開発サーバーは起動し、アプリを配信します。その場合、アダプターは同期エラーを一度だけ onError に送信します。onError を省略すると、Vite は警告を 1 つ表示します。ランタイムが利用可能になるまで、/@ef/workspace はセットアップメッセージとともに 503 を返します。
Next.js アダプターも同じ source オブジェクトを受け付けます。共有設定ファイルに記述してください。
高度な設定:ローカルメディアルート
/advanced エントリーでは、以前のリリースのローカルメディアサーバーを引き続き利用できます。ブリッジを使わずにローカルメディアを配信するカスタム設定で使用してください。これらのルートはクラウド API を使わずにメディアをローカルで処理します。URL 署名ルートでは Editframe クラウド API を使用します。
Vite
// vite.config.ts
import { defineConfig } from "vite";
import { vitePluginEditframe } from "@editframe/vite-plugin/advanced";
export default defineConfig({
plugins: [
vitePluginEditframe({
root: "./src", // base directory local `src=` paths resolve against
cacheRoot: "./cache", // directory for cached transcoded assets
}),
],
});
プラグインは Vite 自身の開発サーバーにマウントされます。以下の例のように、コンポジションの api-host にブラウザーの Vite オリジンを設定してください。これにより、リクエストは同じオリジンを使います。
Next.js
// next.config.mjs
import { withEditframe } from "@editframe/nextjs-plugin/advanced";
export default withEditframe(
{ root: "./src", cacheRoot: "./cache" },
{
// your Next.js config
},
);
この withEditframe は、デフォルトではポート 3099 で、next dev と並行してサイドカー HTTP サーバーを起動します。port オプションでポートを変更できます。rewrites() ルールは Editframe のリクエストをサイドカーにプロキシします。コンポジションの api-host にはポート 3099 ではなく、ブラウザーの Next.js オリジンを設定してください。通常どおり next dev を実行します。
サイドカーは本番環境では起動しません。代わりに実際のメディア(クラウドレンダー、アップロードしたファイル)を使用してデプロイしてください。
その他のツールチェーン
Vite や Next.js との統合がないツールチェーンでは、@editframe/dev-server を直接呼び出します。@editframe/assets から 6 つのアセット処理関数を取得します。URL 署名ハンドラーには createProdEfHandlers を指定します。
import { createEditframeDevServer, createProdEfHandlers } from "@editframe/dev-server";
import {
generateTrack,
generateScrubTrack,
generateTrackFragmentIndex,
cacheImage,
findOrCreateCaptions,
md5FilePath,
} from "@editframe/assets";
import { Client, createURLToken } from "@editframe/api";
const server = createEditframeDevServer(
{ root: "./src", cacheRoot: "./cache" },
{ generateTrack, generateScrubTrack, generateTrackFragmentIndex, cacheImage, findOrCreateCaptions, md5FilePath },
createProdEfHandlers({
createURLToken,
getClient: () => new Client(process.env.EF_TOKEN, process.env.EF_HOST),
}),
);
server.listen(3001, () => console.log("Editframe dev server running on http://localhost:3001"));
ツールチェーンですでに Connect 互換のミドルウェアスタック(Express、Connect、カスタム Vite 統合など)が公開されている場合は、代わりに同じ 3 つの引数で createEditframeRouter(...) を呼び出します。戻り値を .use() でマウントします。createEditframeDevServer は同じルーターを独自のスタンドアロン http.Server でラップします。これは、独自のミドルウェアスタックがないツールチェーン向けです。
スタンドアロンサーバーの場合は、アプリサーバーから http://localhost:3001 に /api/v1/* と /@ef-* をプロキシします。コンポジションの api-host には、アプリのブラウザーオリジンを設定します。これにより、メディアと署名のリクエストが同じオリジンに維持されます。スタンドアロンサーバーは、アプリのプロキシやコンポジションの設定は行いません。
コンポジションを接続する
メディアの子要素が接続される前に、祖先の ef-configuration に api-host を設定します。ブラウザーにメディアルートを公開するオリジンを使用してください。
<ef-configuration api-host="http://localhost:5173">
<ef-timegroup mode="contain">
<ef-video src="clip.mp4"></ef-video>
</ef-timegroup>
</ef-configuration>
Next.js では、たとえば http://localhost:3000 のように Next.js のオリジンを使用します。プロキシを使うスタンドアロン統合では、アプリのオリジンを使用します。React では同じ値を指定した <Configuration apiHost="…"> を使用します。
現在の要素は ef-configuration から api-host を読み取ります。プラグインの window.__EDITFRAME__.apiHost の値は読み取りません。api-host が空の場合、オーサリング用メディア URL の JIT 検出はスキップされます。
ルートで有効になる機能
サーバーとコンポジションを接続すると、コードから直接リクエストしなくても、要素は以下のルートを使用します。
- JIT ビデオトランスコーディング。 たとえば
<ef-video src="clip.mp4">のように、ローカルの動画ファイルを直接参照できます。開発サーバーは初回のリクエスト時に動画をセグメントにトランスコードします。以降のリクエストでは、キャッシュされたセグメントが返されます。 - ローカル画像。 サーバーはローカル画像ルートを公開します。
- ローカル字幕。
ef-captionsのcaptions-srcに/api/v1/assets/captions?src=<path>を設定します。パスはrootからの相対パスです。サーバーはそのファイルに対してwhisper_timestampedを実行し、字幕 JSON をキャッシュします。まずホストにwhisper_timestampedをインストールしてください。このルートは英語の音声のみを文字起こしします。 - 本番環境のファイル API と同じ形式のローカルファイル API。 ローカルメディアを対象に書いたコードは、アップロードファイルやクラウドファイルに切り替えた後も動作します。
- URL 署名。
ef-configurationのデフォルトのsigning-urlは、再生トークンを発行するために実際の Editframe クラウド API に転送します。開発サーバーを起動する前に、EF_TOKEN環境変数を設定してください。デフォルト以外の API ホストを指定するには、EF_HOSTを設定します。
ef-video、ef-image、ef-captions がローカルメディアをどのように使用するかについては、composition スキルを参照してください。EF_TOKEN と EF_HOST については、editframe-api スキルを参照してください。
ビジュアルリグレッションテスト
プロジェクトのブラウザーのスクリーンショットテストを使用して、コンポジションの出力を確認してください。公開されている Vite プラグインは、リポジトリ内部の src/index.vitest.js アダプターをエクスポートしません。インストール済みのパッケージから、そのソースパスをインポートしないでください。
デバッグログ
ローカルメディアルートでは、開発サーバーを起動する前に DEBUG を設定します。特定のサブシステムのトレースを出力します。
DEBUG=ef:dev-server:jit npm run dev # transcode middleware
DEBUG=ef:dev-server:assets npm run dev # local image/caption serving
DEBUG=ef:dev-server:files npm run dev # local files API
DEBUG=ef:dev-server:sign-url npm run dev # URL signing
DEBUG=ef:dev-server:snapshot npm run dev # visual regression testing
フィードバックを送信する
問題や改善案について、Editframe にフィードバックを送信します。
- Editframe またはこのスキルが問題を引き起こした場合は、回避策を見つけてタスクを続行します。その後、問題と回避策を報告します。
- 現在のタスクだけでなく、ほかのタスクにも役立つ改善案があれば、提案を送信します。たとえば、より明確な指示、不足している例、より適切なデフォルト値、新機能などを提案します。
問題や提案の種類ごとに、1 件ずつ報告を送信します。報告に失敗しても、タスクを続行します。
curl -sS https://editframe.com/api/v1/feedback \
-H "Content-Type: application/json" \
-H "Authorization: Bearer $EDITFRAME_API_KEY" \
--data-binary @- <<'JSON'
{
"category": "bug",
"skill": "dev-server",
"summary": "One line that names the problem or the suggestion",
"details": "For a problem: steps, expected result, actual result, and errors. For a suggestion: the change and how it helps.",
"workaround": "The workaround that you used. Omit this field for a suggestion."
}
JSON
category には bug、documentation、feature_request、performance、other のいずれかを設定します。API キーは任意です。キーなしで報告すると匿名になります。報告には秘密情報、API キー、個人データを含めないでください。すべてのフィールド、制限、応答については、editframe-api スキルを参照してください。