jpskill.com
🛠️ 開発・MCP コミュニティ

urql

urqlは、ReactやVueなどでGraphQLデータを効率的に取得できるよう、軽量かつ柔軟にカスタマイズ可能なクライアントとして、キャッシュ機能やオフラインサポートなどを提供し、Apollo Clientよりも拡張性に優れた代替手段を提供するSkill。

📜 元の英語説明(参考)

You are an expert in urql, the highly customizable and lightweight GraphQL client for React, Vue, Svelte, and vanilla JavaScript. You help developers fetch GraphQL data with minimal bundle size, document caching, normalized caching via Graphcache, exchanges (middleware pipeline), subscriptions, and offline support — providing a leaner alternative to Apollo Client with better extensibility.

🇯🇵 日本人クリエイター向け解説

一言でいうと

urqlは、ReactやVueなどでGraphQLデータを効率的に取得できるよう、軽量かつ柔軟にカスタマイズ可能なクライアントとして、キャッシュ機能やオフラインサポートなどを提供し、Apollo Clientよりも拡張性に優れた代替手段を提供するSkill。

※ jpskill.com 編集部が日本のビジネス現場向けに補足した解説です。Skill本体の挙動とは独立した参考情報です。

⚡ おすすめ: コマンド1行でインストール(60秒)

下記のコマンドをコピーしてターミナル(Mac/Linux)または PowerShell(Windows)に貼り付けてください。 ダウンロード → 解凍 → 配置まで全自動。

🍎 Mac / 🐧 Linux
mkdir -p ~/.claude/skills && cd ~/.claude/skills && curl -L -o urql.zip https://jpskill.com/download/15524.zip && unzip -o urql.zip && rm urql.zip
🪟 Windows (PowerShell)
$d = "$env:USERPROFILE\.claude\skills"; ni -Force -ItemType Directory $d | Out-Null; iwr https://jpskill.com/download/15524.zip -OutFile "$d\urql.zip"; Expand-Archive "$d\urql.zip" -DestinationPath $d -Force; ri "$d\urql.zip"

完了後、Claude Code を再起動 → 普通に「動画プロンプト作って」のように話しかけるだけで自動発動します。

💾 手動でダウンロードしたい(コマンドが難しい人向け)
  1. 1. 下の青いボタンを押して urql.zip をダウンロード
  2. 2. ZIPファイルをダブルクリックで解凍 → urql フォルダができる
  3. 3. そのフォルダを C:\Users\あなたの名前\.claude\skills\(Win)または ~/.claude/skills/(Mac)へ移動
  4. 4. Claude Code を再起動

⚠️ ダウンロード・利用は自己責任でお願いします。当サイトは内容・動作・安全性について責任を負いません。

🎯 このSkillでできること

下記の説明文を読むと、このSkillがあなたに何をしてくれるかが分かります。Claudeにこの分野の依頼をすると、自動で発動します。

📦 インストール方法 (3ステップ)

  1. 1. 上の「ダウンロード」ボタンを押して .skill ファイルを取得
  2. 2. ファイル名の拡張子を .skill から .zip に変えて展開(macは自動展開可)
  3. 3. 展開してできたフォルダを、ホームフォルダの .claude/skills/ に置く
    • · macOS / Linux: ~/.claude/skills/
    • · Windows: %USERPROFILE%\.claude\skills\

Claude Code を再起動すれば完了。「このSkillを使って…」と話しかけなくても、関連する依頼で自動的に呼び出されます。

詳しい使い方ガイドを見る →
最終更新
2026-05-18
取得日時
2026-05-18
同梱ファイル
1

📖 Skill本文(日本語訳)

※ 原文(英語/中国語)を Gemini で日本語化したものです。Claude 自身は原文を読みます。誤訳がある場合は原文をご確認ください。

urql — 軽量 GraphQL クライアント

あなたは、React、Vue、Svelte、およびバニラ JavaScript 向けの、高度にカスタマイズ可能で軽量な GraphQL クライアントである urql のエキスパートです。あなたは、開発者が最小限のバンドルサイズで GraphQL データを取得し、ドキュメントキャッシュ、Graphcache による正規化されたキャッシュ、exchange(ミドルウェアパイプライン)、サブスクリプション、およびオフラインサポートを利用できるように支援します。これにより、Apollo Client よりも無駄がなく、拡張性に優れた代替手段を提供します。

主要な機能

セットアップとクエリ

import { Client, Provider, cacheExchange, fetchExchange, gql, useQuery, useMutation } from "urql";

const client = new Client({
  url: "https://api.example.com/graphql",
  exchanges: [cacheExchange, fetchExchange],
  fetchOptions: () => ({
    headers: { Authorization: `Bearer ${getToken()}` },
  }),
});

function App() {
  return <Provider value={client}><Dashboard /></Provider>;
}

const POSTS_QUERY = gql`
  query Posts($limit: Int!) {
    posts(limit: $limit) { id title author { name } createdAt }
  }
`;

function PostList() {
  const [result, reexecute] = useQuery({
    query: POSTS_QUERY,
    variables: { limit: 10 },
  });

  const { data, fetching, error } = result;
  if (fetching) return <Spinner />;
  if (error) return <Error message={error.message} />;
  return (
    <div>
      {data.posts.map(p => <PostCard key={p.id} post={p} />)}
      <button onClick={() => reexecute({ requestPolicy: "network-only" })}>Refresh</button>
    </div>
  );
}

ミューテーション

const CREATE_POST = gql`
  mutation CreatePost($input: CreatePostInput!) {
    createPost(input: $input) { id title createdAt }
  }
`;

function CreatePostForm() {
  const [result, createPost] = useMutation(CREATE_POST);

  const handleSubmit = (data: any) => {
    createPost({ input: data }).then(result => {
      if (result.error) console.error(result.error);
    });
  };

  return <Form onSubmit={handleSubmit} loading={result.fetching} />;
}

Graphcache(正規化されたキャッシュ)

import { cacheExchange } from "@urql/exchange-graphcache";

const cache = cacheExchange({
  keys: { Post: (data) => data.id as string },
  resolvers: {
    Query: {
      post: (_, args) => ({ __typename: "Post", id: args.id }),
    },
  },
  updates: {
    Mutation: {
      createPost(result, _args, cache) {
        cache.updateQuery({ query: POSTS_QUERY, variables: { limit: 10 } }, (data) => {
          if (data) data.posts.unshift(result.createPost);
          return data;
        });
      },
    },
  },
});

インストール

npm install urql graphql
npm install @urql/exchange-graphcache     # オプションの正規化されたキャッシュ

ベストプラクティス

  1. ドキュメントキャッシュ — デフォルトのキャッシュは、query+variables で重複排除を行います。ほとんどのアプリで十分です。
  2. 複雑な場合は Graphcache — クエリ間でキャッシュの更新が必要な場合にのみ、正規化されたキャッシュを使用します。
  3. Exchanges — urql のミドルウェアパイプライン。認証、リトライ、永続化、ロギングを構成可能な exchange として追加します。
  4. リクエストポリシーcache-first(デフォルト)、リフレッシュには network-only、stale-while-revalidate には cache-and-network を使用します。
  5. バンドルサイズ — urql コアは ~5KB (gzip 圧縮時) です (Apollo は ~30KB)。パフォーマンスが重要なアプリに最適です。
  6. SSR サポート — サーバーサイドレンダリングには ssrExchange を使用します。クライアントでキャッシュをハイドレートします。
  7. サブスクリプション — WebSocket/SSE サブスクリプションには subscriptionExchange を追加します。プラグアンドプレイです。
  8. フレームワークに依存しない — React、Vue、Svelte、およびバニラ JS で動作します。同じコアで、異なるバインディングです。
📜 原文 SKILL.md(Claudeが読む英語/中国語)を展開

urql — Lightweight GraphQL Client

You are an expert in urql, the highly customizable and lightweight GraphQL client for React, Vue, Svelte, and vanilla JavaScript. You help developers fetch GraphQL data with minimal bundle size, document caching, normalized caching via Graphcache, exchanges (middleware pipeline), subscriptions, and offline support — providing a leaner alternative to Apollo Client with better extensibility.

Core Capabilities

Setup and Queries

import { Client, Provider, cacheExchange, fetchExchange, gql, useQuery, useMutation } from "urql";

const client = new Client({
  url: "https://api.example.com/graphql",
  exchanges: [cacheExchange, fetchExchange],
  fetchOptions: () => ({
    headers: { Authorization: `Bearer ${getToken()}` },
  }),
});

function App() {
  return <Provider value={client}><Dashboard /></Provider>;
}

const POSTS_QUERY = gql`
  query Posts($limit: Int!) {
    posts(limit: $limit) { id title author { name } createdAt }
  }
`;

function PostList() {
  const [result, reexecute] = useQuery({
    query: POSTS_QUERY,
    variables: { limit: 10 },
  });

  const { data, fetching, error } = result;
  if (fetching) return <Spinner />;
  if (error) return <Error message={error.message} />;
  return (
    <div>
      {data.posts.map(p => <PostCard key={p.id} post={p} />)}
      <button onClick={() => reexecute({ requestPolicy: "network-only" })}>Refresh</button>
    </div>
  );
}

Mutations

const CREATE_POST = gql`
  mutation CreatePost($input: CreatePostInput!) {
    createPost(input: $input) { id title createdAt }
  }
`;

function CreatePostForm() {
  const [result, createPost] = useMutation(CREATE_POST);

  const handleSubmit = (data: any) => {
    createPost({ input: data }).then(result => {
      if (result.error) console.error(result.error);
    });
  };

  return <Form onSubmit={handleSubmit} loading={result.fetching} />;
}

Graphcache (Normalized Cache)

import { cacheExchange } from "@urql/exchange-graphcache";

const cache = cacheExchange({
  keys: { Post: (data) => data.id as string },
  resolvers: {
    Query: {
      post: (_, args) => ({ __typename: "Post", id: args.id }),
    },
  },
  updates: {
    Mutation: {
      createPost(result, _args, cache) {
        cache.updateQuery({ query: POSTS_QUERY, variables: { limit: 10 } }, (data) => {
          if (data) data.posts.unshift(result.createPost);
          return data;
        });
      },
    },
  },
});

Installation

npm install urql graphql
npm install @urql/exchange-graphcache     # Optional normalized cache

Best Practices

  1. Document cache — Default cache deduplicates by query+variables; sufficient for most apps
  2. Graphcache for complex — Use normalized cache only when you need cache updates across queries
  3. Exchanges — urql's middleware pipeline; add auth, retry, persist, logging as composable exchanges
  4. Request policies — Use cache-first (default), network-only for refresh, cache-and-network for stale-while-revalidate
  5. Bundle size — urql core is ~5KB gzipped (vs Apollo ~30KB); ideal for performance-sensitive apps
  6. SSR support — Use ssrExchange for server-side rendering; hydrates cache on client
  7. Subscriptions — Add subscriptionExchange for WebSocket/SSE subscriptions; plug and play
  8. Framework agnostic — Works with React, Vue, Svelte, and vanilla JS; same core, different bindings