api-response-optimization について
API のレスポンスサイズ削減と配信効率の改善を扱う開発スキルです。フィールド選択、HTTP キャッシュヘッダー、レスポンス圧縮を解説します。
主な機能
- 01クライアント指定のレスポンスフィールド
- 02ETag による条件付きレスポンス
- 03HTTP レスポンス圧縮
- 04キャッシュとページネーションの実践
活用シーン
- 01クライアントに返すフィールドの削減
- 02変更のないデータの再転送回避
- 03大きな API レスポンスの圧縮
インストール
コマンドをコピーしてターミナルで実行します。
$
npx skills add https:/ / github.com/ secondsky/ claude-skills --skill api-response-optimizationインストール後、Claude Code で/api-response-optimizationを入力して読み込まれたか確認します。
詳細
API レスポンスの最適化
ペイロードサイズを削減し、キャッシュを実装して、圧縮を有効にすることで API を高速化します。
スパースフィールドセット
// Allow clients to select fields: GET /users?fields=id,name,email
app.get('/users', async (req, res) => {
const fields = req.query.fields?.split(',') || null;
const users = await User.find({}, fields?.join(' '));
res.json(users);
});
HTTP キャッシュヘッダー
app.get('/products/:id', async (req, res) => {
const product = await Product.findById(req.params.id);
const etag = crypto.createHash('md5').update(JSON.stringify(product)).digest('hex');
if (req.headers['if-none-match'] === etag) {
return res.status(304).end();
}
res.set({
'Cache-Control': 'public, max-age=3600',
'ETag': etag
});
res.json(product);
});
レスポンス圧縮
const compression = require('compression');
app.use(compression({
filter: (req, res) => {
if (req.headers['x-no-compression']) return false;
return compression.filter(req, res);
},
level: 6 // Balance between speed and compression
}));
パフォーマンス目標
| 指標 | 目標 |
|---|---|
| レスポンス時間 | <100ms(500ms から短縮) |
| ペイロードサイズ | <50KB(500KB から削減) |
| サーバー CPU | <30%(80% から削減) |
最適化チェックリスト
- レスポンスから機密情報や不要なフィールドを削除する
- スパースフィールドセットを実装する
- ETag/Last-Modified ヘッダーを追加する
- gzip/brotli 圧縮を有効にする
- コレクションにページネーションを使用する
- N+1 クエリを防ぐために Eager Load を使用する
- APM ツールで監視する
ベストプラクティス
- 変更されないリソースは積極的にキャッシュする
- 頻繁に変更されるデータには短い TTL を使用する
- 書き込み時にキャッシュを無効化する
- 1KB を超えるレスポンスを圧縮する
- 最適化の前にプロファイリングする
コメント
Markdown 対応