用 Codex 或 Claude 帮你安装 复制这段 Prompt,粘贴到 Codex、Claude 或其他助手里,让它检查 Skill 页面并帮你完成安装。
直接命令不会经过审查 Prompt;运行前请先检查来源。
npx skills add https://github.com/csharpfritz/SquadUI --skill nodejs-api-client-caching命令会保持在同一行。复制前请横向滚动并检查完整内容。
想先保存到本地?可下载 SkillsMP 当前能够提供的文件。
基于 SOC 职业分类
正在显示 SKILL.md
| name | nodejs-api-client-caching |
| description | Pattern for building Node.js API clients with TTL-based caching and no external dependencies |
| domain | backend-services |
| confidence | low |
| source | earned |
When building API clients in Node.js (especially VS Code extensions or CLI tools that must stay zero/low-dependency), use the built-in https module with a simple TTL cache. This avoids polyfill issues with fetch in CommonJS environments and keeps the dependency footprint minimal.
Store fetched data alongside a fetchedAt timestamp. Check expiry on access. Expose forceRefresh parameter and invalidateCache() method for external triggers (e.g., file watchers).
interface Cache<T> {
data: T;
fetchedAt: number;
}
class ApiService {
private cache: Cache<MyData[]> | null = null;
private cacheTtlMs: number;
private isCacheExpired(): boolean {
if (!this.cache) return true;
return Date.now() - this.cache.fetchedAt > this.cacheTtlMs;
}
async getData(forceRefresh = false): Promise<MyData[]> {
if (!forceRefresh && this.cache && !this.isCacheExpired()) {
return this.cache.data;
}
const data = await this.fetchFromApi();
this.cache = { data, fetchedAt: Date.now() };
return data;
}
invalidateCache(): void {
this.cache = null;
}
}
Wrap https.request in a typed Promise. Set User-Agent (required by GitHub API), handle status codes, and parse JSON response.
private apiGet<T>(path: string): Promise<T> {
return new Promise((resolve, reject) => {
const url = new URL(path, this.baseUrl);
const req = https.request({
hostname: url.hostname,
path: url.pathname + url.search,
method: 'GET',
headers: { 'User-Agent': 'MyApp', 'Accept': 'application/json' },
}, (res) => {
const chunks: Buffer[] = [];
res.on('data', (chunk: Buffer) => chunks.push(chunk));
res.on('end', () => {
const body = Buffer.concat(chunks).toString('utf-8');
if (res.statusCode && res.statusCode >= && res. < ) {
(.(body) T);
} {
( ());
}
});
});
req.(, reject);
req.();
});
}
When paginating API results, catch errors per-page. If a later page fails, return the pages already fetched rather than losing everything.
node-fetch or axios in zero-dep projects — Use https module instead.invalidateCache() and TTL expiry.