[{"data":1,"prerenderedAt":-1},["ShallowReactive",2],{"skill:01M7ED0WM5YK2HCGP40AFEVR6M":3,"skill-same:01M7ED0WM5YK2HCGP40AFEVR6M":70},{"skillNo":4,"name":5,"nameZh":6,"description":7,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":12,"repositoryNo":13,"starsCount":14,"licenseSpdxId":15,"licenseFileUrl":16,"sourceHtmlUrl":17,"categories":18,"keywords":19,"publishedAt":20,"linkOnly":21,"markdownContent":22,"markdownBody":23,"frontMatter":24,"refName":25,"commitSha":26,"skillDirectory":27,"forksCount":28,"repositoryHtmlUrl":29,"repositoryHomepageUrl":30,"ownerHtmlUrl":31,"ownerBlogUrl":32,"ownerDescription":33,"updatedAt":34,"install":35,"resources":48},"01M7ED0WM5YK2HCGP40AFEVR6M","netlify-caching",null,"控制 Netlify CDN 缓存的指南。在配置缓存头、设置 stale-while-revalidate、实现按需缓存清除，或了解 Netlify CDN 缓存行为时使用。涵盖 `Cache-Control`、`Netlify-CDN-Cache-Control`、缓存标签、持久缓存和框架专属缓存模式。","kael-odin\u002Fcodex-plugins-zh","kael-odin","https:\u002F\u002Favatars.githubusercontent.com\u002Fu\u002F166499071?v=4","01M7EBHJT87XN88WT3PEQ8ZGZK","Kael Odin","01M7EBHJVC91GD7PGJN3ZB14SG",37,"Apache-2.0","https:\u002F\u002Fgithub.com\u002Fkael-odin\u002Fcodex-plugins-zh\u002Fblob\u002Fmain\u002Fplugins\u002Fnetlify\u002Fskills\u002Fnetlify-caching\u002FLICENSE.txt","https:\u002F\u002Fgithub.com\u002Fkael-odin\u002Fcodex-plugins-zh\u002Fblob\u002Fmain\u002Fplugins\u002Fnetlify\u002Fskills\u002Fnetlify-caching\u002FSKILL.md",[],[],"2026-11-15 14:19:17",false,"---\r\nname: netlify-caching\ndescription: \"控制 Netlify CDN 缓存的指南。在配置缓存头、设置 stale-while-revalidate、实现按需缓存清除，或了解 Netlify CDN 缓存行为时使用。涵盖 `Cache-Control`、`Netlify-CDN-Cache-Control`、缓存标签、持久缓存和框架专属缓存模式。\"\r\n---\r\n\r\n# Caching on Netlify\r\n\r\n## Default Behavior\r\n\r\n**Static assets** are cached automatically:\r\n- CDN: cached for 1 year, invalidated on every deploy\r\n- Browser: always revalidates (`max-age=0, must-revalidate`)\r\n- No configuration needed\r\n\r\n**Dynamic responses** (functions, edge functions, proxied) are **not cached by default**. Add cache headers explicitly.\r\n\r\n## Cache-Control Headers\r\n\r\nThree headers control caching, from most to least specific:\r\n\r\n| Header | Who sees it | Use case |\r\n|---|---|---|\r\n| `Netlify-CDN-Cache-Control` | Netlify CDN only (stripped before browser) | CDN-only caching |\r\n| `CDN-Cache-Control` | All CDN caches (stripped before browser) | Multi-CDN setups |\r\n| `Cache-Control` | Browser and all caches | General caching |\r\n\r\n### Common Patterns\r\n\r\n```typescript\r\n\u002F\u002F Cache at CDN for 1 hour, browser always revalidates\r\nreturn new Response(body, {\r\n  headers: {\r\n    \"Netlify-CDN-Cache-Control\": \"public, s-maxage=3600, must-revalidate\",\r\n    \"Cache-Control\": \"public, max-age=0, must-revalidate\",\r\n  },\r\n});\r\n\r\n\u002F\u002F Stale-while-revalidate (serve stale for 2 min while refreshing)\r\nreturn new Response(body, {\r\n  headers: {\r\n    \"Netlify-CDN-Cache-Control\": \"public, max-age=60, stale-while-revalidate=120\",\r\n  },\r\n});\r\n\r\n\u002F\u002F Durable cache (shared across edge nodes, serverless functions only)\r\nreturn new Response(body, {\r\n  headers: {\r\n    \"Netlify-CDN-Cache-Control\": \"public, durable, max-age=60, stale-while-revalidate=120\",\r\n  },\r\n});\r\n```\r\n\r\n### Immutable Assets\r\n\r\nFor fingerprinted files (hash in filename):\r\n\r\n```toml\r\n# netlify.toml\r\n[[headers]]\r\nfor = \"\u002Fassets\u002F*\"\r\n[headers.values]\r\nCache-Control = \"public, max-age=31536000, immutable\"\r\n```\r\n\r\n## Cache Tags and On-Demand Purge\r\n\r\nTag responses for selective cache invalidation:\r\n\r\n```typescript\r\nreturn new Response(body, {\r\n  headers: {\r\n    \"Netlify-Cache-ID\": \"product,listing\",\r\n    \"Netlify-CDN-Cache-Control\": \"public, s-maxage=86400\",\r\n  },\r\n});\r\n```\r\n\r\nPurge by tag:\r\n\r\n```typescript\r\nimport { purgeCache } from \"@netlify\u002Ffunctions\";\r\n\r\nexport default async () => {\r\n  await purgeCache({ tags: [\"product\"] });\r\n  return new Response(\"Purged\", { status: 202 });\r\n};\r\n```\r\n\r\nPurge entire site:\r\n\r\n```typescript\r\nawait purgeCache();\r\n```\r\n\r\nResponses with `Netlify-Cache-ID` are **excluded from automatic deploy-based invalidation** — they must be purged explicitly.\r\n\r\n## Cache Key Variation\r\n\r\nCustomize what creates separate cache entries:\r\n\r\n```typescript\r\nreturn new Response(body, {\r\n  headers: {\r\n    \"Netlify-Vary\": \"cookie=ab_test|is_logged_in\",\r\n    \u002F\u002F Other options: query=param1|param2, header=X-Custom, country=us|de, language=en|fr\r\n  },\r\n});\r\n```\r\n\r\n## Framework-Specific Caching\r\n\r\n### Next.js\r\nISR uses Netlify's durable cache automatically (runtime 5.5.0+). `revalidatePath` and `revalidateTag` trigger cache purge.\r\n\r\n### Astro \u002F Remix\r\nFull control over cache headers in server routes. Set `Netlify-CDN-Cache-Control` in responses for CDN caching.\r\n\r\n### Nuxt\r\nDefault Nitro preset handles caching. ISR-style patterns use `routeRules` with `swr` or `isr` options.\r\n\r\n### Vite SPA\r\nStatic assets are cached by default. API responses from Netlify Functions need explicit cache headers.\r\n\r\n## Debugging\r\n\r\nCheck the `Cache-Status` response header:\r\n- `HIT` — served from cache\r\n- `MISS` — generated fresh\r\n- `REVALIDATED` — stale content was revalidated\r\n\r\n## Constraints\r\n\r\n- Basic auth disables caching for the entire site\r\n- Durable cache is serverless functions only (not edge functions)\r\n- Same URL must return identical `Netlify-Vary` headers across responses\r\n- Deploy invalidation is scoped to deploy context (production vs preview)\r\n","# Caching on Netlify\r\n\r\n## Default Behavior\r\n\r\n**Static assets** are cached automatically:\r\n- CDN: cached for 1 year, invalidated on every deploy\r\n- Browser: always revalidates (`max-age=0, must-revalidate`)\r\n- No configuration needed\r\n\r\n**Dynamic responses** (functions, edge functions, proxied) are **not cached by default**. Add cache headers explicitly.\r\n\r\n## Cache-Control Headers\r\n\r\nThree headers control caching, from most to least specific:\r\n\r\n| Header | Who sees it | Use case |\r\n|---|---|---|\r\n| `Netlify-CDN-Cache-Control` | Netlify CDN only (stripped before browser) | CDN-only caching |\r\n| `CDN-Cache-Control` | All CDN caches (stripped before browser) | Multi-CDN setups |\r\n| `Cache-Control` | Browser and all caches | General caching |\r\n\r\n### Common Patterns\r\n\r\n```typescript\r\n\u002F\u002F Cache at CDN for 1 hour, browser always revalidates\r\nreturn new Response(body, {\r\n  headers: {\r\n    \"Netlify-CDN-Cache-Control\": \"public, s-maxage=3600, must-revalidate\",\r\n    \"Cache-Control\": \"public, max-age=0, must-revalidate\",\r\n  },\r\n});\r\n\r\n\u002F\u002F Stale-while-revalidate (serve stale for 2 min while refreshing)\r\nreturn new Response(body, {\r\n  headers: {\r\n    \"Netlify-CDN-Cache-Control\": \"public, max-age=60, stale-while-revalidate=120\",\r\n  },\r\n});\r\n\r\n\u002F\u002F Durable cache (shared across edge nodes, serverless functions only)\r\nreturn new Response(body, {\r\n  headers: {\r\n    \"Netlify-CDN-Cache-Control\": \"public, durable, max-age=60, stale-while-revalidate=120\",\r\n  },\r\n});\r\n```\r\n\r\n### Immutable Assets\r\n\r\nFor fingerprinted files (hash in filename):\r\n\r\n```toml\r\n# netlify.toml\r\n[[headers]]\r\nfor = \"\u002Fassets\u002F*\"\r\n[headers.values]\r\nCache-Control = \"public, max-age=31536000, immutable\"\r\n```\r\n\r\n## Cache Tags and On-Demand Purge\r\n\r\nTag responses for selective cache invalidation:\r\n\r\n```typescript\r\nreturn new Response(body, {\r\n  headers: {\r\n    \"Netlify-Cache-ID\": \"product,listing\",\r\n    \"Netlify-CDN-Cache-Control\": \"public, s-maxage=86400\",\r\n  },\r\n});\r\n```\r\n\r\nPurge by tag:\r\n\r\n```typescript\r\nimport { purgeCache } from \"@netlify\u002Ffunctions\";\r\n\r\nexport default async () => {\r\n  await purgeCache({ tags: [\"product\"] });\r\n  return new Response(\"Purged\", { status: 202 });\r\n};\r\n```\r\n\r\nPurge entire site:\r\n\r\n```typescript\r\nawait purgeCache();\r\n```\r\n\r\nResponses with `Netlify-Cache-ID` are **excluded from automatic deploy-based invalidation** — they must be purged explicitly.\r\n\r\n## Cache Key Variation\r\n\r\nCustomize what creates separate cache entries:\r\n\r\n```typescript\r\nreturn new Response(body, {\r\n  headers: {\r\n    \"Netlify-Vary\": \"cookie=ab_test|is_logged_in\",\r\n    \u002F\u002F Other options: query=param1|param2, header=X-Custom, country=us|de, language=en|fr\r\n  },\r\n});\r\n```\r\n\r\n## Framework-Specific Caching\r\n\r\n### Next.js\r\nISR uses Netlify's durable cache automatically (runtime 5.5.0+). `revalidatePath` and `revalidateTag` trigger cache purge.\r\n\r\n### Astro \u002F Remix\r\nFull control over cache headers in server routes. Set `Netlify-CDN-Cache-Control` in responses for CDN caching.\r\n\r\n### Nuxt\r\nDefault Nitro preset handles caching. ISR-style patterns use `routeRules` with `swr` or `isr` options.\r\n\r\n### Vite SPA\r\nStatic assets are cached by default. API responses from Netlify Functions need explicit cache headers.\r\n\r\n## Debugging\r\n\r\nCheck the `Cache-Status` response header:\r\n- `HIT` — served from cache\r\n- `MISS` — generated fresh\r\n- `REVALIDATED` — stale content was revalidated\r\n\r\n## Constraints\r\n\r\n- Basic auth disables caching for the entire site\r\n- Durable cache is serverless functions only (not edge functions)\r\n- Same URL must return identical `Netlify-Vary` headers across responses\r\n- Deploy invalidation is scoped to deploy context (production vs preview)\r\n",{"name":5,"description":7},"main","e3091d1b371a9dcd9455d333175f948b286fdfcf","plugins\u002Fnetlify\u002Fskills\u002Fnetlify-caching",1,"https:\u002F\u002Fgithub.com\u002Fkael-odin\u002Fcodex-plugins-zh","https:\u002F\u002Fkael-odin.github.io\u002Fcodex-plugins-zh\u002F","https:\u002F\u002Fgithub.com\u002Fkael-odin","https:\u002F\u002Fkael-odin.github.io\u002Fodin-valhalla\u002F","Full-stack development • Open-source • System engineering\r\nTurning ideas into repositories.","2026-11-08 17:05:36",{"source":8,"skillName":5,"commands":36,"prompt":46,"zipAvailable":47},[37,40,43],{"tool":38,"command":39},"npx","npx skills add kael-odin\u002Fcodex-plugins-zh --skill netlify-caching",{"tool":41,"command":42},"bunx","bunx skills add kael-odin\u002Fcodex-plugins-zh --skill netlify-caching",{"tool":44,"command":45},"pnpm","pnpm dlx skills add kael-odin\u002Fcodex-plugins-zh --skill netlify-caching","安装技能，技能地址：https:\u002F\u002Fgithub.com\u002Fkael-odin\u002Fcodex-plugins-zh\u002Fblob\u002Fmain\u002Fplugins\u002Fnetlify\u002Fskills\u002Fnetlify-caching\u002FSKILL.md",true,[49,55,61,65],{"path":50,"resourceType":51,"resourceTypeDesc":52,"sizeBytes":53,"sourceHtmlUrl":54},"agents\u002Fopenai.yaml","REFERENCE","参考文档",357,"https:\u002F\u002Fgithub.com\u002Fkael-odin\u002Fcodex-plugins-zh\u002Fblob\u002Fmain\u002Fplugins\u002Fnetlify\u002Fskills\u002Fnetlify-caching\u002Fagents\u002Fopenai.yaml",{"path":56,"resourceType":57,"resourceTypeDesc":58,"sizeBytes":59,"sourceHtmlUrl":60},"assets\u002Fnetlify-small.svg","ASSET","资产文件",1302,"https:\u002F\u002Fgithub.com\u002Fkael-odin\u002Fcodex-plugins-zh\u002Fblob\u002Fmain\u002Fplugins\u002Fnetlify\u002Fskills\u002Fnetlify-caching\u002Fassets\u002Fnetlify-small.svg",{"path":62,"resourceType":57,"resourceTypeDesc":58,"sizeBytes":63,"sourceHtmlUrl":64},"assets\u002Fnetlify.png",2686,"https:\u002F\u002Fgithub.com\u002Fkael-odin\u002Fcodex-plugins-zh\u002Fblob\u002Fmain\u002Fplugins\u002Fnetlify\u002Fskills\u002Fnetlify-caching\u002Fassets\u002Fnetlify.png",{"path":66,"resourceType":67,"resourceTypeDesc":68,"sizeBytes":69,"sourceHtmlUrl":16},"LICENSE.txt","LICENSE","许可证",10977,[71,79,87,95,102,109],{"skillNo":72,"name":73,"nameZh":6,"description":74,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":12,"repositoryNo":13,"starsCount":14,"licenseSpdxId":15,"licenseFileUrl":75,"sourceHtmlUrl":76,"categories":77,"keywords":78,"publishedAt":20},"01M7EDVCKB89EF755PQMKV1BZA","android-emulator-qa","Use when validating Android feature flows in an emulator with adb-driven launch, input, UI-tree inspection, screenshots, and logcat capture.","https:\u002F\u002Fgithub.com\u002Fkael-odin\u002Fcodex-plugins-zh\u002Fblob\u002Fmain\u002Fplugins\u002Ftest-android-apps\u002Fskills\u002Fandroid-emulator-qa\u002FLICENSE.txt","https:\u002F\u002Fgithub.com\u002Fkael-odin\u002Fcodex-plugins-zh\u002Fblob\u002Fmain\u002Fplugins\u002Ftest-android-apps\u002Fskills\u002Fandroid-emulator-qa\u002FSKILL.md",[],[],{"skillNo":80,"name":81,"nameZh":6,"description":82,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":12,"repositoryNo":13,"starsCount":14,"licenseSpdxId":83,"licenseFileUrl":6,"sourceHtmlUrl":84,"categories":85,"keywords":86,"publishedAt":20},"01M7EDPX7WHN6HQZ0QKWB0BGVZ","supabase-postgres-best-practices","Postgres performance optimization and best practices from Supabase. Use this skill when writing, reviewing, or optimizing Postgres queries, schema designs, or database configurations.","MIT","https:\u002F\u002Fgithub.com\u002Fkael-odin\u002Fcodex-plugins-zh\u002Fblob\u002Fmain\u002Fplugins\u002Fsupabase\u002Fskills\u002Fsupabase-postgres-best-practices\u002FSKILL.md",[],[],{"skillNo":88,"name":89,"nameZh":6,"description":90,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":12,"repositoryNo":13,"starsCount":14,"licenseSpdxId":15,"licenseFileUrl":91,"sourceHtmlUrl":92,"categories":93,"keywords":94,"publishedAt":20},"01M7EDHHD98T8ZH09F40Q973G3","sentry","Use when the user asks to inspect Sentry issues or events, summarize recent production errors, or pull basic Sentry health data via the Sentry API; perform read-only queries with the bundled script and require `SENTRY_AUTH_TOKEN`.","https:\u002F\u002Fgithub.com\u002Fkael-odin\u002Fcodex-plugins-zh\u002Fblob\u002Fmain\u002Fplugins\u002Fsentry\u002Fskills\u002Fsentry\u002FLICENSE.txt","https:\u002F\u002Fgithub.com\u002Fkael-odin\u002Fcodex-plugins-zh\u002Fblob\u002Fmain\u002Fplugins\u002Fsentry\u002Fskills\u002Fsentry\u002FSKILL.md",[],[],{"skillNo":96,"name":97,"nameZh":6,"description":98,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":12,"repositoryNo":13,"starsCount":14,"licenseSpdxId":83,"licenseFileUrl":6,"sourceHtmlUrl":99,"categories":100,"keywords":101,"publishedAt":20},"01M7EDH3SGVMS1AFS6Q40B5J48","render-workflows","搭建、开发、测试和部署 Render Workflows。涵盖首次脚手架搭建（通过 CLI 或手动方式）、SDK 安装（Python 或 TypeScript）、任务模式（重试、子任务、扇出）、本地开发、控制台部署和故障排查。适用于用户首次搭建 Render Workflows、构建工作流服务、添加或修改工作流任务、本地测试工作流或部署到 Render 的场景。","https:\u002F\u002Fgithub.com\u002Fkael-odin\u002Fcodex-plugins-zh\u002Fblob\u002Fmain\u002Fplugins\u002Frender\u002Fskills\u002Frender-workflows\u002FSKILL.md",[],[],{"skillNo":103,"name":104,"nameZh":6,"description":105,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":12,"repositoryNo":13,"starsCount":14,"licenseSpdxId":83,"licenseFileUrl":6,"sourceHtmlUrl":106,"categories":107,"keywords":108,"publishedAt":20},"01M7EDH0CYEKQ4VVARHZAQ43S8","render-web-services","配置 Render web service——端口绑定、TLS、健康检查、自定义域名、自动部署、PR 预览、持久化磁盘及部署生命周期。当用户需要搭建 web service、修复健康检查失败、添加自定义域名、配置零停机部署，或排查端口绑定问题时使用。","https:\u002F\u002Fgithub.com\u002Fkael-odin\u002Fcodex-plugins-zh\u002Fblob\u002Fmain\u002Fplugins\u002Frender\u002Fskills\u002Frender-web-services\u002FSKILL.md",[],[],{"skillNo":110,"name":111,"nameZh":6,"description":112,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":12,"repositoryNo":13,"starsCount":14,"licenseSpdxId":83,"licenseFileUrl":6,"sourceHtmlUrl":113,"categories":114,"keywords":115,"publishedAt":20},"01M7EDGVDYFBG1CKSNMQ2DD336","render-static-sites","在 Render 全球 CDN 上部署并配置静态站点——构建命令、发布路径、SPA 路由、重定向、自定义 header 及 PR 预览。当用户需要部署静态站点、搭建 React\u002FVue\u002FHugo\u002FGatsby 前端、配置 SPA 回退路由、添加重定向规则、自定义响应 header，或在静态站点与 web service 之间为前端做选择时使用。触发词:static site、CDN、SPA、single-page app、React deploy、Vue deploy、Hugo、Gatsby、Docusaurus、Jekyll、staticPublishPath。","https:\u002F\u002Fgithub.com\u002Fkael-odin\u002Fcodex-plugins-zh\u002Fblob\u002Fmain\u002Fplugins\u002Frender\u002Fskills\u002Frender-static-sites\u002FSKILL.md",[],[]]