[{"data":1,"prerenderedAt":-1},["ShallowReactive",2],{"skill:01M6R2CQRG190P09DAHMF8M5QP":3,"skill-same:01M6R2CQRG190P09DAHMF8M5QP":122},{"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":6,"sourceHtmlUrl":16,"categories":17,"keywords":23,"publishedAt":44,"linkOnly":45,"markdownContent":46,"markdownBody":47,"frontMatter":48,"refName":53,"commitSha":54,"skillDirectory":55,"forksCount":56,"repositoryHtmlUrl":57,"repositoryHomepageUrl":58,"ownerHtmlUrl":59,"ownerBlogUrl":60,"ownerDescription":61,"updatedAt":62,"install":63,"resources":76},"01M6R2CQRG190P09DAHMF8M5QP","three-best-practices",null,"Three.js performance optimization and best practices guidelines. Use when writing, reviewing, or optimizing Three.js code. Triggers on tasks involving 3D scenes, WebGL\u002FWebGPU rendering, geometries, materials, textures, lighting, shaders, or TSL.","VRIL-LABS\u002Fskill-jam","VRIL-LABS","https:\u002F\u002Favatars.githubusercontent.com\u002Fu\u002F272046472?v=4","01M6QR9PNWM28WZYJJASER1RG2","𝗩𝗥𝗜𝗟 𝗟𝗔𝗕𝗦","01M6QR9PT6Q6JDCQ97EQBDX6E4",2,"MIT","https:\u002F\u002Fgithub.com\u002FVRIL-LABS\u002Fskill-jam\u002Fblob\u002Fmain\u002Fskills\u002Fweb-frontend\u002Fneversight-skills_feed-three-best-practices-1.0.2\u002FSKILL.md",[18],{"categoryNo":19,"categoryName":20,"taxonomyType":21,"taxonomyTypeDesc":22},"01JBSEEDCAT000000000000023","Skill与智能体开发","SCENARIO","使用场景",[24,25,26,27,28,29,30,31,32,33,34,35,36,37,38,39,40,41,42,43],"three best practices","best practices","three","use","best practices guidelines","when","rendering","triggers","lighting","scenes","agent-skills","writing","3D","Optimization","shaders","code","tasks","guidelines","webgpu","performance","2026-11-10 10:12:30",false,"---\nname: three-best-practices\ndescription: Three.js performance optimization and best practices guidelines. Use when writing, reviewing, or optimizing Three.js code. Triggers on tasks involving 3D scenes, WebGL\u002FWebGPU rendering, geometries, materials, textures, lighting, shaders, or TSL.\nlicense: MIT\nmetadata:\n  author: three-agent-skills\n  version: \"2.0.0\"\n  three-version: \"0.182.0+\"\n---\n\n# Three.js Best Practices\n\nComprehensive performance optimization guide for Three.js applications. Contains 100+ rules across 17 categories, prioritized by impact.\n\n> Based on official guidelines from Three.js `llms` branch maintained by mrdoob.\n\n## When to Apply\n\nReference these guidelines when:\n- Setting up a new Three.js project\n- Writing or reviewing Three.js code\n- Optimizing performance or fixing memory leaks\n- Working with custom shaders (GLSL or TSL)\n- Implementing WebGPU features\n- Building VR\u002FAR experiences with WebXR\n- Integrating physics engines\n- Optimizing for mobile devices\n\n## Rule Categories by Priority\n\n| Priority | Category | Impact | Prefix |\n|----------|----------|--------|--------|\n| 0 | Modern Setup & Imports | FUNDAMENTAL | `setup-` |\n| 1 | Memory Management & Dispose | CRITICAL | `memory-` |\n| 2 | Render Loop Optimization | CRITICAL | `render-` |\n| 3 | Geometry & Buffer Management | HIGH | `geometry-` |\n| 4 | Material & Texture Optimization | HIGH | `material-` |\n| 5 | Lighting & Shadows | MEDIUM-HIGH | `lighting-` |\n| 6 | Scene Graph Organization | MEDIUM | `scene-` |\n| 7 | Shader Best Practices (GLSL) | MEDIUM | `shader-` |\n| 8 | TSL (Three.js Shading Language) | MEDIUM | `tsl-` |\n| 9 | Loading & Assets | MEDIUM | `loading-` |\n| 10 | Camera & Controls | LOW-MEDIUM | `camera-` |\n| 11 | Animation System | MEDIUM | `animation-` |\n| 12 | Physics Integration | MEDIUM | `physics-` |\n| 13 | WebXR \u002F VR \u002F AR | MEDIUM | `webxr-` |\n| 14 | Audio | LOW-MEDIUM | `audio-` |\n| 15 | Mobile Optimization | HIGH | `mobile-` |\n| 16 | Production | HIGH | `error-`, `migration-` |\n| 17 | Debug & DevTools | LOW | `debug-` |\n\n## Quick Reference\n\n### 0. Modern Setup (FUNDAMENTAL)\n\n- `setup-use-import-maps` - Use Import Maps, not old CDN scripts\n- `setup-choose-renderer` - WebGLRenderer (default) vs WebGPURenderer (TSL\u002Fcompute)\n- `setup-animation-loop` - Use `renderer.setAnimationLoop()` not manual RAF\n- `setup-basic-scene-template` - Complete modern scene template\n\n### 1. Memory Management (CRITICAL)\n\n- `memory-dispose-geometry` - Always dispose geometries\n- `memory-dispose-material` - Always dispose materials and textures\n- `memory-dispose-textures` - Dispose dynamically created textures\n- `memory-dispose-render-targets` - Always dispose WebGLRenderTarget\n- `memory-dispose-recursive` - Use recursive disposal for hierarchies\n- `memory-dispose-on-unmount` - Dispose in React cleanup\u002Funmount\n- `memory-renderer-dispose` - Dispose renderer when destroying view\n- `memory-reuse-objects` - Reuse geometries and materials\n\n### 2. Render Loop (CRITICAL)\n\n- `render-single-raf` - Single requestAnimationFrame loop\n- `render-conditional` - Render on demand for static scenes\n- `render-delta-time` - Use delta time for animations\n- `render-avoid-allocations` - Never allocate in render loop\n- `render-cache-computations` - Cache expensive computations\n- `render-frustum-culling` - Enable frustum culling\n- `render-update-matrix-manual` - Disable auto matrix updates for static objects\n- `render-pixel-ratio` - Limit pixel ratio to 2\n- `render-antialias-wisely` - Use antialiasing judiciously\n\n### 3. Geometry (HIGH)\n\n- `geometry-buffer-geometry` - Always use BufferGeometry\n- `geometry-merge-static` - Merge static geometries\n- `geometry-instanced-mesh` - Use InstancedMesh for identical objects\n- `geometry-lod` - Use Level of Detail for complex models\n- `geometry-index-buffer` - Use indexed geometry\n- `geometry-vertex-count` - Minimize vertex count\n- `geometry-attributes-typed` - Use appropriate typed arrays\n- `geometry-interleaved` - Consider interleaved buffers\n\n### 4. Materials & Textures (HIGH)\n\n- `material-reuse` - Reuse materials across meshes\n- `material-simplest-sufficient` - Use simplest material that works\n- `material-texture-size-power-of-two` - Power-of-two texture dimensions\n- `material-texture-compression` - Use compressed textures (KTX2\u002FBasis)\n- `material-texture-mipmaps` - Enable mipmaps appropriately\n- `material-texture-anisotropy` - Use anisotropic filtering for floors\n- `material-texture-atlas` - Use texture atlases\n- `material-avoid-transparency` - Minimize transparent materials\n- `material-onbeforecompile` - Use onBeforeCompile for shader mods (or TSL)\n\n### 5. Lighting & Shadows (MEDIUM-HIGH)\n\n- `lighting-limit-lights` - Minimize dynamic lights\n- `lighting-bake-static` - Bake lighting for static scenes\n- `lighting-shadow-camera-tight` - Fit shadow camera tightly\n- `lighting-shadow-map-size` - Choose appropriate shadow resolution\n- `lighting-shadow-selective` - Enable shadows selectively\n- `lighting-shadow-cascade` - Use CSM for large scenes\n- `lighting-probe` - Use Light Probes\n\n### 6. Scene Graph (MEDIUM)\n\n- `scene-group-objects` - Use Groups for organization\n- `scene-layers` - Use Layers for selective rendering\n- `scene-visible-toggle` - Use visible flag, not add\u002Fremove\n- `scene-flatten-static` - Flatten static hierarchies\n- `scene-name-objects` - Name objects for debugging\n- `scene-object-pooling` - Use object pooling\n\n### 7. Shaders GLSL (MEDIUM)\n\n- `shader-precision` - Use appropriate precision\n- `shader-avoid-branching` - Minimize branching\n- `shader-precompute-cpu` - Precompute on CPU\n- `shader-avoid-discard` - Avoid discard, use alphaTest\n- `shader-texture-lod` - Use textureLod for known mip levels\n- `shader-uniform-arrays` - Prefer uniform arrays\n- `shader-varying-interpolation` - Use flat when appropriate\n- `shader-chunk-injection` - Use Three.js shader chunks\n\n### 8. TSL - Three.js Shading Language (MEDIUM)\n\n- `tsl-why-use` - Use TSL instead of onBeforeCompile\n- `tsl-setup-webgpu` - WebGPU setup for TSL\n- `tsl-complete-reference` - Full TSL type system and functions\n- `tsl-material-slots` - Material node properties reference\n- `tsl-node-materials` - Use NodeMaterial classes\n- `tsl-basic-operations` - Types, operations, swizzling\n- `tsl-functions` - Creating TSL functions with Fn()\n- `tsl-conditionals` - If, select, loops in TSL\n- `tsl-textures` - Textures and triplanar mapping\n- `tsl-post-processing` - bloom, blur, dof, ao\n- `tsl-compute-shaders` - GPGPU and compute operations\n- `tsl-glsl-to-tsl` - GLSL to TSL translation\n\n### 9. Loading & Assets (MEDIUM)\n\n- `loading-draco-compression` - Use Draco for large meshes\n- `loading-gltf-preferred` - Use glTF format\n- `gltf-loading-optimization` - Full loader setup with DRACO\u002FMeshopt\u002FKTX2\n- `loading-progress-feedback` - Show loading progress\n- `loading-async-await` - Use async\u002Fawait for loading\n- `loading-lazy` - Lazy load non-critical assets\n- `loading-cache-assets` - Enable caching\n- `loading-dispose-unused` - Unload unused assets\n\n### 10. Camera & Controls (LOW-MEDIUM)\n\n- `camera-near-far` - Set tight near\u002Ffar planes\n- `camera-fov` - Choose appropriate FOV\n- `camera-controls-damping` - Use damping for smooth controls\n- `camera-resize-handler` - Handle resize properly\n- `camera-orbit-limits` - Set orbit control limits\n\n### 11. Animation (MEDIUM)\n\n- `animation-system` - AnimationMixer, blending, morph targets, skeletal\n\n### 12. Physics (MEDIUM)\n\n- `physics-integration` - Rapier, Cannon-es integration patterns\n\n### 13. WebXR (MEDIUM)\n\n- `webxr-setup` - VR\u002FAR buttons, controllers, hit testing\n\n### 14. Audio (LOW-MEDIUM)\n\n- `audio-spatial` - PositionalAudio, HRTF, spatial sound\n\n### 15. Optimization (HIGH)\n\n- `mobile-optimization` - Mobile-specific optimizations and checklist\n- `raycasting-optimization` - BVH, layers, GPU picking\n\n### 16. Production (HIGH)\n\n- `error-handling-recovery` - WebGL context loss and recovery\n- `migration-checklist` - Breaking changes by version\n\n### 17. Debug (LOW)\n\n- `debug-stats` - Use Stats.js\n- `debug-helpers` - Use built-in helpers\n- `debug-gui` - Use lil-gui for tweaking\n- `debug-renderer-info` - Check renderer.info\n- `debug-conditional` - Remove debug code in production\n\n## How to Use\n\nRead individual rule files for detailed explanations and code examples:\n\n```\nrules\u002Fsetup-use-import-maps.md\nrules\u002Fmemory-dispose-geometry.md\nrules\u002Ftsl-complete-reference.md\nrules\u002Fmobile-optimization.md\n```\n\nEach rule file contains:\n- Brief explanation of why it matters\n- BAD code example with explanation\n- GOOD code example with explanation\n- Additional context and references\n\n## Key Patterns\n\n### Modern Import Maps\n\n```html\n\u003Cscript type=\"importmap\">\n{\n  \"imports\": {\n    \"three\": \"https:\u002F\u002Fcdn.jsdelivr.net\u002Fnpm\u002Fthree@0.182.0\u002Fbuild\u002Fthree.module.js\",\n    \"three\u002Faddons\u002F\": \"https:\u002F\u002Fcdn.jsdelivr.net\u002Fnpm\u002Fthree@0.182.0\u002Fexamples\u002Fjsm\u002F\",\n    \"three\u002Ftsl\": \"https:\u002F\u002Fcdn.jsdelivr.net\u002Fnpm\u002Fthree@0.182.0\u002Fbuild\u002Fthree.tsl.js\"\n  }\n}\n\u003C\u002Fscript>\n```\n\n### Proper Disposal\n\n```javascript\nfunction disposeObject(obj) {\n  if (obj.geometry) obj.geometry.dispose();\n  if (obj.material) {\n    if (Array.isArray(obj.material)) {\n      obj.material.forEach(m => m.dispose());\n    } else {\n      obj.material.dispose();\n    }\n  }\n}\n```\n\n### TSL Basic Usage\n\n```javascript\nimport { texture, uv, color, time, sin } from 'three\u002Ftsl';\n\nconst material = new THREE.MeshStandardNodeMaterial();\nmaterial.colorNode = texture(map).mul(color(0xff0000));\nmaterial.colorNode = color(0x00ff00).mul(sin(time).mul(0.5).add(0.5));\n```\n\n### Mobile Detection\n\n```javascript\nconst isMobile = \u002FAndroid|iPhone|iPad|iPod\u002Fi.test(navigator.userAgent);\nrenderer.setPixelRatio(Math.min(window.devicePixelRatio, isMobile ? 1.5 : 2));\n```\n","# Three.js Best Practices\n\nComprehensive performance optimization guide for Three.js applications. Contains 100+ rules across 17 categories, prioritized by impact.\n\n> Based on official guidelines from Three.js `llms` branch maintained by mrdoob.\n\n## When to Apply\n\nReference these guidelines when:\n- Setting up a new Three.js project\n- Writing or reviewing Three.js code\n- Optimizing performance or fixing memory leaks\n- Working with custom shaders (GLSL or TSL)\n- Implementing WebGPU features\n- Building VR\u002FAR experiences with WebXR\n- Integrating physics engines\n- Optimizing for mobile devices\n\n## Rule Categories by Priority\n\n| Priority | Category | Impact | Prefix |\n|----------|----------|--------|--------|\n| 0 | Modern Setup & Imports | FUNDAMENTAL | `setup-` |\n| 1 | Memory Management & Dispose | CRITICAL | `memory-` |\n| 2 | Render Loop Optimization | CRITICAL | `render-` |\n| 3 | Geometry & Buffer Management | HIGH | `geometry-` |\n| 4 | Material & Texture Optimization | HIGH | `material-` |\n| 5 | Lighting & Shadows | MEDIUM-HIGH | `lighting-` |\n| 6 | Scene Graph Organization | MEDIUM | `scene-` |\n| 7 | Shader Best Practices (GLSL) | MEDIUM | `shader-` |\n| 8 | TSL (Three.js Shading Language) | MEDIUM | `tsl-` |\n| 9 | Loading & Assets | MEDIUM | `loading-` |\n| 10 | Camera & Controls | LOW-MEDIUM | `camera-` |\n| 11 | Animation System | MEDIUM | `animation-` |\n| 12 | Physics Integration | MEDIUM | `physics-` |\n| 13 | WebXR \u002F VR \u002F AR | MEDIUM | `webxr-` |\n| 14 | Audio | LOW-MEDIUM | `audio-` |\n| 15 | Mobile Optimization | HIGH | `mobile-` |\n| 16 | Production | HIGH | `error-`, `migration-` |\n| 17 | Debug & DevTools | LOW | `debug-` |\n\n## Quick Reference\n\n### 0. Modern Setup (FUNDAMENTAL)\n\n- `setup-use-import-maps` - Use Import Maps, not old CDN scripts\n- `setup-choose-renderer` - WebGLRenderer (default) vs WebGPURenderer (TSL\u002Fcompute)\n- `setup-animation-loop` - Use `renderer.setAnimationLoop()` not manual RAF\n- `setup-basic-scene-template` - Complete modern scene template\n\n### 1. Memory Management (CRITICAL)\n\n- `memory-dispose-geometry` - Always dispose geometries\n- `memory-dispose-material` - Always dispose materials and textures\n- `memory-dispose-textures` - Dispose dynamically created textures\n- `memory-dispose-render-targets` - Always dispose WebGLRenderTarget\n- `memory-dispose-recursive` - Use recursive disposal for hierarchies\n- `memory-dispose-on-unmount` - Dispose in React cleanup\u002Funmount\n- `memory-renderer-dispose` - Dispose renderer when destroying view\n- `memory-reuse-objects` - Reuse geometries and materials\n\n### 2. Render Loop (CRITICAL)\n\n- `render-single-raf` - Single requestAnimationFrame loop\n- `render-conditional` - Render on demand for static scenes\n- `render-delta-time` - Use delta time for animations\n- `render-avoid-allocations` - Never allocate in render loop\n- `render-cache-computations` - Cache expensive computations\n- `render-frustum-culling` - Enable frustum culling\n- `render-update-matrix-manual` - Disable auto matrix updates for static objects\n- `render-pixel-ratio` - Limit pixel ratio to 2\n- `render-antialias-wisely` - Use antialiasing judiciously\n\n### 3. Geometry (HIGH)\n\n- `geometry-buffer-geometry` - Always use BufferGeometry\n- `geometry-merge-static` - Merge static geometries\n- `geometry-instanced-mesh` - Use InstancedMesh for identical objects\n- `geometry-lod` - Use Level of Detail for complex models\n- `geometry-index-buffer` - Use indexed geometry\n- `geometry-vertex-count` - Minimize vertex count\n- `geometry-attributes-typed` - Use appropriate typed arrays\n- `geometry-interleaved` - Consider interleaved buffers\n\n### 4. Materials & Textures (HIGH)\n\n- `material-reuse` - Reuse materials across meshes\n- `material-simplest-sufficient` - Use simplest material that works\n- `material-texture-size-power-of-two` - Power-of-two texture dimensions\n- `material-texture-compression` - Use compressed textures (KTX2\u002FBasis)\n- `material-texture-mipmaps` - Enable mipmaps appropriately\n- `material-texture-anisotropy` - Use anisotropic filtering for floors\n- `material-texture-atlas` - Use texture atlases\n- `material-avoid-transparency` - Minimize transparent materials\n- `material-onbeforecompile` - Use onBeforeCompile for shader mods (or TSL)\n\n### 5. Lighting & Shadows (MEDIUM-HIGH)\n\n- `lighting-limit-lights` - Minimize dynamic lights\n- `lighting-bake-static` - Bake lighting for static scenes\n- `lighting-shadow-camera-tight` - Fit shadow camera tightly\n- `lighting-shadow-map-size` - Choose appropriate shadow resolution\n- `lighting-shadow-selective` - Enable shadows selectively\n- `lighting-shadow-cascade` - Use CSM for large scenes\n- `lighting-probe` - Use Light Probes\n\n### 6. Scene Graph (MEDIUM)\n\n- `scene-group-objects` - Use Groups for organization\n- `scene-layers` - Use Layers for selective rendering\n- `scene-visible-toggle` - Use visible flag, not add\u002Fremove\n- `scene-flatten-static` - Flatten static hierarchies\n- `scene-name-objects` - Name objects for debugging\n- `scene-object-pooling` - Use object pooling\n\n### 7. Shaders GLSL (MEDIUM)\n\n- `shader-precision` - Use appropriate precision\n- `shader-avoid-branching` - Minimize branching\n- `shader-precompute-cpu` - Precompute on CPU\n- `shader-avoid-discard` - Avoid discard, use alphaTest\n- `shader-texture-lod` - Use textureLod for known mip levels\n- `shader-uniform-arrays` - Prefer uniform arrays\n- `shader-varying-interpolation` - Use flat when appropriate\n- `shader-chunk-injection` - Use Three.js shader chunks\n\n### 8. TSL - Three.js Shading Language (MEDIUM)\n\n- `tsl-why-use` - Use TSL instead of onBeforeCompile\n- `tsl-setup-webgpu` - WebGPU setup for TSL\n- `tsl-complete-reference` - Full TSL type system and functions\n- `tsl-material-slots` - Material node properties reference\n- `tsl-node-materials` - Use NodeMaterial classes\n- `tsl-basic-operations` - Types, operations, swizzling\n- `tsl-functions` - Creating TSL functions with Fn()\n- `tsl-conditionals` - If, select, loops in TSL\n- `tsl-textures` - Textures and triplanar mapping\n- `tsl-post-processing` - bloom, blur, dof, ao\n- `tsl-compute-shaders` - GPGPU and compute operations\n- `tsl-glsl-to-tsl` - GLSL to TSL translation\n\n### 9. Loading & Assets (MEDIUM)\n\n- `loading-draco-compression` - Use Draco for large meshes\n- `loading-gltf-preferred` - Use glTF format\n- `gltf-loading-optimization` - Full loader setup with DRACO\u002FMeshopt\u002FKTX2\n- `loading-progress-feedback` - Show loading progress\n- `loading-async-await` - Use async\u002Fawait for loading\n- `loading-lazy` - Lazy load non-critical assets\n- `loading-cache-assets` - Enable caching\n- `loading-dispose-unused` - Unload unused assets\n\n### 10. Camera & Controls (LOW-MEDIUM)\n\n- `camera-near-far` - Set tight near\u002Ffar planes\n- `camera-fov` - Choose appropriate FOV\n- `camera-controls-damping` - Use damping for smooth controls\n- `camera-resize-handler` - Handle resize properly\n- `camera-orbit-limits` - Set orbit control limits\n\n### 11. Animation (MEDIUM)\n\n- `animation-system` - AnimationMixer, blending, morph targets, skeletal\n\n### 12. Physics (MEDIUM)\n\n- `physics-integration` - Rapier, Cannon-es integration patterns\n\n### 13. WebXR (MEDIUM)\n\n- `webxr-setup` - VR\u002FAR buttons, controllers, hit testing\n\n### 14. Audio (LOW-MEDIUM)\n\n- `audio-spatial` - PositionalAudio, HRTF, spatial sound\n\n### 15. Optimization (HIGH)\n\n- `mobile-optimization` - Mobile-specific optimizations and checklist\n- `raycasting-optimization` - BVH, layers, GPU picking\n\n### 16. Production (HIGH)\n\n- `error-handling-recovery` - WebGL context loss and recovery\n- `migration-checklist` - Breaking changes by version\n\n### 17. Debug (LOW)\n\n- `debug-stats` - Use Stats.js\n- `debug-helpers` - Use built-in helpers\n- `debug-gui` - Use lil-gui for tweaking\n- `debug-renderer-info` - Check renderer.info\n- `debug-conditional` - Remove debug code in production\n\n## How to Use\n\nRead individual rule files for detailed explanations and code examples:\n\n```\nrules\u002Fsetup-use-import-maps.md\nrules\u002Fmemory-dispose-geometry.md\nrules\u002Ftsl-complete-reference.md\nrules\u002Fmobile-optimization.md\n```\n\nEach rule file contains:\n- Brief explanation of why it matters\n- BAD code example with explanation\n- GOOD code example with explanation\n- Additional context and references\n\n## Key Patterns\n\n### Modern Import Maps\n\n```html\n\u003Cscript type=\"importmap\">\n{\n  \"imports\": {\n    \"three\": \"https:\u002F\u002Fcdn.jsdelivr.net\u002Fnpm\u002Fthree@0.182.0\u002Fbuild\u002Fthree.module.js\",\n    \"three\u002Faddons\u002F\": \"https:\u002F\u002Fcdn.jsdelivr.net\u002Fnpm\u002Fthree@0.182.0\u002Fexamples\u002Fjsm\u002F\",\n    \"three\u002Ftsl\": \"https:\u002F\u002Fcdn.jsdelivr.net\u002Fnpm\u002Fthree@0.182.0\u002Fbuild\u002Fthree.tsl.js\"\n  }\n}\n\u003C\u002Fscript>\n```\n\n### Proper Disposal\n\n```javascript\nfunction disposeObject(obj) {\n  if (obj.geometry) obj.geometry.dispose();\n  if (obj.material) {\n    if (Array.isArray(obj.material)) {\n      obj.material.forEach(m => m.dispose());\n    } else {\n      obj.material.dispose();\n    }\n  }\n}\n```\n\n### TSL Basic Usage\n\n```javascript\nimport { texture, uv, color, time, sin } from 'three\u002Ftsl';\n\nconst material = new THREE.MeshStandardNodeMaterial();\nmaterial.colorNode = texture(map).mul(color(0xff0000));\nmaterial.colorNode = color(0x00ff00).mul(sin(time).mul(0.5).add(0.5));\n```\n\n### Mobile Detection\n\n```javascript\nconst isMobile = \u002FAndroid|iPhone|iPad|iPod\u002Fi.test(navigator.userAgent);\nrenderer.setPixelRatio(Math.min(window.devicePixelRatio, isMobile ? 1.5 : 2));\n```\n",{"name":5,"license":15,"metadata":49,"description":7},{"author":50,"version":51,"three-version":52},"three-agent-skills","2.0.0","0.182.0+","main","5b00ad8b9f0787969474ff5e9ec417bb55f23827","skills\u002Fweb-frontend\u002Fneversight-skills_feed-three-best-practices-1.0.2",0,"https:\u002F\u002Fgithub.com\u002FVRIL-LABS\u002Fskill-jam","https:\u002F\u002Fvril.li","https:\u002F\u002Fgithub.com\u002FVRIL-LABS","vril.li","𝗥𝗲𝘀𝗲𝗮𝗿𝗰𝗵 𝗮𝗻𝗱 𝗗𝗲𝘃𝗲𝗹𝗼𝗽𝗺𝗲𝗻𝘁 𝗖𝗼𝗻𝘀𝗼𝗿𝘁𝗶𝘂𝗺","2026-08-24 09:21:38",{"source":8,"skillName":5,"commands":64,"prompt":74,"zipAvailable":75},[65,68,71],{"tool":66,"command":67},"npx","npx skills add VRIL-LABS\u002Fskill-jam --skill three-best-practices",{"tool":69,"command":70},"bunx","bunx skills add VRIL-LABS\u002Fskill-jam --skill three-best-practices",{"tool":72,"command":73},"pnpm","pnpm dlx skills add VRIL-LABS\u002Fskill-jam --skill three-best-practices","安装技能，技能地址：https:\u002F\u002Fgithub.com\u002FVRIL-LABS\u002Fskill-jam\u002Fblob\u002Fmain\u002Fskills\u002Fweb-frontend\u002Fneversight-skills_feed-three-best-practices-1.0.2\u002FSKILL.md",true,[77,83,87,91,95,99,103,107,111,115,119],{"path":78,"resourceType":79,"resourceTypeDesc":80,"sizeBytes":81,"sourceHtmlUrl":82},"description_ar.txt","REFERENCE","参考文档",421,"https:\u002F\u002Fgithub.com\u002FVRIL-LABS\u002Fskill-jam\u002Fblob\u002Fmain\u002Fskills\u002Fweb-frontend\u002Fneversight-skills_feed-three-best-practices-1.0.2\u002Fdescription_ar.txt",{"path":84,"resourceType":79,"resourceTypeDesc":80,"sizeBytes":85,"sourceHtmlUrl":86},"description_cn.txt",213,"https:\u002F\u002Fgithub.com\u002FVRIL-LABS\u002Fskill-jam\u002Fblob\u002Fmain\u002Fskills\u002Fweb-frontend\u002Fneversight-skills_feed-three-best-practices-1.0.2\u002Fdescription_cn.txt",{"path":88,"resourceType":79,"resourceTypeDesc":80,"sizeBytes":89,"sourceHtmlUrl":90},"description_de.txt",291,"https:\u002F\u002Fgithub.com\u002FVRIL-LABS\u002Fskill-jam\u002Fblob\u002Fmain\u002Fskills\u002Fweb-frontend\u002Fneversight-skills_feed-three-best-practices-1.0.2\u002Fdescription_de.txt",{"path":92,"resourceType":79,"resourceTypeDesc":80,"sizeBytes":93,"sourceHtmlUrl":94},"description_en.txt",246,"https:\u002F\u002Fgithub.com\u002FVRIL-LABS\u002Fskill-jam\u002Fblob\u002Fmain\u002Fskills\u002Fweb-frontend\u002Fneversight-skills_feed-three-best-practices-1.0.2\u002Fdescription_en.txt",{"path":96,"resourceType":79,"resourceTypeDesc":80,"sizeBytes":97,"sourceHtmlUrl":98},"description_es.txt",271,"https:\u002F\u002Fgithub.com\u002FVRIL-LABS\u002Fskill-jam\u002Fblob\u002Fmain\u002Fskills\u002Fweb-frontend\u002Fneversight-skills_feed-three-best-practices-1.0.2\u002Fdescription_es.txt",{"path":100,"resourceType":79,"resourceTypeDesc":80,"sizeBytes":101,"sourceHtmlUrl":102},"description_fr.txt",351,"https:\u002F\u002Fgithub.com\u002FVRIL-LABS\u002Fskill-jam\u002Fblob\u002Fmain\u002Fskills\u002Fweb-frontend\u002Fneversight-skills_feed-three-best-practices-1.0.2\u002Fdescription_fr.txt",{"path":104,"resourceType":79,"resourceTypeDesc":80,"sizeBytes":105,"sourceHtmlUrl":106},"description_it.txt",304,"https:\u002F\u002Fgithub.com\u002FVRIL-LABS\u002Fskill-jam\u002Fblob\u002Fmain\u002Fskills\u002Fweb-frontend\u002Fneversight-skills_feed-three-best-practices-1.0.2\u002Fdescription_it.txt",{"path":108,"resourceType":79,"resourceTypeDesc":80,"sizeBytes":109,"sourceHtmlUrl":110},"description_ja.txt",391,"https:\u002F\u002Fgithub.com\u002FVRIL-LABS\u002Fskill-jam\u002Fblob\u002Fmain\u002Fskills\u002Fweb-frontend\u002Fneversight-skills_feed-three-best-practices-1.0.2\u002Fdescription_ja.txt",{"path":112,"resourceType":79,"resourceTypeDesc":80,"sizeBytes":113,"sourceHtmlUrl":114},"description_ko.txt",261,"https:\u002F\u002Fgithub.com\u002FVRIL-LABS\u002Fskill-jam\u002Fblob\u002Fmain\u002Fskills\u002Fweb-frontend\u002Fneversight-skills_feed-three-best-practices-1.0.2\u002Fdescription_ko.txt",{"path":116,"resourceType":79,"resourceTypeDesc":80,"sizeBytes":117,"sourceHtmlUrl":118},"description_ru.txt",513,"https:\u002F\u002Fgithub.com\u002FVRIL-LABS\u002Fskill-jam\u002Fblob\u002Fmain\u002Fskills\u002Fweb-frontend\u002Fneversight-skills_feed-three-best-practices-1.0.2\u002Fdescription_ru.txt",{"path":120,"resourceType":79,"resourceTypeDesc":80,"sizeBytes":85,"sourceHtmlUrl":121},"description_tw.txt","https:\u002F\u002Fgithub.com\u002FVRIL-LABS\u002Fskill-jam\u002Fblob\u002Fmain\u002Fskills\u002Fweb-frontend\u002Fneversight-skills_feed-three-best-practices-1.0.2\u002Fdescription_tw.txt",[123,137,153,190,213,237],{"skillNo":124,"name":125,"nameZh":6,"description":126,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":12,"repositoryNo":13,"starsCount":14,"licenseSpdxId":15,"licenseFileUrl":6,"sourceHtmlUrl":127,"categories":128,"keywords":129,"publishedAt":44},"01M6R2BPMDYK9XKWPARY0S5MS3","javascript-best-practices","Modern JavaScript best practices and performance optimization guidelines. Use when writing, reviewing, or refactoring JavaScript code to ensure optimal performance, maintainability, and modern patterns.","https:\u002F\u002Fgithub.com\u002FVRIL-LABS\u002Fskill-jam\u002Fblob\u002Fmain\u002Fskills\u002Fweb-frontend\u002Fneversight-skills_feed-javascript-best-practices-1.0.2\u002FSKILL.md",[],[130,25,131,35,43,41,39,37,132,133,27,134,135,136,29],"javascript","JavaScript Best Practices","refactoring","performance optimization","patterns","maintainability","name",{"skillNo":138,"name":139,"nameZh":6,"description":140,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":12,"repositoryNo":13,"starsCount":14,"licenseSpdxId":15,"licenseFileUrl":6,"sourceHtmlUrl":141,"categories":142,"keywords":146,"publishedAt":44},"01M6R2B41BN09FYH76BAC5FT7X","css-best-practices","Guidelines for building modern, performant, and accessible CSS using MDN best practices. Use this when styling components, fixing layout shifts, or optimizing CSS performance.","https:\u002F\u002Fgithub.com\u002FVRIL-LABS\u002Fskill-jam\u002Fblob\u002Fmain\u002Fskills\u002Fweb-frontend\u002Fneversight-skills_feed-css-best-practices-1.0.3\u002FSKILL.md",[143],{"categoryNo":144,"categoryName":145,"taxonomyType":21,"taxonomyTypeDesc":22},"01JBSEEDCAT000000000000009","前端开发",[147,25,148,43,149,41,27,150,151,152,29],"css","css best practices","components","styling","layout","for",{"skillNo":154,"name":155,"nameZh":6,"description":156,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":12,"repositoryNo":13,"starsCount":14,"licenseSpdxId":15,"licenseFileUrl":6,"sourceHtmlUrl":157,"categories":158,"keywords":171,"publishedAt":44},"01M6R2A1CEF123TZCNM1XJ2XQ4","frontend-dev","Full-stack frontend development combining premium UI design, cinematic animations,\nAI-generated media assets, persuasive copywriting, and visual art. Builds complete,\nvisually striking web pages with real media, advanced motion, and compelling copy.\nUse when: building landing pages, marketing sites, product pages, dashboards,\ngenerating media assets (image\u002Fvideo\u002Faudio\u002Fmusic), writing conversion copy,\ncreating generative art, or implementing cinematic scroll animations.","https:\u002F\u002Fgithub.com\u002FVRIL-LABS\u002Fskill-jam\u002Fblob\u002Fmain\u002Fskills\u002Fweb-frontend\u002Fminimax-ai-skills-frontend-dev-1.0.1\u002FSKILL.md",[159,160,163,166],{"categoryNo":144,"categoryName":145,"taxonomyType":21,"taxonomyTypeDesc":22},{"categoryNo":161,"categoryName":162,"taxonomyType":21,"taxonomyTypeDesc":22},"01JBSEEDCAT000000000000015","视觉设计",{"categoryNo":164,"categoryName":165,"taxonomyType":21,"taxonomyTypeDesc":22},"01JBSEEDCAT000000000000016","图像与多媒体",{"categoryNo":167,"categoryName":168,"taxonomyType":169,"taxonomyTypeDesc":170},"01JBSEEDCAT000000000000032","设计师","PROFESSION","适用职业",[172,173,174,175,35,176,147,177,178,179,180,181,182,183,184,185,186,187,188,189],"frontend","dev","frontend dev","design","image","react","ui","Video","Media","Audio","Tailwind","stack","music","aida","framer motion","implementing","framer","generative",{"skillNo":191,"name":192,"nameZh":6,"description":193,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":12,"repositoryNo":13,"starsCount":14,"licenseSpdxId":15,"licenseFileUrl":6,"sourceHtmlUrl":194,"categories":195,"keywords":196,"publishedAt":44},"01M6R20VQ98KDX4J37TGE0FNHW","exa-rate-limits","Implement Exa rate limiting, backoff, and idempotency patterns.\nUse when handling rate limit errors, implementing retry logic,\nor optimizing API request throughput for Exa.\nTrigger with phrases like \"exa rate limit\", \"exa throttling\",\n\"exa 429\", \"exa retry\", \"exa backoff\".","https:\u002F\u002Fgithub.com\u002FVRIL-LABS\u002Fskill-jam\u002Fblob\u002Fmain\u002Fskills\u002Fsearch-research\u002Fjeremylongshore-claude-code-plugins-plus-skills-exa-rate-limits-1.0.0\u002FSKILL.md",[],[197,198,199,200,201,202,203,204,205,134,206,207,208,209,210,187,152,211,212,29],"exa","exa rate limits","rate","limits","throttling","api","read","write","edit","io","throughput","retry","errors","limit","rate limit","request",{"skillNo":214,"name":215,"nameZh":6,"description":216,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":12,"repositoryNo":13,"starsCount":14,"licenseSpdxId":15,"licenseFileUrl":6,"sourceHtmlUrl":217,"categories":218,"keywords":222,"publishedAt":44},"01M6R20FV0TM7ZZTZNG7JQ1A82","exa-deploy-integration","Deploy Exa integrations to Vercel, Fly.io, and Cloud Run platforms.\nUse when deploying Exa-powered applications to production,\nconfiguring platform-specific secrets, or setting up deployment pipelines.\nTrigger with phrases like \"deploy exa\", \"exa Vercel\",\n\"exa production deploy\", \"exa Cloud Run\", \"exa Fly.io\".","https:\u002F\u002Fgithub.com\u002FVRIL-LABS\u002Fskill-jam\u002Fblob\u002Fmain\u002Fskills\u002Fsearch-research\u002Fjeremylongshore-claude-code-plugins-plus-skills-exa-deploy-integration-1.0.0\u002FSKILL.md",[219],{"categoryNo":220,"categoryName":221,"taxonomyType":21,"taxonomyTypeDesc":22},"01JBSEEDCAT000000000000011","运维与部署",[223,224,197,225,226,227,228,229,230,231,203,204,205,232,233,234,206,235,236,29],"deploy","integration","exa deploy integration","deployment","run","secrets","fly","Bash","integrations","vercel","up","platform","trigger","cloud run",{"skillNo":238,"name":239,"nameZh":6,"description":240,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":12,"repositoryNo":13,"starsCount":14,"licenseSpdxId":15,"licenseFileUrl":6,"sourceHtmlUrl":241,"categories":242,"keywords":244,"publishedAt":44},"01M6R20A4AFVVEX6952MKH9HMM","exa-core-workflow-a","Execute Exa primary workflow: Core Workflow A.\nUse when implementing primary use case,\nbuilding main features, or core integration tasks.\nTrigger with phrases like \"exa main workflow\",\n\"primary task with exa\".","https:\u002F\u002Fgithub.com\u002FVRIL-LABS\u002Fskill-jam\u002Fblob\u002Fmain\u002Fskills\u002Fsearch-research\u002Fjeremylongshore-claude-code-plugins-plus-skills-exa-core-workflow-a-1.0.0\u002FSKILL.md",[243],{"categoryNo":19,"categoryName":20,"taxonomyType":21,"taxonomyTypeDesc":22},[245,246,197,247,248,40,39,230,203,204,205,27,249,53,206,235,250,187,251,29],"workflow","core","exa core workflow a","openclaw","task","with","features"]