ホームページ >ウェブフロントエンド >jsチュートリアル >GitHub の貢献統計を React アプリに追加する方法
React ポートフォリオで GitHub アクティビティを紹介したいですか?このチュートリアルでは、GitHub の GraphQL API を使用して、効率的なキャッシュを備えた GitHub の合計貢献度を表示する React コンポーネントを作成する方法を説明します。何かクールなものを作りましょう! ?
次のような React コンポーネントを作成します。
始める前に、次のものが必要です。
まず、プロジェクト ルートに .env ファイルを作成し、GitHub トークンを追加します。
NEXT_PUBLIC_GITHUB_TOKEN=your_github_token_here
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}`); }
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;
基本的なスタイルを追加しましょう。 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; }
これで、アプリ内でコンポーネントを使用できるようになります:
import GitHubStats from './GitHubStats'; function App() { return ( <div className="App"> <h1>My Developer Portfolio</h1> <GitHubStats username="your-github-username" /> </div> ); }
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> ); };
コンポーネントを変更して、年ごとの貢献を表示できます。
NEXT_PUBLIC_GITHUB_TOKEN=your_github_token_here
これで、React アプリに完全に機能する GitHub 統計コンポーネントが追加されました。この実装は、その上に構築できる強固な基盤を提供します。強化のためのいくつかのアイデア:
GitHub トークンを安全に保管し、決してリポジトリにコミットしないようにしてください。コーディングを楽しんでください! ?
以上がGitHub の貢献統計を React アプリに追加する方法の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。