Files
livedash-node/.opencode/skills/vercel-react-best-practices/rules/js-cache-function-results.md
Kaj Kowalski cd05fc8648 fix: resolve Prettier markdown code block parsing errors
- Fix syntax errors in skills markdown files (.github/skills, .opencode/skills)
- Change typescript to tsx for code blocks with JSX
- Replace ellipsis (...) in array examples with valid syntax
- Separate CSS from TypeScript into distinct code blocks
- Convert JavaScript object examples to valid JSON in docs
- Fix enum definitions with proper comma separation
2026-01-20 21:09:29 +01:00

81 lines
1.9 KiB
Markdown

---
title: Cache Repeated Function Calls
impact: MEDIUM
impactDescription: avoid redundant computation
tags: javascript, cache, memoization, performance
---
## Cache Repeated Function Calls
Use a module-level Map to cache function results when the same function is called repeatedly with the same inputs during render.
**Incorrect (redundant computation):**
```tsx
function ProjectList({ projects }: { projects: Project[] }) {
return (
<div>
{projects.map((project) => {
// slugify() called 100+ times for same project names
const slug = slugify(project.name);
return <ProjectCard key={project.id} slug={slug} />;
})}
</div>
);
}
```
**Correct (cached results):**
```tsx
// Module-level cache
const slugifyCache = new Map<string, string>();
function cachedSlugify(text: string): string {
if (slugifyCache.has(text)) {
return slugifyCache.get(text)!;
}
const result = slugify(text);
slugifyCache.set(text, result);
return result;
}
function ProjectList({ projects }: { projects: Project[] }) {
return (
<div>
{projects.map((project) => {
// Computed only once per unique project name
const slug = cachedSlugify(project.name);
return <ProjectCard key={project.id} slug={slug} />;
})}
</div>
);
}
```
**Simpler pattern for single-value functions:**
```typescript
let isLoggedInCache: boolean | null = null;
function isLoggedIn(): boolean {
if (isLoggedInCache !== null) {
return isLoggedInCache;
}
isLoggedInCache = document.cookie.includes("auth=");
return isLoggedInCache;
}
// Clear cache when auth changes
function onAuthChange() {
isLoggedInCache = null;
}
```
Use a Map (not a hook) so it works everywhere: utilities, event handlers, not just React components.
Reference: [How we made the Vercel Dashboard twice as fast](https://vercel.com/blog/how-we-made-the-vercel-dashboard-twice-as-fast)