ホームページ > ウェブフロントエンド > jsチュートリアル > GitHub の貢献統計を React アプリに追加する方法

GitHub の貢献統計を React アプリに追加する方法

Barbara Streisand
リリース: 2025-01-15 09:10:47
オリジナル
946 人が閲覧しました

How to Add GitHub Contribution Stats to Your React App

React ポートフォリオで GitHub アクティビティを紹介したいですか?このチュートリアルでは、GitHub の GraphQL API を使用して、効率的なキャッシュを備えた GitHub の合計貢献度を表示する React コンポーネントを作成する方法を説明します。何かクールなものを作りましょう! ?

私たちが構築するもの

次のような React コンポーネントを作成します。

  • 2020 年から現在までの GitHub の投稿を取得します
  • 公的および個人の両方の寄稿が含まれます
  • クライアント側のキャッシュを実装してパフォーマンスを最適化します
  • フェッチ中のロード状態を表示します
  • エラーを適切に処理します

前提条件

始める前に、次のものが必要です。

  1. GitHub パーソナル アクセス トークン (read:user スコープ付き)
  2. React プロジェクトのセットアップ (Create React App、Next.js、または任意のセットアップを使用)
  3. React フックと非同期操作の基礎知識

ステップ 1: GitHub トークンのセットアップ

まず、プロジェクト ルートに .env ファイルを作成し、GitHub トークンを追加します。

NEXT_PUBLIC_GITHUB_TOKEN=your_github_token_here
ログイン後にコピー
ログイン後にコピー

ステップ 2: データ取得ユーティリティの作成

githubApi.js という名前の新しいファイルを作成します:

export async function fetchGithubCommits(username) {
  const GITHUB_TOKEN = process.env.NEXT_PUBLIC_GITHUB_TOKEN;
  const CACHE_KEY = `github-commits-${username}`;
  const CACHE_TTL = 3600; // 1 hour in seconds

  if (!GITHUB_TOKEN) {
    console.error("No GitHub token found!");
    throw new Error("GitHub token is required");
  }

  const cachedData = getCachedData(CACHE_KEY);
  if (cachedData) {
    return cachedData.value;
  }

  try {
    const currentYear = new Date().getFullYear();
    const startYear = 2020;
    let totalCommits = 0;

    for (let year = startYear; year <= currentYear; year++) {
      const query = `
        query($username: String!, $from: DateTime!, $to: DateTime!) {
          user(login: $username) {
            contributionsCollection(from: $from, to: $to) {
              totalCommitContributions
              restrictedContributionsCount
            }
          }
        }
      `;

      const response = await fetch("https://api.github.com/graphql", {
        method: "POST",
        headers: {
          Authorization: `Bearer ${GITHUB_TOKEN}`,
          "Content-Type": "application/json",
        },
        body: JSON.stringify({
          query,
          variables: {
            username,
            from: `${year}-01-01T00:00:00Z`,
            to: `${year}-12-31T23:59:59Z`,
          },
        }),
      });

      const data = await response.json();
      if (data.errors) {
        throw new Error(data.errors[0].message);
      }

      const yearCommits =
        (data.data?.user?.contributionsCollection?.totalCommitContributions || 0) +
        (data.data?.user?.contributionsCollection?.restrictedContributionsCount || 0);

      totalCommits += yearCommits;
    }

    setCachedData(CACHE_KEY, totalCommits, CACHE_TTL);
    return totalCommits;
  } catch (error) {
    console.error("Error fetching GitHub commits:", error);
    throw error;
  }
}

function setCachedData(key, value, ttl) {
  const item = {
    value,
    timestamp: Date.now(),
    ttl: ttl * 1000,
  };
  localStorage.setItem(key, JSON.stringify(item));
}

function getCachedData(key) {
  try {
    const item = localStorage.getItem(key);
    if (!item) return null;

    const parsedItem = JSON.parse(item);
    const now = Date.now();

    if (now - parsedItem.timestamp > parsedItem.ttl) {
      localStorage.removeItem(key);
      return null;
    }

    return parsedItem;
  } catch {
    return null;
  }
}

export function invalidateCommitsCache(username) {
  localStorage.removeItem(`github-commits-${username}`);
}
ログイン後にコピー

ステップ 3: React コンポーネントの作成

GitHubStats.js という名前の新しいファイルを作成します:

import React, { useState, useEffect } from 'react';
import { fetchGithubCommits } from './githubApi';

const GitHubStats = ({ username }) => {
  const [commits, setCommits] = useState(null);
  const [loading, setLoading] = useState(true);
  const [error, setError] = useState(null);

  useEffect(() => {
    const fetchStats = async () => {
      try {
        setLoading(true);
        setError(null);
        const totalCommits = await fetchGithubCommits(username);
        setCommits(totalCommits);
      } catch (err) {
        setError(err.message);
      } finally {
        setLoading(false);
      }
    };

    fetchStats();
  }, [username]);

  if (loading) {
    return <div>Loading GitHub stats...</div>;
  }

  if (error) {
    return <div>Error: {error}</div>;
  }

  return (
    <div className="github-stats">
      <h2>GitHub Contributions</h2>
      <p>Total commits since 2020: {commits.toLocaleString()}</p>
    </div>
  );
};

export default GitHubStats;
ログイン後にコピー

ステップ 4: スタイルの追加

基本的なスタイルを追加しましょう。 GitHubStats.css を作成します:

.github-stats {
  padding: 20px;
  border-radius: 8px;
  background-color: #f6f8fa;
  box-shadow: 0 2px 4px rgba(0, 0, 0, 0.1);
  margin: 20px 0;
}

.github-stats h2 {
  margin: 0 0 15px 0;
  color: #24292e;
}

.github-stats p {
  font-size: 1.2em;
  color: #586069;
}
ログイン後にコピー

ステップ 5: コンポーネントの使用

これで、アプリ内でコンポーネントを使用できるようになります:

import GitHubStats from './GitHubStats';

function App() {
  return (
    <div className="App">
      <h1>My Developer Portfolio</h1>
      <GitHubStats username="your-github-username" />
    </div>
  );
}
ログイン後にコピー

より良いものにする: 高度な機能

1. 更新ボタンの追加

GitHubStats.js を更新して手動更新オプションを含めます:

import React, { useState, useEffect } from 'react';
import { fetchGithubCommits, invalidateCommitsCache } from './githubApi';

const GitHubStats = ({ username }) => {
  // ... previous state declarations ...

  const handleRefresh = async () => {
    invalidateCommitsCache(username);
    await fetchStats();
  };

  return (
    <div className="github-stats">
      <h2>GitHub Contributions</h2>
      <p>Total commits since 2020: {commits.toLocaleString()}</p>
      <button onClick={handleRefresh} disabled={loading}>
        {loading ? 'Refreshing...' : 'Refresh Stats'}
      </button>
    </div>
  );
};
ログイン後にコピー

2. 年度別内訳の追加

コンポーネントを変更して、年ごとの貢献を表示できます。

NEXT_PUBLIC_GITHUB_TOKEN=your_github_token_here
ログイン後にコピー
ログイン後にコピー

パフォーマンスのヒント

  1. キャッシュ戦略: 現在の実装では、データを 1 時間キャッシュします。必要に応じて CACHE_TTL を調整します。
  2. エラー境界: 予期しないエラーを適切に処理するために、コンポーネントをエラー境界でラップすることを検討してください。
  3. 状態の読み込み: UX を向上させるために、単純な「読み込み中...」テキストの代わりにスケルトン ローダーを追加します。

一般的な問題と解決策

  1. CORS の問題: 正しい GitHub API エンドポイントとヘッダーを使用していることを確認してください。
  2. トークンの権限: GitHub トークンに必要な権限があることを確認してください。
  3. レート制限: 応答ヘッダーの残りのレート制限を確認して、GitHub の API レート制限を処理します。

これで、React アプリに完全に機能する GitHub 統計コンポーネントが追加されました。この実装は、その上に構築できる強固な基盤を提供します。強化のためのいくつかのアイデア:

  • GitHub 統計 (スター、PR、問題など) をさらに追加します
  • チャートを使用して視覚的表現を作成する
  • 読み込みと更新用のアニメーションを追加します
  • より詳細なエラー処理を実装する

GitHub トークンを安全に保管し、決してリポジトリにコミットしないようにしてください。コーディングを楽しんでください! ?

以上がGitHub の貢献統計を React アプリに追加する方法の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

ソース:dev.to
このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
著者別の最新記事
人気のチュートリアル
詳細>
最新のダウンロード
詳細>
ウェブエフェクト
公式サイト
サイト素材
フロントエンドテンプレート