agy-superpowers 5.0.7 → 5.0.9

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (232) hide show
  1. package/package.json +1 -1
  2. package/template/agent/rules/superpowers.md +54 -0
  3. package/template/agent/skills/api-design/SKILL.md +193 -0
  4. package/template/agent/skills/app-store-optimizer/SKILL.md +127 -0
  5. package/template/agent/skills/auth-and-identity/SKILL.md +167 -0
  6. package/template/agent/skills/backend-developer/SKILL.md +148 -0
  7. package/template/agent/skills/community-manager/SKILL.md +115 -0
  8. package/template/agent/skills/content-marketer/SKILL.md +111 -0
  9. package/template/agent/skills/conversion-optimizer/SKILL.md +142 -0
  10. package/template/agent/skills/copywriter/SKILL.md +114 -0
  11. package/template/agent/skills/cto-architect/SKILL.md +133 -0
  12. package/template/agent/skills/customer-success-manager/SKILL.md +126 -0
  13. package/template/agent/skills/data-analyst/SKILL.md +147 -0
  14. package/template/agent/skills/devops-engineer/SKILL.md +117 -0
  15. package/template/agent/skills/email-infrastructure/SKILL.md +164 -0
  16. package/template/agent/skills/frontend-developer/SKILL.md +172 -0
  17. package/template/agent/skills/frontend-developer/references/react-nextjs.md +343 -0
  18. package/template/agent/skills/frontend-developer/references/react-rules/_sections.md +46 -0
  19. package/template/agent/skills/frontend-developer/references/react-rules/_template.md +28 -0
  20. package/template/agent/skills/frontend-developer/references/react-rules/advanced-event-handler-refs.md +55 -0
  21. package/template/agent/skills/frontend-developer/references/react-rules/advanced-init-once.md +42 -0
  22. package/template/agent/skills/frontend-developer/references/react-rules/advanced-use-latest.md +39 -0
  23. package/template/agent/skills/frontend-developer/references/react-rules/async-api-routes.md +38 -0
  24. package/template/agent/skills/frontend-developer/references/react-rules/async-defer-await.md +80 -0
  25. package/template/agent/skills/frontend-developer/references/react-rules/async-dependencies.md +51 -0
  26. package/template/agent/skills/frontend-developer/references/react-rules/async-parallel.md +28 -0
  27. package/template/agent/skills/frontend-developer/references/react-rules/async-suspense-boundaries.md +99 -0
  28. package/template/agent/skills/frontend-developer/references/react-rules/bundle-barrel-imports.md +59 -0
  29. package/template/agent/skills/frontend-developer/references/react-rules/bundle-conditional.md +31 -0
  30. package/template/agent/skills/frontend-developer/references/react-rules/bundle-defer-third-party.md +49 -0
  31. package/template/agent/skills/frontend-developer/references/react-rules/bundle-dynamic-imports.md +35 -0
  32. package/template/agent/skills/frontend-developer/references/react-rules/bundle-preload.md +50 -0
  33. package/template/agent/skills/frontend-developer/references/react-rules/client-event-listeners.md +74 -0
  34. package/template/agent/skills/frontend-developer/references/react-rules/client-localstorage-schema.md +71 -0
  35. package/template/agent/skills/frontend-developer/references/react-rules/client-passive-event-listeners.md +48 -0
  36. package/template/agent/skills/frontend-developer/references/react-rules/client-swr-dedup.md +56 -0
  37. package/template/agent/skills/frontend-developer/references/react-rules/js-batch-dom-css.md +107 -0
  38. package/template/agent/skills/frontend-developer/references/react-rules/js-cache-function-results.md +80 -0
  39. package/template/agent/skills/frontend-developer/references/react-rules/js-cache-property-access.md +28 -0
  40. package/template/agent/skills/frontend-developer/references/react-rules/js-cache-storage.md +70 -0
  41. package/template/agent/skills/frontend-developer/references/react-rules/js-combine-iterations.md +32 -0
  42. package/template/agent/skills/frontend-developer/references/react-rules/js-early-exit.md +50 -0
  43. package/template/agent/skills/frontend-developer/references/react-rules/js-flatmap-filter.md +60 -0
  44. package/template/agent/skills/frontend-developer/references/react-rules/js-hoist-regexp.md +45 -0
  45. package/template/agent/skills/frontend-developer/references/react-rules/js-index-maps.md +37 -0
  46. package/template/agent/skills/frontend-developer/references/react-rules/js-length-check-first.md +49 -0
  47. package/template/agent/skills/frontend-developer/references/react-rules/js-min-max-loop.md +82 -0
  48. package/template/agent/skills/frontend-developer/references/react-rules/js-set-map-lookups.md +24 -0
  49. package/template/agent/skills/frontend-developer/references/react-rules/js-tosorted-immutable.md +57 -0
  50. package/template/agent/skills/frontend-developer/references/react-rules/rendering-activity.md +26 -0
  51. package/template/agent/skills/frontend-developer/references/react-rules/rendering-animate-svg-wrapper.md +47 -0
  52. package/template/agent/skills/frontend-developer/references/react-rules/rendering-conditional-render.md +40 -0
  53. package/template/agent/skills/frontend-developer/references/react-rules/rendering-content-visibility.md +38 -0
  54. package/template/agent/skills/frontend-developer/references/react-rules/rendering-hoist-jsx.md +46 -0
  55. package/template/agent/skills/frontend-developer/references/react-rules/rendering-hydration-no-flicker.md +82 -0
  56. package/template/agent/skills/frontend-developer/references/react-rules/rendering-hydration-suppress-warning.md +30 -0
  57. package/template/agent/skills/frontend-developer/references/react-rules/rendering-resource-hints.md +85 -0
  58. package/template/agent/skills/frontend-developer/references/react-rules/rendering-script-defer-async.md +68 -0
  59. package/template/agent/skills/frontend-developer/references/react-rules/rendering-svg-precision.md +28 -0
  60. package/template/agent/skills/frontend-developer/references/react-rules/rendering-usetransition-loading.md +75 -0
  61. package/template/agent/skills/frontend-developer/references/react-rules/rerender-defer-reads.md +39 -0
  62. package/template/agent/skills/frontend-developer/references/react-rules/rerender-dependencies.md +45 -0
  63. package/template/agent/skills/frontend-developer/references/react-rules/rerender-derived-state-no-effect.md +40 -0
  64. package/template/agent/skills/frontend-developer/references/react-rules/rerender-derived-state.md +29 -0
  65. package/template/agent/skills/frontend-developer/references/react-rules/rerender-functional-setstate.md +74 -0
  66. package/template/agent/skills/frontend-developer/references/react-rules/rerender-lazy-state-init.md +58 -0
  67. package/template/agent/skills/frontend-developer/references/react-rules/rerender-memo-with-default-value.md +38 -0
  68. package/template/agent/skills/frontend-developer/references/react-rules/rerender-memo.md +44 -0
  69. package/template/agent/skills/frontend-developer/references/react-rules/rerender-move-effect-to-event.md +45 -0
  70. package/template/agent/skills/frontend-developer/references/react-rules/rerender-no-inline-components.md +82 -0
  71. package/template/agent/skills/frontend-developer/references/react-rules/rerender-simple-expression-in-memo.md +35 -0
  72. package/template/agent/skills/frontend-developer/references/react-rules/rerender-split-combined-hooks.md +64 -0
  73. package/template/agent/skills/frontend-developer/references/react-rules/rerender-transitions.md +40 -0
  74. package/template/agent/skills/frontend-developer/references/react-rules/rerender-use-deferred-value.md +59 -0
  75. package/template/agent/skills/frontend-developer/references/react-rules/rerender-use-ref-transient-values.md +73 -0
  76. package/template/agent/skills/frontend-developer/references/react-rules/server-after-nonblocking.md +73 -0
  77. package/template/agent/skills/frontend-developer/references/react-rules/server-auth-actions.md +96 -0
  78. package/template/agent/skills/frontend-developer/references/react-rules/server-cache-lru.md +41 -0
  79. package/template/agent/skills/frontend-developer/references/react-rules/server-cache-react.md +76 -0
  80. package/template/agent/skills/frontend-developer/references/react-rules/server-dedup-props.md +65 -0
  81. package/template/agent/skills/frontend-developer/references/react-rules/server-hoist-static-io.md +142 -0
  82. package/template/agent/skills/frontend-developer/references/react-rules/server-parallel-fetching.md +83 -0
  83. package/template/agent/skills/frontend-developer/references/react-rules/server-serialization.md +38 -0
  84. package/template/agent/skills/frontend-developer/references/svelte-sveltekit.md +220 -0
  85. package/template/agent/skills/frontend-developer/references/vanilla.md +275 -0
  86. package/template/agent/skills/frontend-developer/references/vue-nuxt.md +289 -0
  87. package/template/agent/skills/frontend-developer/references/vue-rules/best-practices/_index.md +154 -0
  88. package/template/agent/skills/frontend-developer/references/vue-rules/best-practices/animation-class-based-technique.md +254 -0
  89. package/template/agent/skills/frontend-developer/references/vue-rules/best-practices/animation-state-driven-technique.md +291 -0
  90. package/template/agent/skills/frontend-developer/references/vue-rules/best-practices/component-async.md +97 -0
  91. package/template/agent/skills/frontend-developer/references/vue-rules/best-practices/component-data-flow.md +307 -0
  92. package/template/agent/skills/frontend-developer/references/vue-rules/best-practices/component-fallthrough-attrs.md +174 -0
  93. package/template/agent/skills/frontend-developer/references/vue-rules/best-practices/component-keep-alive.md +137 -0
  94. package/template/agent/skills/frontend-developer/references/vue-rules/best-practices/component-slots.md +216 -0
  95. package/template/agent/skills/frontend-developer/references/vue-rules/best-practices/component-suspense.md +228 -0
  96. package/template/agent/skills/frontend-developer/references/vue-rules/best-practices/component-teleport.md +108 -0
  97. package/template/agent/skills/frontend-developer/references/vue-rules/best-practices/component-transition-group.md +128 -0
  98. package/template/agent/skills/frontend-developer/references/vue-rules/best-practices/component-transition.md +125 -0
  99. package/template/agent/skills/frontend-developer/references/vue-rules/best-practices/composables.md +290 -0
  100. package/template/agent/skills/frontend-developer/references/vue-rules/best-practices/directives.md +162 -0
  101. package/template/agent/skills/frontend-developer/references/vue-rules/best-practices/perf-avoid-component-abstraction-in-lists.md +159 -0
  102. package/template/agent/skills/frontend-developer/references/vue-rules/best-practices/perf-v-once-v-memo-directives.md +182 -0
  103. package/template/agent/skills/frontend-developer/references/vue-rules/best-practices/perf-virtualize-large-lists.md +187 -0
  104. package/template/agent/skills/frontend-developer/references/vue-rules/best-practices/plugins.md +166 -0
  105. package/template/agent/skills/frontend-developer/references/vue-rules/best-practices/reactivity.md +344 -0
  106. package/template/agent/skills/frontend-developer/references/vue-rules/best-practices/render-functions.md +201 -0
  107. package/template/agent/skills/frontend-developer/references/vue-rules/best-practices/sfc.md +310 -0
  108. package/template/agent/skills/frontend-developer/references/vue-rules/best-practices/state-management.md +135 -0
  109. package/template/agent/skills/frontend-developer/references/vue-rules/best-practices/updated-hook-performance.md +187 -0
  110. package/template/agent/skills/frontend-developer/references/vue-rules/router/_index.md +23 -0
  111. package/template/agent/skills/frontend-developer/references/vue-rules/router/router-beforeenter-no-param-trigger.md +167 -0
  112. package/template/agent/skills/frontend-developer/references/vue-rules/router/router-beforerouteenter-no-this.md +176 -0
  113. package/template/agent/skills/frontend-developer/references/vue-rules/router/router-guard-async-await-pattern.md +227 -0
  114. package/template/agent/skills/frontend-developer/references/vue-rules/router/router-navigation-guard-infinite-loop.md +187 -0
  115. package/template/agent/skills/frontend-developer/references/vue-rules/router/router-navigation-guard-next-deprecated.md +150 -0
  116. package/template/agent/skills/frontend-developer/references/vue-rules/router/router-param-change-no-lifecycle.md +181 -0
  117. package/template/agent/skills/frontend-developer/references/vue-rules/router/router-simple-routing-cleanup.md +209 -0
  118. package/template/agent/skills/frontend-developer/references/vue-rules/router/router-use-vue-router-for-production.md +183 -0
  119. package/template/agent/skills/frontend-developer/references/vue-rules/testing/_index.md +29 -0
  120. package/template/agent/skills/frontend-developer/references/vue-rules/testing/async-component-testing.md +163 -0
  121. package/template/agent/skills/frontend-developer/references/vue-rules/testing/teleport-testing-complexity.md +158 -0
  122. package/template/agent/skills/frontend-developer/references/vue-rules/testing/testing-async-await-flushpromises.md +175 -0
  123. package/template/agent/skills/frontend-developer/references/vue-rules/testing/testing-browser-vs-node-runners.md +208 -0
  124. package/template/agent/skills/frontend-developer/references/vue-rules/testing/testing-component-blackbox-approach.md +144 -0
  125. package/template/agent/skills/frontend-developer/references/vue-rules/testing/testing-composables-helper-wrapper.md +238 -0
  126. package/template/agent/skills/frontend-developer/references/vue-rules/testing/testing-e2e-playwright-recommended.md +242 -0
  127. package/template/agent/skills/frontend-developer/references/vue-rules/testing/testing-no-snapshot-only.md +197 -0
  128. package/template/agent/skills/frontend-developer/references/vue-rules/testing/testing-pinia-store-setup.md +228 -0
  129. package/template/agent/skills/frontend-developer/references/vue-rules/testing/testing-suspense-async-components.md +229 -0
  130. package/template/agent/skills/frontend-developer/references/vue-rules/testing/testing-vitest-recommended-for-vue.md +204 -0
  131. package/template/agent/skills/game-design/SKILL.md +194 -0
  132. package/template/agent/skills/game-developer/SKILL.md +175 -0
  133. package/template/agent/skills/growth-hacker/SKILL.md +122 -0
  134. package/template/agent/skills/i18n-localization/SKILL.md +126 -0
  135. package/template/agent/skills/influencer-marketer/SKILL.md +141 -0
  136. package/template/agent/skills/mobile-developer/SKILL.md +194 -0
  137. package/template/agent/skills/mobile-developer/references/android-native.md +396 -0
  138. package/template/agent/skills/mobile-developer/references/android-rules/android-accessibility.md +36 -0
  139. package/template/agent/skills/mobile-developer/references/android-rules/android-architecture.md +52 -0
  140. package/template/agent/skills/mobile-developer/references/android-rules/android-coroutines.md +139 -0
  141. package/template/agent/skills/mobile-developer/references/android-rules/android-data-layer.md +51 -0
  142. package/template/agent/skills/mobile-developer/references/android-rules/android-emulator-skill.md +108 -0
  143. package/template/agent/skills/mobile-developer/references/android-rules/android-gradle-logic.md +126 -0
  144. package/template/agent/skills/mobile-developer/references/android-rules/android-retrofit.md +142 -0
  145. package/template/agent/skills/mobile-developer/references/android-rules/android-testing.md +102 -0
  146. package/template/agent/skills/mobile-developer/references/android-rules/android-viewmodel.md +43 -0
  147. package/template/agent/skills/mobile-developer/references/android-rules/coil-compose.md +74 -0
  148. package/template/agent/skills/mobile-developer/references/android-rules/compose-navigation.md +422 -0
  149. package/template/agent/skills/mobile-developer/references/android-rules/compose-performance-audit.md +199 -0
  150. package/template/agent/skills/mobile-developer/references/android-rules/compose-ui.md +49 -0
  151. package/template/agent/skills/mobile-developer/references/android-rules/gradle-build-performance.md +346 -0
  152. package/template/agent/skills/mobile-developer/references/android-rules/kotlin-concurrency-expert.md +169 -0
  153. package/template/agent/skills/mobile-developer/references/android-rules/rxjava-to-coroutines-migration.md +101 -0
  154. package/template/agent/skills/mobile-developer/references/android-rules/xml-to-compose-migration.md +338 -0
  155. package/template/agent/skills/mobile-developer/references/flutter-rules/dart-best-practices.md +52 -0
  156. package/template/agent/skills/mobile-developer/references/flutter-rules/dart-checks-migration.md +134 -0
  157. package/template/agent/skills/mobile-developer/references/flutter-rules/dart-cli-app-best-practices.md +123 -0
  158. package/template/agent/skills/mobile-developer/references/flutter-rules/dart-doc-validation.md +45 -0
  159. package/template/agent/skills/mobile-developer/references/flutter-rules/dart-matcher-best-practices.md +106 -0
  160. package/template/agent/skills/mobile-developer/references/flutter-rules/dart-modern-features.md +241 -0
  161. package/template/agent/skills/mobile-developer/references/flutter-rules/dart-package-maintenance.md +75 -0
  162. package/template/agent/skills/mobile-developer/references/flutter-rules/dart-test-fundamentals.md +124 -0
  163. package/template/agent/skills/mobile-developer/references/flutter.md +291 -0
  164. package/template/agent/skills/mobile-developer/references/ios-native.md +358 -0
  165. package/template/agent/skills/mobile-developer/references/ios-rules/accessibility-patterns.md +215 -0
  166. package/template/agent/skills/mobile-developer/references/ios-rules/animation-advanced.md +403 -0
  167. package/template/agent/skills/mobile-developer/references/ios-rules/animation-basics.md +284 -0
  168. package/template/agent/skills/mobile-developer/references/ios-rules/animation-transitions.md +326 -0
  169. package/template/agent/skills/mobile-developer/references/ios-rules/charts-accessibility.md +135 -0
  170. package/template/agent/skills/mobile-developer/references/ios-rules/charts.md +602 -0
  171. package/template/agent/skills/mobile-developer/references/ios-rules/image-optimization.md +203 -0
  172. package/template/agent/skills/mobile-developer/references/ios-rules/latest-apis.md +464 -0
  173. package/template/agent/skills/mobile-developer/references/ios-rules/layout-best-practices.md +266 -0
  174. package/template/agent/skills/mobile-developer/references/ios-rules/liquid-glass.md +416 -0
  175. package/template/agent/skills/mobile-developer/references/ios-rules/list-patterns.md +394 -0
  176. package/template/agent/skills/mobile-developer/references/ios-rules/macos-scenes.md +318 -0
  177. package/template/agent/skills/mobile-developer/references/ios-rules/macos-views.md +357 -0
  178. package/template/agent/skills/mobile-developer/references/ios-rules/macos-window-styling.md +303 -0
  179. package/template/agent/skills/mobile-developer/references/ios-rules/performance-patterns.md +403 -0
  180. package/template/agent/skills/mobile-developer/references/ios-rules/scroll-patterns.md +293 -0
  181. package/template/agent/skills/mobile-developer/references/ios-rules/sheet-navigation-patterns.md +363 -0
  182. package/template/agent/skills/mobile-developer/references/ios-rules/state-management.md +417 -0
  183. package/template/agent/skills/mobile-developer/references/ios-rules/view-structure.md +389 -0
  184. package/template/agent/skills/mobile-developer/references/react-native-rules/_sections.md +86 -0
  185. package/template/agent/skills/mobile-developer/references/react-native-rules/_template.md +28 -0
  186. package/template/agent/skills/mobile-developer/references/react-native-rules/animation-derived-value.md +53 -0
  187. package/template/agent/skills/mobile-developer/references/react-native-rules/animation-gesture-detector-press.md +95 -0
  188. package/template/agent/skills/mobile-developer/references/react-native-rules/animation-gpu-properties.md +65 -0
  189. package/template/agent/skills/mobile-developer/references/react-native-rules/design-system-compound-components.md +66 -0
  190. package/template/agent/skills/mobile-developer/references/react-native-rules/fonts-config-plugin.md +71 -0
  191. package/template/agent/skills/mobile-developer/references/react-native-rules/imports-design-system-folder.md +68 -0
  192. package/template/agent/skills/mobile-developer/references/react-native-rules/js-hoist-intl.md +61 -0
  193. package/template/agent/skills/mobile-developer/references/react-native-rules/list-performance-callbacks.md +44 -0
  194. package/template/agent/skills/mobile-developer/references/react-native-rules/list-performance-function-references.md +132 -0
  195. package/template/agent/skills/mobile-developer/references/react-native-rules/list-performance-images.md +53 -0
  196. package/template/agent/skills/mobile-developer/references/react-native-rules/list-performance-inline-objects.md +97 -0
  197. package/template/agent/skills/mobile-developer/references/react-native-rules/list-performance-item-expensive.md +94 -0
  198. package/template/agent/skills/mobile-developer/references/react-native-rules/list-performance-item-memo.md +82 -0
  199. package/template/agent/skills/mobile-developer/references/react-native-rules/list-performance-item-types.md +104 -0
  200. package/template/agent/skills/mobile-developer/references/react-native-rules/list-performance-virtualize.md +67 -0
  201. package/template/agent/skills/mobile-developer/references/react-native-rules/monorepo-native-deps-in-app.md +46 -0
  202. package/template/agent/skills/mobile-developer/references/react-native-rules/monorepo-single-dependency-versions.md +63 -0
  203. package/template/agent/skills/mobile-developer/references/react-native-rules/navigation-native-navigators.md +188 -0
  204. package/template/agent/skills/mobile-developer/references/react-native-rules/react-compiler-destructure-functions.md +50 -0
  205. package/template/agent/skills/mobile-developer/references/react-native-rules/react-compiler-reanimated-shared-values.md +48 -0
  206. package/template/agent/skills/mobile-developer/references/react-native-rules/react-state-dispatcher.md +91 -0
  207. package/template/agent/skills/mobile-developer/references/react-native-rules/react-state-fallback.md +56 -0
  208. package/template/agent/skills/mobile-developer/references/react-native-rules/react-state-minimize.md +65 -0
  209. package/template/agent/skills/mobile-developer/references/react-native-rules/rendering-no-falsy-and.md +74 -0
  210. package/template/agent/skills/mobile-developer/references/react-native-rules/rendering-text-in-text-component.md +36 -0
  211. package/template/agent/skills/mobile-developer/references/react-native-rules/scroll-position-no-state.md +82 -0
  212. package/template/agent/skills/mobile-developer/references/react-native-rules/state-ground-truth.md +80 -0
  213. package/template/agent/skills/mobile-developer/references/react-native-rules/ui-expo-image.md +66 -0
  214. package/template/agent/skills/mobile-developer/references/react-native-rules/ui-image-gallery.md +104 -0
  215. package/template/agent/skills/mobile-developer/references/react-native-rules/ui-measure-views.md +78 -0
  216. package/template/agent/skills/mobile-developer/references/react-native-rules/ui-menus.md +174 -0
  217. package/template/agent/skills/mobile-developer/references/react-native-rules/ui-native-modals.md +77 -0
  218. package/template/agent/skills/mobile-developer/references/react-native-rules/ui-pressable.md +61 -0
  219. package/template/agent/skills/mobile-developer/references/react-native-rules/ui-safe-area-scroll.md +65 -0
  220. package/template/agent/skills/mobile-developer/references/react-native-rules/ui-scrollview-content-inset.md +45 -0
  221. package/template/agent/skills/mobile-developer/references/react-native-rules/ui-styling.md +87 -0
  222. package/template/agent/skills/mobile-developer/references/react-native.md +345 -0
  223. package/template/agent/skills/monetization-strategist/SKILL.md +119 -0
  224. package/template/agent/skills/paid-acquisition-specialist/SKILL.md +119 -0
  225. package/template/agent/skills/product-manager/SKILL.md +105 -0
  226. package/template/agent/skills/real-time-features/SKILL.md +194 -0
  227. package/template/agent/skills/retention-specialist/SKILL.md +123 -0
  228. package/template/agent/skills/saas-architect/SKILL.md +139 -0
  229. package/template/agent/skills/security-engineer/SKILL.md +133 -0
  230. package/template/agent/skills/seo-specialist/SKILL.md +130 -0
  231. package/template/agent/skills/subscription-billing/SKILL.md +179 -0
  232. package/template/agent/skills/ux-designer/SKILL.md +128 -0
@@ -0,0 +1,344 @@
1
+ ---
2
+ title: Reactivity Core Patterns (ref, reactive, shallowRef, computed, watch)
3
+ impact: MEDIUM
4
+ impactDescription: Clear reactivity choices keep state predictable and reduce unnecessary updates in Vue 3 apps
5
+ type: efficiency
6
+ tags: [vue3, reactivity, ref, reactive, shallowRef, computed, watch, watchEffect, external-state, best-practice]
7
+ ---
8
+
9
+ # Reactivity Core Patterns (ref, reactive, shallowRef, computed, watch)
10
+
11
+ **Impact: MEDIUM** - Choose the right reactive primitive first, derive with `computed`, and use watchers only for side effects.
12
+
13
+ This reference covers the core reactivity decisions for local state, external data, derived values, and effects.
14
+
15
+ ## Task List
16
+
17
+ - Declare reactive state correctly
18
+ - Always use `shallowRef()` instead of `ref()` for primitive values
19
+ - Choose the correct reactive declaration method for objects/arrays/map/set
20
+ - Follow best practices for `reactive`
21
+ - Avoid destructuring from `reactive()` directly
22
+ - Watch correctly for `reactive`
23
+ - Follow best practices for `computed`
24
+ - Prefer `computed` over watcher-assigned derived refs
25
+ - Keep filtered/sorted derivations out of templates
26
+ - Use `computed` for reusable class/style logic
27
+ - Keep computed getters pure (no side effects) and put side effects in watchers
28
+ - Follow best practices for watchers
29
+ - Use `immediate: true` instead of duplicate initial calls
30
+ - Clean up async effects for watchers
31
+
32
+ ## Declare reactive state correctly
33
+
34
+ ### Always use `shallowRef()` instead of `ref()` for primitive values (string, number, boolean, null, etc.) for better performance.
35
+
36
+ **Incorrect:**
37
+ ```ts
38
+ import { ref } from 'vue'
39
+ const count = ref(0)
40
+ ```
41
+
42
+ **Correct:**
43
+ ```ts
44
+ import { shallowRef } from 'vue'
45
+ const count = shallowRef(0)
46
+ ```
47
+
48
+ ### Choose the correct reactive declaration method for objects/arrays/map/set
49
+
50
+ Use `ref()` when you often **replace the entire value** (`state.value = newObj`) and still want deep reactivity inside it, usually used for:
51
+
52
+ - Frequently reassigned state (replace fetched object/list, reset to defaults, switch presets).
53
+ - Composable return values where updates happen mostly via `.value` reassignment.
54
+
55
+ Use `reactive()` when you mainly **mutate properties** and full replacement is uncommon, usually used for:
56
+
57
+ - “Single state object” patterns (stores/forms): `state.count++`, `state.items.push(...)`, `state.user.name = ...`.
58
+ - Situations where you want to avoid `.value` and update nested fields in place.
59
+
60
+ ```ts
61
+ import { reactive } from 'vue'
62
+
63
+ const state = reactive({
64
+ count: 0,
65
+ user: { name: 'Alice', age: 30 }
66
+ })
67
+
68
+ state.count++ // ✅ reactive
69
+ state.user.age = 31 // ✅ reactive
70
+ // ❌ avoid replacing the reactive object reference:
71
+ // state = reactive({ count: 1 })
72
+ ```
73
+
74
+ Use `shallowRef()` when the value is **opaque / should not be proxied** (class instances, external library objects, very large nested data) and you only want updates to trigger when you **replace** `state.value` (no deep tracking), usually used for:
75
+
76
+ - Storing external instances/handles (SDK clients, class instances) without Vue proxying internals.
77
+ - Large data where you update by replacing the root reference (immutable-style updates).
78
+
79
+ ```ts
80
+ import { shallowRef } from 'vue'
81
+
82
+ const user = shallowRef({ name: 'Alice', age: 30 })
83
+
84
+ user.value.age = 31 // ❌ not reactive
85
+ user.value = { name: 'Bob', age: 25 } // ✅ triggers update
86
+ ```
87
+
88
+ Use `shallowReactive()` when you want **only top-level properties** reactive; nested objects remain raw, usually used for:
89
+
90
+ - Container objects where only top-level keys change and nested payloads should stay unmanaged/unproxied.
91
+ - Mixed structures where Vue tracks the wrapper object, but not deeply nested or foreign objects.
92
+
93
+ ```ts
94
+ import { shallowReactive } from 'vue'
95
+
96
+ const state = shallowReactive({
97
+ count: 0,
98
+ user: { name: 'Alice', age: 30 }
99
+ })
100
+
101
+ state.count++ // ✅ reactive
102
+ state.user.age = 31 // ❌ not reactive
103
+ ```
104
+
105
+ ## Best practices for `reactive`
106
+
107
+ ### Avoid destructuring from `reactive()` directly
108
+
109
+ **BAD:**
110
+
111
+ ```ts
112
+ import { reactive } from 'vue'
113
+
114
+ const state = reactive({ count: 0 })
115
+ const { count } = state // ❌ disconnected from reactivity
116
+ ```
117
+
118
+ ### Watch correctly for reactive
119
+
120
+ **BAD:**
121
+
122
+ passing a non-getter value into `watch()`
123
+
124
+ ```ts
125
+ import { reactive, watch } from 'vue'
126
+
127
+ const state = reactive({ count: 0 })
128
+
129
+ // ❌ watch expects a getter, ref, reactive object, or array of these
130
+ watch(state.count, () => { /* ... */ })
131
+ ```
132
+
133
+ **GOOD:**
134
+
135
+ preserve reactivity with `toRefs()` and use a getter for `watch()`
136
+
137
+ ```ts
138
+ import { reactive, toRefs, watch } from 'vue'
139
+
140
+ const state = reactive({ count: 0 })
141
+ const { count } = toRefs(state) // ✅ count is a ref
142
+
143
+ watch(count, () => { /* ... */ }) // ✅
144
+ watch(() => state.count, () => { /* ... */ }) // ✅
145
+ ```
146
+
147
+ ## Best practices for `computed`
148
+
149
+ ### Prefer `computed` over watcher-assigned derived refs
150
+
151
+ **BAD:**
152
+ ```ts
153
+ import { ref, watchEffect } from 'vue'
154
+
155
+ const items = ref([{ price: 10 }, { price: 20 }])
156
+ const total = ref(0)
157
+
158
+ watchEffect(() => {
159
+ total.value = items.value.reduce((sum, item) => sum + item.price, 0)
160
+ })
161
+ ```
162
+
163
+ **GOOD:**
164
+ ```ts
165
+ import { ref, computed } from 'vue'
166
+
167
+ const items = ref([{ price: 10 }, { price: 20 }])
168
+ const total = computed(() =>
169
+ items.value.reduce((sum, item) => sum + item.price, 0)
170
+ )
171
+ ```
172
+
173
+ ### Keep filtered/sorted derivations out of templates
174
+
175
+ **BAD:**
176
+ ```vue
177
+ <template>
178
+ <li v-for="item in items.filter(item => item.active)" :key="item.id">
179
+ {{ item.name }}
180
+ </li>
181
+
182
+ <li v-for="item in getSortedItems()" :key="item.id">
183
+ {{ item.name }}
184
+ </li>
185
+ </template>
186
+
187
+ <script setup>
188
+ import { ref } from 'vue'
189
+
190
+ const items = ref([
191
+ { id: 1, name: 'B', active: true },
192
+ { id: 2, name: 'A', active: false }
193
+ ])
194
+
195
+ function getSortedItems() {
196
+ return [...items.value].sort((a, b) => a.name.localeCompare(b.name))
197
+ }
198
+ </script>
199
+ ```
200
+
201
+ **GOOD:**
202
+ ```vue
203
+ <script setup>
204
+ import { ref, computed } from 'vue'
205
+
206
+ const items = ref([
207
+ { id: 1, name: 'B', active: true },
208
+ { id: 2, name: 'A', active: false }
209
+ ])
210
+
211
+ const visibleItems = computed(() =>
212
+ items.value
213
+ .filter(item => item.active)
214
+ .sort((a, b) => a.name.localeCompare(b.name))
215
+ )
216
+ </script>
217
+
218
+ <template>
219
+ <li v-for="item in visibleItems" :key="item.id">
220
+ {{ item.name }}
221
+ </li>
222
+ </template>
223
+ ```
224
+
225
+ ### Use `computed` for reusable class/style logic
226
+
227
+ **BAD:**
228
+ ```vue
229
+ <template>
230
+ <button :class="{ btn: true, 'btn-primary': type === 'primary' && !disabled, 'btn-disabled': disabled }">
231
+ {{ label }}
232
+ </button>
233
+ </template>
234
+ ```
235
+
236
+ **GOOD:**
237
+ ```vue
238
+ <script setup>
239
+ import { computed } from 'vue'
240
+
241
+ const props = defineProps({
242
+ type: { type: String, default: 'primary' },
243
+ disabled: Boolean,
244
+ label: String
245
+ })
246
+
247
+ const buttonClasses = computed(() => ({
248
+ btn: true,
249
+ [`btn-${props.type}`]: !props.disabled,
250
+ 'btn-disabled': props.disabled
251
+ }))
252
+ </script>
253
+
254
+ <template>
255
+ <button :class="buttonClasses">
256
+ {{ label }}
257
+ </button>
258
+ </template>
259
+ ```
260
+
261
+ ### Keep computed getters pure (no side effects) and put side effects in watchers instead
262
+
263
+ A computed getter should only derive a value. No mutation, no API calls, no storage writes, no event emits.
264
+ ([Reference](https://vuejs.org/guide/essentials/computed.html#best-practices))
265
+
266
+ **BAD:**
267
+
268
+ side effects inside computed
269
+
270
+ ```ts
271
+ const count = ref(0)
272
+
273
+ const doubled = computed(() => {
274
+ // ❌ side effect
275
+ if (count.value > 10) console.warn('Too big!')
276
+ return count.value * 2
277
+ })
278
+ ```
279
+
280
+ **GOOD:**
281
+
282
+ pure computed + `watch()` for side effects
283
+
284
+ ```ts
285
+ const count = ref(0)
286
+ const doubled = computed(() => count.value * 2)
287
+
288
+ watch(count, (value) => {
289
+ if (value > 10) console.warn('Too big!')
290
+ })
291
+ ```
292
+
293
+ ## Best practices for watchers
294
+
295
+ ### Use `immediate: true` instead of duplicate initial calls
296
+
297
+ **BAD:**
298
+ ```ts
299
+ import { ref, watch, onMounted } from 'vue'
300
+
301
+ const userId = ref(1)
302
+
303
+ function loadUser(id) {
304
+ // ...
305
+ }
306
+
307
+ onMounted(() => loadUser(userId.value))
308
+ watch(userId, (id) => loadUser(id))
309
+ ```
310
+
311
+ **GOOD:**
312
+ ```ts
313
+ import { ref, watch } from 'vue'
314
+
315
+ const userId = ref(1)
316
+
317
+ watch(
318
+ userId,
319
+ (id) => loadUser(id),
320
+ { immediate: true }
321
+ )
322
+ ```
323
+
324
+ ### Clean up async effects for watchers
325
+
326
+ When reacting to rapid changes (search boxes, filters), cancel the previous request.
327
+
328
+ **GOOD:**
329
+
330
+ ```ts
331
+ const query = ref('')
332
+ const results = ref<string[]>([])
333
+
334
+ watch(query, async (q, _prev, onCleanup) => {
335
+ const controller = new AbortController()
336
+ onCleanup(() => controller.abort())
337
+
338
+ const res = await fetch(`/api/search?q=${encodeURIComponent(q)}`, {
339
+ signal: controller.signal,
340
+ })
341
+
342
+ results.value = await res.json()
343
+ })
344
+ ```
@@ -0,0 +1,201 @@
1
+ ---
2
+ title: Render Function Patterns and Performance
3
+ impact: MEDIUM
4
+ impactDescription: Render functions require explicit patterns for lists, events, v-model, and performance to stay correct and maintainable
5
+ type: best-practice
6
+ tags: [vue3, render-function, h, v-model, directives, performance, jsx]
7
+ ---
8
+
9
+ # Render Function Patterns and Performance
10
+
11
+ **Impact: MEDIUM** - Render functions are powerful but opt out of template compiler optimizations. Use them intentionally and apply the key patterns below to keep output correct and performant.
12
+
13
+ ## Task List
14
+
15
+ - Prefer templates; use render functions only when templates cannot express the logic
16
+ - Always add stable keys when rendering lists with `h()`/JSX
17
+ - Use `withModifiers` / `withKeys` for event modifiers
18
+ - Implement `v-model` via `modelValue` + `onUpdate:modelValue`
19
+ - Apply custom directives with `withDirectives`
20
+ - Use functional components for stateless presentational UI
21
+
22
+ ## Prefer templates over render functions
23
+
24
+ **BAD:**
25
+ ```vue
26
+ <script setup>
27
+ import { h, ref } from 'vue'
28
+
29
+ const count = ref(0)
30
+ const render = () => h('div', `Count: ${count.value}`)
31
+ </script>
32
+ ```
33
+
34
+ **GOOD:**
35
+ ```vue
36
+ <script setup>
37
+ import { ref } from 'vue'
38
+
39
+ const count = ref(0)
40
+ </script>
41
+
42
+ <template>
43
+ <div>Count: {{ count }}</div>
44
+ </template>
45
+ ```
46
+
47
+ ## Always add keys for list rendering
48
+
49
+ **BAD:**
50
+ ```javascript
51
+ import { h, ref } from 'vue'
52
+
53
+ export default {
54
+ setup() {
55
+ const items = ref([{ id: 1, name: 'Apple' }])
56
+
57
+ return () => h('ul',
58
+ items.value.map(item => h('li', item.name))
59
+ )
60
+ }
61
+ }
62
+ ```
63
+
64
+ **GOOD:**
65
+ ```javascript
66
+ import { h, ref } from 'vue'
67
+
68
+ export default {
69
+ setup() {
70
+ const items = ref([{ id: 1, name: 'Apple' }])
71
+
72
+ return () => h('ul',
73
+ items.value.map(item => h('li', { key: item.id }, item.name))
74
+ )
75
+ }
76
+ }
77
+ ```
78
+
79
+ ## Use `withModifiers` / `withKeys` for event modifiers
80
+
81
+ **BAD:**
82
+ ```javascript
83
+ import { h } from 'vue'
84
+
85
+ export default {
86
+ setup() {
87
+ const handleClick = (e) => {
88
+ e.stopPropagation()
89
+ e.preventDefault()
90
+ }
91
+
92
+ return () => h('button', { onClick: handleClick }, 'Click')
93
+ }
94
+ }
95
+ ```
96
+
97
+ **GOOD:**
98
+ ```javascript
99
+ import { h, withModifiers, withKeys } from 'vue'
100
+
101
+ export default {
102
+ setup() {
103
+ const handleClick = () => {}
104
+ const handleEnter = () => {}
105
+
106
+ return () => h('div', [
107
+ h('button', {
108
+ onClick: withModifiers(handleClick, ['stop', 'prevent'])
109
+ }, 'Click'),
110
+ h('input', {
111
+ onKeyup: withKeys(handleEnter, ['enter'])
112
+ })
113
+ ])
114
+ }
115
+ }
116
+ ```
117
+
118
+ ## Implement `v-model` explicitly
119
+
120
+ **BAD:**
121
+ ```javascript
122
+ import { h, ref } from 'vue'
123
+ import CustomInput from './CustomInput.vue'
124
+
125
+ export default {
126
+ setup() {
127
+ const text = ref('')
128
+ return () => h(CustomInput, { modelValue: text.value })
129
+ }
130
+ }
131
+ ```
132
+
133
+ **GOOD:**
134
+ ```javascript
135
+ import { h, ref } from 'vue'
136
+ import CustomInput from './CustomInput.vue'
137
+
138
+ export default {
139
+ setup() {
140
+ const text = ref('')
141
+ return () => h(CustomInput, {
142
+ modelValue: text.value,
143
+ 'onUpdate:modelValue': (value) => { text.value = value }
144
+ })
145
+ }
146
+ }
147
+ ```
148
+
149
+ ## Use `withDirectives` for custom directives
150
+
151
+ **BAD:**
152
+ ```javascript
153
+ import { h } from 'vue'
154
+
155
+ const vFocus = { mounted: (el) => el.focus() }
156
+
157
+ export default {
158
+ setup() {
159
+ return () => h('input', { 'v-focus': true })
160
+ }
161
+ }
162
+ ```
163
+
164
+ **GOOD:**
165
+ ```javascript
166
+ import { h, withDirectives } from 'vue'
167
+
168
+ const vFocus = { mounted: (el) => el.focus() }
169
+
170
+ export default {
171
+ setup() {
172
+ return () => withDirectives(h('input'), [[vFocus]])
173
+ }
174
+ }
175
+ ```
176
+
177
+ ## Prefer functional components for stateless UI
178
+
179
+ **BAD:**
180
+ ```javascript
181
+ import { h } from 'vue'
182
+
183
+ export default {
184
+ setup() {
185
+ return () => h('span', { class: 'badge' }, 'New')
186
+ }
187
+ }
188
+ ```
189
+
190
+ **GOOD:**
191
+ ```javascript
192
+ import { h } from 'vue'
193
+
194
+ function Badge(props, { slots }) {
195
+ return h('span', { class: 'badge' }, slots.default?.())
196
+ }
197
+
198
+ Badge.props = ['variant']
199
+
200
+ export default Badge
201
+ ```