mirror of
https://github.com/bitsocialnet/5chan.git
synced 2026-08-03 07:41:04 +02:00
* chore(ai-workflow): track repo-managed review tooling * fix(ai-workflow): remove repo-specific path assumptions Make shared workflow hooks and APK testing guidance resolve paths from the repo and contributor environment so the tooling works for all contributors, not just one machine.
81 lines
1.9 KiB
Markdown
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):**
|
|
|
|
```typescript
|
|
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):**
|
|
|
|
```typescript
|
|
// 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)
|