ai-playbook 1.0.0
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.
- package/README.md +146 -0
- package/agents/README.md +168 -0
- package/agents/SKILL.md +633 -0
- package/agents/architect/AGENT.md +44 -0
- package/agents/architect/README.md +5 -0
- package/agents/coder/AGENT.md +43 -0
- package/agents/coder/README.md +5 -0
- package/agents/debugger/AGENT.md +42 -0
- package/agents/debugger/README.md +6 -0
- package/agents/devops/AGENT.md +43 -0
- package/agents/devops/README.md +5 -0
- package/agents/documentation/AGENT.md +45 -0
- package/agents/documentation/README.md +5 -0
- package/agents/examples.md +550 -0
- package/agents/performance/AGENT.md +45 -0
- package/agents/performance/README.md +6 -0
- package/agents/planner/AGENT.md +44 -0
- package/agents/planner/README.md +6 -0
- package/agents/product-owner/AGENT.md +46 -0
- package/agents/product-owner/README.md +6 -0
- package/agents/refactorer/AGENT.md +44 -0
- package/agents/refactorer/README.md +6 -0
- package/agents/release-manager/AGENT.md +45 -0
- package/agents/release-manager/README.md +6 -0
- package/agents/researcher/AGENT.md +44 -0
- package/agents/researcher/README.md +6 -0
- package/agents/reviewer/AGENT.md +43 -0
- package/agents/reviewer/README.md +6 -0
- package/agents/security/AGENT.md +46 -0
- package/agents/security/README.md +6 -0
- package/agents/support/AGENT.md +45 -0
- package/agents/support/README.md +6 -0
- package/agents/tester/AGENT.md +46 -0
- package/agents/tester/README.md +5 -0
- package/bin/cli.js +186 -0
- package/commands/README.md +266 -0
- package/commands/build.md +135 -0
- package/commands/clean.md +126 -0
- package/commands/deploy-prod.md +171 -0
- package/commands/deploy-staging.md +147 -0
- package/commands/deps.md +169 -0
- package/commands/dev.md +132 -0
- package/commands/format.md +142 -0
- package/commands/lint.md +125 -0
- package/commands/migrate.md +159 -0
- package/commands/release.md +183 -0
- package/commands/rollback.md +152 -0
- package/commands/seed.md +178 -0
- package/commands/setup.md +109 -0
- package/commands/test.md +134 -0
- package/commands/validate.md +147 -0
- package/context/README.md +7 -0
- package/context/aem.md +47 -0
- package/context/architecture.md +51 -0
- package/context/bullminder.md +57 -0
- package/context/coding-style.md +42 -0
- package/context/communication.md +53 -0
- package/context/company.md +46 -0
- package/context/engineering.md +63 -0
- package/context/project-template.md +71 -0
- package/context/trading.md +52 -0
- package/hooks/README.md +326 -0
- package/hooks/code-review/README.md +6 -0
- package/hooks/code-review/check-coverage.md +101 -0
- package/hooks/custom/README.md +6 -0
- package/hooks/custom/project-specific-hooks.md +273 -0
- package/hooks/deployment/README.md +6 -0
- package/hooks/deployment/health-check.md +102 -0
- package/hooks/deployment/pre-deploy-check.md +84 -0
- package/hooks/documentation/README.md +6 -0
- package/hooks/documentation/update-changelog.md +146 -0
- package/hooks/post-task/README.md +5 -0
- package/hooks/post-task/run-tests.md +61 -0
- package/hooks/pre-commit/README.md +6 -0
- package/hooks/pre-commit/format.md +63 -0
- package/hooks/pre-commit/lint.md +62 -0
- package/hooks/pre-commit/type-check.md +78 -0
- package/hooks/pre-task/README.md +6 -0
- package/hooks/pre-task/check-branch.md +48 -0
- package/hooks/pre-task/validate-environment.md +48 -0
- package/hooks/security-check/README.md +6 -0
- package/hooks/security-check/dependency-audit.md +85 -0
- package/hooks/security-check/secrets-scan.md +77 -0
- package/hooks/test-before-finish/README.md +6 -0
- package/hooks/test-before-finish/run-all-tests.md +128 -0
- package/index.js +69 -0
- package/knowledge/README.md +33 -0
- package/knowledge/ai-agents.md +74 -0
- package/knowledge/decision-making.md +73 -0
- package/knowledge/documentation.md +67 -0
- package/knowledge/engineering-principles.md +65 -0
- package/knowledge/product-discovery.md +68 -0
- package/knowledge/security-privacy.md +54 -0
- package/knowledge/testing-quality.md +63 -0
- package/package.json +63 -0
- package/patterns/README.md +7 -0
- package/prompts/README.md +208 -0
- package/prompts/architect/README.md +96 -0
- package/prompts/architect/design-system.md +140 -0
- package/prompts/debugger/README.md +96 -0
- package/prompts/debugger/diagnose-issue.md +141 -0
- package/prompts/developer/README.md +129 -0
- package/prompts/developer/fix-bug.md +136 -0
- package/prompts/developer/implement-feature.md +133 -0
- package/prompts/product-owner/README.md +116 -0
- package/prompts/product-owner/define-feature.md +145 -0
- package/prompts/reviewer/README.md +91 -0
- package/prompts/reviewer/code-review.md +129 -0
- package/prompts/support/README.md +154 -0
- package/prompts/support/resolve-issue.md +124 -0
- package/roles/README.md +6 -0
- package/roles/design-architect/README.md +98 -0
- package/roles/design-architect/accessibility/README.md +33 -0
- package/roles/design-architect/accessibility/checklists.md +29 -0
- package/roles/design-architect/accessibility/examples.md +35 -0
- package/roles/design-architect/checklists.md +76 -0
- package/roles/design-architect/component-library/README.md +35 -0
- package/roles/design-architect/component-library/checklists.md +29 -0
- package/roles/design-architect/component-library/examples.md +35 -0
- package/roles/design-architect/design-system/README.md +35 -0
- package/roles/design-architect/design-system/checklists.md +27 -0
- package/roles/design-architect/design-system/examples.md +41 -0
- package/roles/design-architect/examples/README.md +31 -0
- package/roles/design-architect/examples/checklists.md +26 -0
- package/roles/design-architect/examples/examples.md +46 -0
- package/roles/design-architect/examples.md +90 -0
- package/roles/design-architect/figma/README.md +33 -0
- package/roles/design-architect/figma/checklists.md +27 -0
- package/roles/design-architect/figma/examples.md +38 -0
- package/roles/design-architect/responsibilities.md +73 -0
- package/roles/design-architect/responsive/README.md +34 -0
- package/roles/design-architect/responsive/checklists.md +26 -0
- package/roles/design-architect/responsive/examples.md +39 -0
- package/roles/design-architect/role.md +129 -0
- package/roles/design-architect/skill-map.md +42 -0
- package/roles/design-architect/triggers.md +110 -0
- package/roles/design-architect/ui/README.md +36 -0
- package/roles/design-architect/ui/checklists.md +29 -0
- package/roles/design-architect/ui/examples.md +28 -0
- package/roles/design-architect/usability/README.md +34 -0
- package/roles/design-architect/usability/checklists.md +28 -0
- package/roles/design-architect/usability/examples.md +31 -0
- package/roles/design-architect/ux/README.md +36 -0
- package/roles/design-architect/ux/checklists.md +28 -0
- package/roles/design-architect/ux/examples.md +37 -0
- package/roles/design-architect/wireframes/README.md +34 -0
- package/roles/design-architect/wireframes/checklists.md +25 -0
- package/roles/design-architect/wireframes/examples.md +32 -0
- package/roles/design-architect/workflow.md +80 -0
- package/roles/devops/README.md +101 -0
- package/roles/devops/ansible/README.md +6 -0
- package/roles/devops/checklists.md +413 -0
- package/roles/devops/ci-cd/README.md +169 -0
- package/roles/devops/ci-cd/checklists.md +289 -0
- package/roles/devops/ci-cd/examples.md +429 -0
- package/roles/devops/cloud-platforms/README.md +109 -0
- package/roles/devops/cost-optimization/README.md +131 -0
- package/roles/devops/disaster-recovery/README.md +118 -0
- package/roles/devops/docker/README.md +6 -0
- package/roles/devops/examples/README.md +6 -0
- package/roles/devops/examples.md +775 -0
- package/roles/devops/github-actions/README.md +6 -0
- package/roles/devops/helm/README.md +6 -0
- package/roles/devops/infrastructure-as-code/README.md +160 -0
- package/roles/devops/infrastructure-as-code/checklists.md +124 -0
- package/roles/devops/jenkins/README.md +6 -0
- package/roles/devops/kubernetes/README.md +150 -0
- package/roles/devops/kubernetes/checklists.md +192 -0
- package/roles/devops/kubernetes/examples.md +189 -0
- package/roles/devops/monitoring/README.md +93 -0
- package/roles/devops/networking/README.md +83 -0
- package/roles/devops/performance/README.md +104 -0
- package/roles/devops/responsibilities.md +95 -0
- package/roles/devops/role.md +130 -0
- package/roles/devops/security/README.md +126 -0
- package/roles/devops/skill-map.md +162 -0
- package/roles/devops/terraform/README.md +6 -0
- package/roles/devops/triggers.md +241 -0
- package/roles/devops/workflow.md +197 -0
- package/roles/qa/README.md +16 -0
- package/roles/qa/api-testing/README.md +6 -0
- package/roles/qa/automation/README.md +6 -0
- package/roles/qa/checklists.md +24 -0
- package/roles/qa/examples/README.md +6 -0
- package/roles/qa/examples.md +27 -0
- package/roles/qa/performance/README.md +6 -0
- package/roles/qa/playwright/README.md +6 -0
- package/roles/qa/responsibilities.md +16 -0
- package/roles/qa/role.md +47 -0
- package/roles/qa/selenium/README.md +6 -0
- package/roles/qa/skill-map.md +14 -0
- package/roles/qa/triggers.md +10 -0
- package/roles/qa/workflow.md +9 -0
- package/roles/software-architect/README.md +16 -0
- package/roles/software-architect/agents/README.md +6 -0
- package/roles/software-architect/ai-architecture/README.md +6 -0
- package/roles/software-architect/aws/README.md +6 -0
- package/roles/software-architect/azure/README.md +6 -0
- package/roles/software-architect/caching/README.md +6 -0
- package/roles/software-architect/checklists.md +25 -0
- package/roles/software-architect/cloud/README.md +6 -0
- package/roles/software-architect/database-design/README.md +6 -0
- package/roles/software-architect/diagrams/README.md +6 -0
- package/roles/software-architect/distributed-systems/README.md +7 -0
- package/roles/software-architect/docker/README.md +6 -0
- package/roles/software-architect/event-driven/README.md +7 -0
- package/roles/software-architect/examples/README.md +6 -0
- package/roles/software-architect/examples.md +22 -0
- package/roles/software-architect/gcp/README.md +6 -0
- package/roles/software-architect/kubernetes/README.md +6 -0
- package/roles/software-architect/messaging/README.md +6 -0
- package/roles/software-architect/rag/README.md +7 -0
- package/roles/software-architect/responsibilities.md +17 -0
- package/roles/software-architect/role.md +46 -0
- package/roles/software-architect/scalability/README.md +6 -0
- package/roles/software-architect/security/README.md +6 -0
- package/roles/software-architect/skill-map.md +15 -0
- package/roles/software-architect/system-design/README.md +6 -0
- package/roles/software-architect/triggers.md +10 -0
- package/roles/software-architect/vector-db/README.md +6 -0
- package/roles/software-architect/workflow.md +9 -0
- package/roles/software-developer/README.md +116 -0
- package/roles/software-developer/api/README.md +365 -0
- package/roles/software-developer/api/checklist.md +131 -0
- package/roles/software-developer/api/examples.md +459 -0
- package/roles/software-developer/authentication/README.md +26 -0
- package/roles/software-developer/authentication/checklists.md +22 -0
- package/roles/software-developer/authentication/examples.md +32 -0
- package/roles/software-developer/authorization/README.md +26 -0
- package/roles/software-developer/authorization/checklists.md +21 -0
- package/roles/software-developer/authorization/examples.md +27 -0
- package/roles/software-developer/backend/README.md +26 -0
- package/roles/software-developer/backend/checklists.md +21 -0
- package/roles/software-developer/backend/examples.md +21 -0
- package/roles/software-developer/cache/README.md +25 -0
- package/roles/software-developer/cache/checklists.md +21 -0
- package/roles/software-developer/cache/examples.md +22 -0
- package/roles/software-developer/checklists.md +122 -0
- package/roles/software-developer/code-review/README.md +23 -0
- package/roles/software-developer/code-review/checklists.md +22 -0
- package/roles/software-developer/code-review/examples.md +20 -0
- package/roles/software-developer/database/README.md +27 -0
- package/roles/software-developer/database/checklists.md +21 -0
- package/roles/software-developer/database/examples.md +27 -0
- package/roles/software-developer/debugging/README.md +24 -0
- package/roles/software-developer/debugging/checklists.md +20 -0
- package/roles/software-developer/debugging/examples.md +28 -0
- package/roles/software-developer/examples/README.md +22 -0
- package/roles/software-developer/examples/checklists.md +8 -0
- package/roles/software-developer/examples/examples.md +25 -0
- package/roles/software-developer/examples.md +378 -0
- package/roles/software-developer/frontend/README.md +76 -0
- package/roles/software-developer/frontend/accessibility/README.md +136 -0
- package/roles/software-developer/frontend/accessibility/best-practices.md +368 -0
- package/roles/software-developer/frontend/code-quality/README.md +136 -0
- package/roles/software-developer/frontend/code-quality/best-practices.md +309 -0
- package/roles/software-developer/frontend/components/README.md +65 -0
- package/roles/software-developer/frontend/components/best-practices.md +273 -0
- package/roles/software-developer/frontend/debugging/README.md +149 -0
- package/roles/software-developer/frontend/debugging/best-practices.md +329 -0
- package/roles/software-developer/frontend/examples/README.md +19 -0
- package/roles/software-developer/frontend/examples/checklists.md +8 -0
- package/roles/software-developer/frontend/examples/examples.md +17 -0
- package/roles/software-developer/frontend/logging-observability/README.md +196 -0
- package/roles/software-developer/frontend/logging-observability/best-practices.md +430 -0
- package/roles/software-developer/frontend/performance/README.md +99 -0
- package/roles/software-developer/frontend/performance/best-practices.md +350 -0
- package/roles/software-developer/frontend/state-management/README.md +85 -0
- package/roles/software-developer/frontend/state-management/best-practices.md +344 -0
- package/roles/software-developer/frontend/testing/README.md +114 -0
- package/roles/software-developer/frontend/testing/best-practices.md +272 -0
- package/roles/software-developer/fullstack/README.md +25 -0
- package/roles/software-developer/fullstack/checklists.md +19 -0
- package/roles/software-developer/fullstack/examples.md +14 -0
- package/roles/software-developer/graphql/README.md +24 -0
- package/roles/software-developer/graphql/checklists.md +20 -0
- package/roles/software-developer/graphql/examples.md +24 -0
- package/roles/software-developer/integration-tests/README.md +25 -0
- package/roles/software-developer/integration-tests/checklists.md +20 -0
- package/roles/software-developer/integration-tests/examples.md +18 -0
- package/roles/software-developer/java/README.md +24 -0
- package/roles/software-developer/java/checklists.md +16 -0
- package/roles/software-developer/java/examples.md +22 -0
- package/roles/software-developer/javascript/README.md +24 -0
- package/roles/software-developer/javascript/checklists.md +15 -0
- package/roles/software-developer/javascript/examples.md +18 -0
- package/roles/software-developer/logging/README.md +105 -0
- package/roles/software-developer/logging/checklists.md +48 -0
- package/roles/software-developer/logging/examples.md +135 -0
- package/roles/software-developer/messaging/README.md +24 -0
- package/roles/software-developer/messaging/checklists.md +21 -0
- package/roles/software-developer/messaging/examples.md +26 -0
- package/roles/software-developer/microservices/README.md +25 -0
- package/roles/software-developer/microservices/checklists.md +21 -0
- package/roles/software-developer/microservices/examples.md +21 -0
- package/roles/software-developer/node/README.md +25 -0
- package/roles/software-developer/node/checklists.md +15 -0
- package/roles/software-developer/node/examples.md +15 -0
- package/roles/software-developer/nosql/README.md +24 -0
- package/roles/software-developer/nosql/checklists.md +21 -0
- package/roles/software-developer/nosql/examples.md +20 -0
- package/roles/software-developer/observability/README.md +25 -0
- package/roles/software-developer/observability/checklists.md +21 -0
- package/roles/software-developer/observability/examples.md +22 -0
- package/roles/software-developer/performance/README.md +26 -0
- package/roles/software-developer/performance/checklists.md +20 -0
- package/roles/software-developer/performance/examples.md +20 -0
- package/roles/software-developer/python/README.md +25 -0
- package/roles/software-developer/python/checklists.md +15 -0
- package/roles/software-developer/python/examples.md +17 -0
- package/roles/software-developer/react/README.md +24 -0
- package/roles/software-developer/react/checklists.md +15 -0
- package/roles/software-developer/react/examples.md +22 -0
- package/roles/software-developer/refactoring/README.md +23 -0
- package/roles/software-developer/refactoring/checklists.md +21 -0
- package/roles/software-developer/refactoring/examples.md +11 -0
- package/roles/software-developer/responsibilities.md +58 -0
- package/roles/software-developer/role.md +127 -0
- package/roles/software-developer/skill-map.md +88 -0
- package/roles/software-developer/springboot/README.md +25 -0
- package/roles/software-developer/springboot/checklists.md +15 -0
- package/roles/software-developer/springboot/examples.md +21 -0
- package/roles/software-developer/sql/README.md +24 -0
- package/roles/software-developer/sql/checklists.md +22 -0
- package/roles/software-developer/sql/examples.md +20 -0
- package/roles/software-developer/testing/README.md +25 -0
- package/roles/software-developer/testing/checklists.md +21 -0
- package/roles/software-developer/testing/examples.md +19 -0
- package/roles/software-developer/triggers.md +550 -0
- package/roles/software-developer/typescript/README.md +25 -0
- package/roles/software-developer/typescript/checklists.md +15 -0
- package/roles/software-developer/typescript/examples.md +18 -0
- package/roles/software-developer/unit-tests/README.md +24 -0
- package/roles/software-developer/unit-tests/checklists.md +19 -0
- package/roles/software-developer/unit-tests/examples.md +22 -0
- package/roles/software-developer/workflow.md +196 -0
- package/roles/sre/README.md +16 -0
- package/roles/sre/alerts/README.md +6 -0
- package/roles/sre/availability/README.md +6 -0
- package/roles/sre/chaos/README.md +6 -0
- package/roles/sre/checklists.md +24 -0
- package/roles/sre/examples/README.md +6 -0
- package/roles/sre/examples.md +19 -0
- package/roles/sre/observability/README.md +6 -0
- package/roles/sre/reliability/README.md +6 -0
- package/roles/sre/responsibilities.md +16 -0
- package/roles/sre/role.md +46 -0
- package/roles/sre/skill-map.md +14 -0
- package/roles/sre/slos/README.md +6 -0
- package/roles/sre/triggers.md +10 -0
- package/roles/sre/workflow.md +9 -0
- package/roles/support-engineer/README.md +16 -0
- package/roles/support-engineer/checklists.md +24 -0
- package/roles/support-engineer/datadog/README.md +6 -0
- package/roles/support-engineer/examples/README.md +6 -0
- package/roles/support-engineer/examples.md +17 -0
- package/roles/support-engineer/incident-response/README.md +6 -0
- package/roles/support-engineer/kubernetes/README.md +6 -0
- package/roles/support-engineer/linux/README.md +6 -0
- package/roles/support-engineer/logs/README.md +6 -0
- package/roles/support-engineer/monitoring/README.md +6 -0
- package/roles/support-engineer/networking/README.md +6 -0
- package/roles/support-engineer/newrelic/README.md +6 -0
- package/roles/support-engineer/postmortem/README.md +6 -0
- package/roles/support-engineer/production/README.md +6 -0
- package/roles/support-engineer/responsibilities.md +16 -0
- package/roles/support-engineer/role.md +47 -0
- package/roles/support-engineer/root-cause-analysis/README.md +6 -0
- package/roles/support-engineer/runbooks/README.md +6 -0
- package/roles/support-engineer/skill-map.md +14 -0
- package/roles/support-engineer/splunk/README.md +6 -0
- package/roles/support-engineer/triggers.md +10 -0
- package/roles/support-engineer/troubleshooting/README.md +6 -0
- package/roles/support-engineer/workflow.md +9 -0
- package/setup.sh +204 -0
- package/skills/.claude/README.md +7 -0
- package/skills/README.md +21 -0
- package/skills/ai-agents/README.md +207 -0
- package/skills/ai-agents/examples.md +335 -0
- package/skills/ai-agents/skill.md +392 -0
- package/skills/architecture/README.md +198 -0
- package/skills/architecture/examples.md +316 -0
- package/skills/architecture/skill.md +189 -0
- package/skills/design-architecture/README.md +107 -0
- package/skills/design-architecture/examples.md +84 -0
- package/skills/design-architecture/skill.md +192 -0
- package/skills/devops/README.md +177 -0
- package/skills/devops/examples.md +376 -0
- package/skills/devops/skill.md +210 -0
- package/skills/documentation/README.md +182 -0
- package/skills/documentation/examples.md +364 -0
- package/skills/documentation/skill.md +200 -0
- package/skills/performance/README.md +177 -0
- package/skills/performance/examples.md +376 -0
- package/skills/performance/skill.md +199 -0
- package/skills/qa/README.md +106 -0
- package/skills/qa/examples.md +84 -0
- package/skills/qa/skill.md +384 -0
- package/skills/security/README.md +108 -0
- package/skills/security/examples.md +85 -0
- package/skills/security/skill.md +223 -0
- package/skills/software-development/README.md +239 -0
- package/skills/software-development/assessment.md +0 -0
- package/skills/software-development/checklists.md +0 -0
- package/skills/software-development/examples.md +375 -0
- package/skills/software-development/prompts.md +0 -0
- package/skills/software-development/skill.md +390 -0
- package/skills/software-development/templates/README.md +7 -0
- package/skills/software-development/templates/api-development.md +0 -0
- package/skills/software-development/templates/bug-fix.md +0 -0
- package/skills/software-development/templates/code-review.md +0 -0
- package/skills/software-development/templates/feature-implementation.md +0 -0
- package/skills/software-development/templates/llm-integration.md +0 -0
- package/skills/software-development/templates/performance-review.md +0 -0
- package/skills/software-development/templates/security-review.md +0 -0
- package/skills/software-development/templates/test-generation.md +0 -0
- package/skills/software-development/tools.md +0 -0
- package/skills/software-development/workflows.md +0 -0
- package/skills/sre/README.md +107 -0
- package/skills/sre/examples.md +379 -0
- package/skills/sre/skill.md +256 -0
- package/skills/support-engineering/README.md +107 -0
- package/skills/support-engineering/examples.md +85 -0
- package/skills/support-engineering/skill.md +103 -0
|
@@ -0,0 +1,350 @@
|
|
|
1
|
+
# Performance: Best Practices
|
|
2
|
+
|
|
3
|
+
Performance matters for user experience and business metrics. This guide covers how to identify bottlenecks and optimize strategically.
|
|
4
|
+
|
|
5
|
+
## Measure First
|
|
6
|
+
|
|
7
|
+
Never optimize without data. Measurement prevents wasting time on non-problems.
|
|
8
|
+
|
|
9
|
+
```javascript
|
|
10
|
+
// BAD: Premature optimization
|
|
11
|
+
function Component() {
|
|
12
|
+
// Guess: rendering might be slow, so memoize
|
|
13
|
+
const expensiveCalculation = useMemo(() => {
|
|
14
|
+
return someSimpleArray.length;
|
|
15
|
+
}, [someSimpleArray]);
|
|
16
|
+
|
|
17
|
+
// This optimization does nothing - adding complexity
|
|
18
|
+
}
|
|
19
|
+
|
|
20
|
+
// GOOD: Measure first, then optimize
|
|
21
|
+
function Component() {
|
|
22
|
+
// Add monitoring
|
|
23
|
+
const startTime = performance.now();
|
|
24
|
+
|
|
25
|
+
const result = expensiveCalculation(data);
|
|
26
|
+
|
|
27
|
+
const duration = performance.now() - startTime;
|
|
28
|
+
if (duration > 100) {
|
|
29
|
+
console.warn(`Slow operation: ${duration}ms`);
|
|
30
|
+
}
|
|
31
|
+
|
|
32
|
+
return <div>{result}</div>;
|
|
33
|
+
}
|
|
34
|
+
|
|
35
|
+
// Once you confirm it's slow, optimize:
|
|
36
|
+
function Component() {
|
|
37
|
+
const result = useMemo(
|
|
38
|
+
() => expensiveCalculation(data),
|
|
39
|
+
[data]
|
|
40
|
+
);
|
|
41
|
+
|
|
42
|
+
return <div>{result}</div>;
|
|
43
|
+
}
|
|
44
|
+
|
|
45
|
+
// Use Chrome DevTools Performance tab to identify bottlenecks
|
|
46
|
+
// Use React DevTools Profiler to measure component render times
|
|
47
|
+
```
|
|
48
|
+
|
|
49
|
+
## Code Splitting
|
|
50
|
+
|
|
51
|
+
Load code only when needed. This is especially important for large applications.
|
|
52
|
+
|
|
53
|
+
```javascript
|
|
54
|
+
// BAD: Single large bundle (e.g., 500KB)
|
|
55
|
+
import AdminPanel from './admin/AdminPanel';
|
|
56
|
+
import Dashboard from './dashboard/Dashboard';
|
|
57
|
+
import Settings from './settings/Settings';
|
|
58
|
+
|
|
59
|
+
function App() {
|
|
60
|
+
return user.isAdmin ? <AdminPanel /> : <Dashboard />;
|
|
61
|
+
}
|
|
62
|
+
// Downloads AdminPanel even if user is not admin
|
|
63
|
+
|
|
64
|
+
// GOOD: Load admin panel only when needed
|
|
65
|
+
import Dashboard from './dashboard/Dashboard';
|
|
66
|
+
const AdminPanel = lazy(() => import('./admin/AdminPanel'));
|
|
67
|
+
|
|
68
|
+
function App() {
|
|
69
|
+
return (
|
|
70
|
+
<Suspense fallback={<div>Loading...</div>}>
|
|
71
|
+
{user.isAdmin ? <AdminPanel /> : <Dashboard />}
|
|
72
|
+
</Suspense>
|
|
73
|
+
);
|
|
74
|
+
}
|
|
75
|
+
|
|
76
|
+
// Route-based code splitting (most effective)
|
|
77
|
+
const Home = lazy(() => import('./pages/Home'));
|
|
78
|
+
const About = lazy(() => import('./pages/About'));
|
|
79
|
+
|
|
80
|
+
function App() {
|
|
81
|
+
return (
|
|
82
|
+
<Router>
|
|
83
|
+
<Suspense fallback={<div>Loading...</div>}>
|
|
84
|
+
<Routes>
|
|
85
|
+
<Route path="/" element={<Home />} />
|
|
86
|
+
<Route path="/about" element={<About />} />
|
|
87
|
+
</Routes>
|
|
88
|
+
</Suspense>
|
|
89
|
+
</Router>
|
|
90
|
+
);
|
|
91
|
+
}
|
|
92
|
+
```
|
|
93
|
+
|
|
94
|
+
## Memoization When It Matters
|
|
95
|
+
|
|
96
|
+
Only memoize when you have data showing the optimization helps.
|
|
97
|
+
|
|
98
|
+
```javascript
|
|
99
|
+
// BAD: Premature memoization
|
|
100
|
+
const Button = React.memo(({ label }) => {
|
|
101
|
+
return <button>{label}</button>;
|
|
102
|
+
});
|
|
103
|
+
|
|
104
|
+
// GOOD: Memoize when:
|
|
105
|
+
// 1. Receives objects/functions that change on every render
|
|
106
|
+
// 2. Expensive render logic
|
|
107
|
+
|
|
108
|
+
function Parent() {
|
|
109
|
+
const [count, setCount] = useState(0);
|
|
110
|
+
|
|
111
|
+
// handleClick is recreated on every render
|
|
112
|
+
const handleClick = () => setCount(count + 1);
|
|
113
|
+
|
|
114
|
+
// Passing new function to memoized child defeats the purpose
|
|
115
|
+
return <Button onClick={handleClick} label="Click" />;
|
|
116
|
+
}
|
|
117
|
+
|
|
118
|
+
// FIX: Use useCallback to maintain referential equality
|
|
119
|
+
function Parent() {
|
|
120
|
+
const [count, setCount] = useState(0);
|
|
121
|
+
|
|
122
|
+
const handleClick = useCallback(() => {
|
|
123
|
+
setCount(count + 1);
|
|
124
|
+
}, [count]);
|
|
125
|
+
|
|
126
|
+
return (
|
|
127
|
+
<MemoButton onClick={handleClick} label="Click" />
|
|
128
|
+
);
|
|
129
|
+
}
|
|
130
|
+
|
|
131
|
+
const MemoButton = React.memo(({ onClick, label }) => {
|
|
132
|
+
return <button onClick={onClick}>{label}</button>;
|
|
133
|
+
});
|
|
134
|
+
```
|
|
135
|
+
|
|
136
|
+
## Virtual Lists for Large Data
|
|
137
|
+
|
|
138
|
+
Don't render thousands of items. Render only visible ones.
|
|
139
|
+
|
|
140
|
+
```javascript
|
|
141
|
+
// BAD: Render 10,000 items (browser freezes)
|
|
142
|
+
function ItemList({ items }) {
|
|
143
|
+
return (
|
|
144
|
+
<ul>
|
|
145
|
+
{items.map(item => (
|
|
146
|
+
<li key={item.id}>{item.name}</li>
|
|
147
|
+
))}
|
|
148
|
+
</ul>
|
|
149
|
+
);
|
|
150
|
+
}
|
|
151
|
+
|
|
152
|
+
const items = Array.from({ length: 10000 }, (_, i) => ({
|
|
153
|
+
id: i,
|
|
154
|
+
name: `Item ${i}`
|
|
155
|
+
}));
|
|
156
|
+
|
|
157
|
+
render(<ItemList items={items} />); // Freezes
|
|
158
|
+
|
|
159
|
+
// GOOD: Virtual list (render only visible items)
|
|
160
|
+
import { FixedSizeList } from 'react-window';
|
|
161
|
+
|
|
162
|
+
function ItemList({ items }) {
|
|
163
|
+
return (
|
|
164
|
+
<FixedSizeList
|
|
165
|
+
height={600}
|
|
166
|
+
itemCount={items.length}
|
|
167
|
+
itemSize={35}
|
|
168
|
+
width="100%"
|
|
169
|
+
>
|
|
170
|
+
{({ index, style }) => (
|
|
171
|
+
<div style={style}>
|
|
172
|
+
{items[index].name}
|
|
173
|
+
</div>
|
|
174
|
+
)}
|
|
175
|
+
</FixedSizeList>
|
|
176
|
+
);
|
|
177
|
+
}
|
|
178
|
+
|
|
179
|
+
// With 10,000 items, only ~20 are rendered at a time
|
|
180
|
+
```
|
|
181
|
+
|
|
182
|
+
## API Response Caching
|
|
183
|
+
|
|
184
|
+
Cache data to avoid redundant requests.
|
|
185
|
+
|
|
186
|
+
```javascript
|
|
187
|
+
// BAD: Refetch same data repeatedly
|
|
188
|
+
function useUser(userId) {
|
|
189
|
+
const [user, setUser] = useState(null);
|
|
190
|
+
|
|
191
|
+
useEffect(() => {
|
|
192
|
+
// Fetches even if userId hasn't changed
|
|
193
|
+
fetch(`/api/users/${userId}`)
|
|
194
|
+
.then(r => r.json())
|
|
195
|
+
.then(setUser);
|
|
196
|
+
}, [userId]); // Missing dependencies could cause issues
|
|
197
|
+
|
|
198
|
+
return user;
|
|
199
|
+
}
|
|
200
|
+
|
|
201
|
+
// GOOD: Simple cache
|
|
202
|
+
const userCache = new Map();
|
|
203
|
+
|
|
204
|
+
function useUser(userId) {
|
|
205
|
+
const [user, setUser] = useState(null);
|
|
206
|
+
|
|
207
|
+
useEffect(() => {
|
|
208
|
+
if (userCache.has(userId)) {
|
|
209
|
+
setUser(userCache.get(userId));
|
|
210
|
+
return;
|
|
211
|
+
}
|
|
212
|
+
|
|
213
|
+
fetch(`/api/users/${userId}`)
|
|
214
|
+
.then(r => r.json())
|
|
215
|
+
.then(data => {
|
|
216
|
+
userCache.set(userId, data);
|
|
217
|
+
setUser(data);
|
|
218
|
+
});
|
|
219
|
+
}, [userId]);
|
|
220
|
+
|
|
221
|
+
return user;
|
|
222
|
+
}
|
|
223
|
+
|
|
224
|
+
// BETTER: Cache with TTL
|
|
225
|
+
function useCachedUser(userId, ttl = 5 * 60 * 1000) {
|
|
226
|
+
const [user, setUser] = useState(null);
|
|
227
|
+
|
|
228
|
+
useEffect(() => {
|
|
229
|
+
const cached = userCache.get(userId);
|
|
230
|
+
if (cached && Date.now() - cached.timestamp < ttl) {
|
|
231
|
+
setUser(cached.data);
|
|
232
|
+
return;
|
|
233
|
+
}
|
|
234
|
+
|
|
235
|
+
fetch(`/api/users/${userId}`)
|
|
236
|
+
.then(r => r.json())
|
|
237
|
+
.then(data => {
|
|
238
|
+
userCache.set(userId, { data, timestamp: Date.now() });
|
|
239
|
+
setUser(data);
|
|
240
|
+
});
|
|
241
|
+
}, [userId, ttl]);
|
|
242
|
+
|
|
243
|
+
return user;
|
|
244
|
+
}
|
|
245
|
+
```
|
|
246
|
+
|
|
247
|
+
## Network Optimization
|
|
248
|
+
|
|
249
|
+
Minimize network requests and payload size.
|
|
250
|
+
|
|
251
|
+
```javascript
|
|
252
|
+
// BAD: Multiple requests
|
|
253
|
+
function Dashboard() {
|
|
254
|
+
const [user, setUser] = useState(null);
|
|
255
|
+
const [stats, setStats] = useState(null);
|
|
256
|
+
const [settings, setSettings] = useState(null);
|
|
257
|
+
|
|
258
|
+
useEffect(() => {
|
|
259
|
+
fetch('/api/user').then(r => r.json()).then(setUser);
|
|
260
|
+
fetch('/api/stats').then(r => r.json()).then(setStats);
|
|
261
|
+
fetch('/api/settings').then(r => r.json()).then(setSettings);
|
|
262
|
+
}, []);
|
|
263
|
+
// 3 requests when 1 would do
|
|
264
|
+
}
|
|
265
|
+
|
|
266
|
+
// GOOD: Single combined request
|
|
267
|
+
function Dashboard() {
|
|
268
|
+
const [data, setData] = useState(null);
|
|
269
|
+
|
|
270
|
+
useEffect(() => {
|
|
271
|
+
// Server returns combined data in one request
|
|
272
|
+
fetch('/api/dashboard').then(r => r.json()).then(setData);
|
|
273
|
+
}, []);
|
|
274
|
+
|
|
275
|
+
return data ? (
|
|
276
|
+
<>
|
|
277
|
+
<User data={data.user} />
|
|
278
|
+
<Stats data={data.stats} />
|
|
279
|
+
<Settings data={data.settings} />
|
|
280
|
+
</>
|
|
281
|
+
) : null;
|
|
282
|
+
}
|
|
283
|
+
|
|
284
|
+
// Use compression (gzip/brotli) - server config
|
|
285
|
+
// Minimize payload size: only return necessary fields
|
|
286
|
+
// Use image optimization: lazy load, responsive images
|
|
287
|
+
```
|
|
288
|
+
|
|
289
|
+
## Monitoring Performance
|
|
290
|
+
|
|
291
|
+
Track performance in production.
|
|
292
|
+
|
|
293
|
+
```javascript
|
|
294
|
+
// Log Core Web Vitals
|
|
295
|
+
function reportWebVitals() {
|
|
296
|
+
// Largest Contentful Paint
|
|
297
|
+
const observer = new PerformanceObserver((list) => {
|
|
298
|
+
const entries = list.getEntries();
|
|
299
|
+
const lastEntry = entries[entries.length - 1];
|
|
300
|
+
console.log('LCP:', lastEntry.startTime);
|
|
301
|
+
});
|
|
302
|
+
observer.observe({ entryTypes: ['largest-contentful-paint'] });
|
|
303
|
+
|
|
304
|
+
// Cumulative Layout Shift
|
|
305
|
+
let cls = 0;
|
|
306
|
+
const clsObserver = new PerformanceObserver((list) => {
|
|
307
|
+
for (const entry of list.getEntries()) {
|
|
308
|
+
if (!entry.hadRecentInput) {
|
|
309
|
+
cls += entry.value;
|
|
310
|
+
}
|
|
311
|
+
}
|
|
312
|
+
console.log('CLS:', cls);
|
|
313
|
+
});
|
|
314
|
+
clsObserver.observe({ entryTypes: ['layout-shift'] });
|
|
315
|
+
}
|
|
316
|
+
|
|
317
|
+
// Track custom metrics
|
|
318
|
+
function trackAPILatency(endpoint, duration) {
|
|
319
|
+
analytics.track('api_latency', {
|
|
320
|
+
endpoint,
|
|
321
|
+
duration_ms: duration,
|
|
322
|
+
timestamp: new Date().toISOString()
|
|
323
|
+
});
|
|
324
|
+
|
|
325
|
+
// Alert if slow
|
|
326
|
+
if (duration > 1000) {
|
|
327
|
+
console.warn(`Slow API call: ${endpoint} took ${duration}ms`);
|
|
328
|
+
}
|
|
329
|
+
}
|
|
330
|
+
```
|
|
331
|
+
|
|
332
|
+
## Performance Best Practices Checklist
|
|
333
|
+
|
|
334
|
+
- [ ] Measured performance before optimizing
|
|
335
|
+
- [ ] Code splitting used for large bundles
|
|
336
|
+
- [ ] Memoization only applied where beneficial (with data)
|
|
337
|
+
- [ ] Virtual lists used for large data sets
|
|
338
|
+
- [ ] API responses cached appropriately
|
|
339
|
+
- [ ] Unnecessary network requests eliminated
|
|
340
|
+
- [ ] Images optimized and lazy-loaded
|
|
341
|
+
- [ ] Bundle size monitored and controlled
|
|
342
|
+
- [ ] Performance metrics tracked in production
|
|
343
|
+
- [ ] No performance regressions introduced
|
|
344
|
+
|
|
345
|
+
## Related Guidance
|
|
346
|
+
|
|
347
|
+
- `/code-quality` — clean code that's easier to optimize
|
|
348
|
+
- `/debugging` — profiling and identifying bottlenecks
|
|
349
|
+
- `/tools-setup` — performance measurement tools
|
|
350
|
+
- `/logging-observability` — monitoring in production
|
|
@@ -0,0 +1,85 @@
|
|
|
1
|
+
# State Management
|
|
2
|
+
|
|
3
|
+
Senior frontend developers manage state predictably, minimize it, and make data flow explicit.
|
|
4
|
+
|
|
5
|
+
## Core Principles
|
|
6
|
+
|
|
7
|
+
- **Minimize State** — only what's necessary to render
|
|
8
|
+
- **Explicit Flow** — clear data flow from source to consumer
|
|
9
|
+
- **Immutability** — state changes create new objects, not mutations
|
|
10
|
+
- **Single Source of Truth** — avoid duplicating state
|
|
11
|
+
- **Predictability** — given same state + action, same result always
|
|
12
|
+
|
|
13
|
+
## State Categories
|
|
14
|
+
|
|
15
|
+
### Component State (Local)
|
|
16
|
+
- Form inputs, UI toggles, modals
|
|
17
|
+
- Use component state, hooks (useState)
|
|
18
|
+
- Not shared across components
|
|
19
|
+
- Simplest, preferred when isolated
|
|
20
|
+
|
|
21
|
+
### Shared State (Global/Context)
|
|
22
|
+
- Authentication, theme, user preferences
|
|
23
|
+
- Shared across many components
|
|
24
|
+
- Use context, state management libraries
|
|
25
|
+
- Keep minimal, only truly global data
|
|
26
|
+
|
|
27
|
+
### Server State (Remote)
|
|
28
|
+
- Data from API, database
|
|
29
|
+
- May be stale, needs sync
|
|
30
|
+
- Separate from UI state
|
|
31
|
+
- Cache invalidation critical
|
|
32
|
+
|
|
33
|
+
### Derived State
|
|
34
|
+
- Computed from other state (totals, filters)
|
|
35
|
+
- Don't store separately; compute on demand
|
|
36
|
+
- Reduces bugs from state inconsistency
|
|
37
|
+
|
|
38
|
+
## State Management Patterns
|
|
39
|
+
|
|
40
|
+
### Redux / Flux Pattern
|
|
41
|
+
- Centralized store, actions, reducers
|
|
42
|
+
- Predictable, debuggable
|
|
43
|
+
- More boilerplate for simple cases
|
|
44
|
+
- Good for complex apps with many interactions
|
|
45
|
+
|
|
46
|
+
### Context API
|
|
47
|
+
- Built-in React solution
|
|
48
|
+
- Good for global UI state
|
|
49
|
+
- Not ideal for frequently-changing data
|
|
50
|
+
- Simpler than Redux for small state
|
|
51
|
+
|
|
52
|
+
### Hooks (useState, useReducer, useContext)
|
|
53
|
+
- Modern React approach
|
|
54
|
+
- Manage local and shared state
|
|
55
|
+
- Composable, reusable logic
|
|
56
|
+
- Preferred for new code
|
|
57
|
+
|
|
58
|
+
### External Libraries (Zustand, Jotai, Recoil)
|
|
59
|
+
- Lighter than Redux
|
|
60
|
+
- Less boilerplate
|
|
61
|
+
- Good middle ground
|
|
62
|
+
|
|
63
|
+
## Data Fetching & Caching
|
|
64
|
+
|
|
65
|
+
- Fetch on mount, cache result
|
|
66
|
+
- Refetch on demand (user action, interval)
|
|
67
|
+
- Invalidate cache when data changes
|
|
68
|
+
- Handle loading/error states explicitly
|
|
69
|
+
- Consider libraries: React Query, SWR for this
|
|
70
|
+
|
|
71
|
+
## Anti-Patterns
|
|
72
|
+
|
|
73
|
+
- Prop drilling (pass through 3+ levels)
|
|
74
|
+
- Duplicating state in multiple places
|
|
75
|
+
- Storing derived state
|
|
76
|
+
- Mutating state directly
|
|
77
|
+
- Global state for everything
|
|
78
|
+
- Race conditions in async state updates
|
|
79
|
+
- Not handling error/loading states
|
|
80
|
+
|
|
81
|
+
## Related Guidance
|
|
82
|
+
|
|
83
|
+
- `/components` — how state flows through components
|
|
84
|
+
- `/logging-observability` — tracking state changes
|
|
85
|
+
- `/testing` — testing state mutations
|