Next.js (app/)
// Article.jsx
// Environment: client
import { revalidatePath } from 'next/cache'
export default function Article({ article_id }) {
async function onArticleDelete() {
// Environment: server
'use server'
// 🤔 Mixed server and client code inside same file
// 🤔 Magic passing of props
await db.article.delete({ article_id })
// 😨 Complex caching
revalidatePath('/articles')
}
return <button onClick={onArticleDelete}>Delete</button>
}Vike + Telefunc
// Article.telefunc.js
// Environment: server
export async function onArticleDelete({ article_id }) {
await db.article.delete({ article_id })
}// Article.jsx
// Environment: client
import { onArticleDelete } from './article.telefunc.js'
export default function Article({ article_id }) {
const onClick = () => onArticleDelete({ article_id })
return <button onClick={onClick}>Delete</button>
}✅ Cache is opt-in