dist/codex/salesforce-commerce/skills/sf-performance/SKILL.md
Optimize Salesforce Commerce performance — B2C (cartridge caching, CDN configuration, ISML rendering optimization, lazy loading) and B2B (SOQL optimization, LWC lazy loading, Apex bulkification). Both platforms target Core Web Vitals and image optimization.
npx skillsauth add orcaqubits/agentic-commerce-claude-plugins sf-performanceInstall this skill globally with one command. Works with Claude Code, Cursor, and Windsurf.
3 of 9 scanners reported clean
Some scanners were skipped, did not run, or reported a non-clean status. Review each row below.
Optimize Salesforce Commerce performance across B2C Commerce (SFCC) and B2B Commerce Cloud platforms.
Always fetch live documentation first:
B2C Commerce Performance
B2B Commerce Performance
developer.salesforce.com/docs/component-library/documentation/en/lwc/lwc.reference_performanceCore Web Vitals
web.dev/vitals/| Level | Mechanism | Scope | Use Case |
|-------|-----------|-------|----------|
| Page Cache | res.cachePeriod / res.cachePeriodUnit | Full controller response | Product pages, category pages |
| Template Cache | <iscache> ISML tag | Individual template fragment | Reusable components, static content |
| Object Cache | CacheMgr.getCache() | Arbitrary data | API responses, computed results |
| CDN Cache | Salesforce eCDN | Static assets + pages | Images, CSS, JS, edge-cached HTML |
Page cache types:
Template cache varyby: Fetch live docs for current supported varyby attribute values -- they are limited and version-specific.
| Metric | Good | Needs Improvement | What It Measures | |--------|------|-------------------|-----------------| | LCP (Largest Contentful Paint) | < 2.5s | < 4.0s | Main content load time | | INP (Interaction to Next Paint) | < 200ms | < 500ms | Input responsiveness (replaced FID) | | CLS (Cumulative Layout Shift) | < 0.1 | < 0.25 | Visual stability |
Optimization strategies per metric:
| Resource | Target | |----------|--------| | Total page weight | < 1 MB (mobile), < 2 MB (desktop) | | JavaScript bundle | < 300 KB (gzipped) | | CSS bundle | < 100 KB (gzipped) | | Images per page | < 500 KB total | | Third-party scripts | < 100 KB total, < 5 requests |
| Content Type | Recommended TTL | Cache Type | |-------------|----------------|------------| | Product pages | 24 hours | Public | | Category pages | 24 hours | Public | | Static assets (CSS/JS) | 30 days (versioned) | CDN | | Cart / checkout | No cache | Private | | API responses (CacheMgr) | 5-15 minutes | Object |
Cache-Control, max-age, s-maxage) control edge behavior| Technique | Platform | Approach |
|-----------|----------|----------|
| Image lazy loading | Both | loading="lazy" attribute on <img> |
| Below-fold content | B2C | Deferred AJAX includes for non-critical sections |
| Deferred scripts | B2C | <script defer> or <script async> |
| Code splitting | PWA Kit | React.lazy() + Suspense |
| Dynamic imports | LWC (B2B) | await import('c/heavyComponent') |
<isloop> iterations -- pre-calculate data in controllers<isinclude> sparingly (each include has overhead)B2B performance is covered in detail by other skills:
sf-b2b-apex skillsf-b2b-lwc skill (lazy loading, wire adapter caching, refreshApex)web-vitals libraryFetch Salesforce performance guides, eCDN documentation, and Core Web Vitals specs for exact cache configuration, CDN setup, and current metric thresholds before implementing.
development
Build with Spree's headless Next.js storefront — the official `spree/storefront` repo (Next.js 16 App Router with Server Actions and Turbopack, React 19 Server Components, Tailwind CSS 4, TypeScript 5, `@spree/sdk`, Sentry), server-only auth (httpOnly JWT cookies + publishable key), MeiliSearch faceted catalog, one-page checkout with Apple/Google Pay/Klarna/Affirm/SEPA, multi-region market routing, GA4 + JSON-LD SEO, and Vercel/Docker deployment. Use when forking or customizing the storefront, or evaluating headless adoption.
tools
Build Spree extensions as Rails engines — gem scaffolding, `bin/rails g spree:extension`, mounting routes/migrations/assets, the modern `prepend` decorator pattern (`*_decorator.rb` with `self.prepended(base)`), generators (`spree:model_decorator`, `spree:controller_decorator`), the four customization surfaces in preference order (Events > Webhooks > Dependencies > Decorators), Spree::Dependencies for swapping service objects, gem release/versioning, and the deprecated Deface engine. Use when building a reusable Spree extension or adding non-trivial customization to an app.
development
Build with Spree's event bus and Webhooks 2.0 — `Spree::Events` publication, `Spree::Subscriber` DSL with `subscribes_to` and `on`, wildcard matching, lifecycle events (`{model}.created/.updated/.deleted` via `publishes_lifecycle_events`), the canonical event catalog (order.*, payment.*, shipment.*, product.*), Webhooks 2.0 endpoints, HMAC-SHA256 signing (`X-Spree-Webhook-Signature`), exponential-backoff retries, and Sidekiq job orchestration. Use when wiring event-driven business logic, building webhook consumers, or replacing ActiveSupport callback chains.
tools
Cross-cutting Spree development patterns — the customization preference hierarchy (Events > Webhooks > Dependencies > Decorators), `Spree::Dependencies` service-object swapping, the `_decorator.rb` + `prepend` + `self.prepended` idiom, idempotent subscribers and webhook receivers, multi-store scoping discipline, prefixed IDs, calculator polymorphism (shipping/promotion/tax share the base), service-object composition with `dry-monads` or simple results, why to avoid `class_eval` reopening and Deface, and Spree-on-Rails idioms (Hotwire/Turbo Stimulus, ActiveStorage, Action Cable, Sidekiq). Use when designing the architecture of a Spree extension or solving cross-cutting concerns.