Files
mataba/shop/docs/PERFORMANCE.md
T

2.2 KiB
Raw Blame History

XShop – Performance

1. Budgets

  • LCP < 2.5s on mid-tier mobile (4G, Moto G4 class).
  • Total blocking JS < 150ms.
  • No render-blocking webfont swap beyond FOIT 100ms (use font-display: swap).
  • DB queries: shop archive < 12 queries, product < 15 (WC baseline excluded).

2. Assets

  • Conditional enqueue: each module (search, filter, gallery, wishlist) enqueued only where needed (is_shop, is_product, is_search, or presence of shortcode/block).
  • No global JS: single xshop.js is ~5KB bootstrap; feature modules lazy-imported via import().
  • CSS: tokens + base always; component CSS split but concatenated in release (critical inline optional, not required v1).
  • No jQuery for new code; WC jQuery remains for its own handlers.
  • Images: loading="lazy" + decoding="async" + srcset, hero eager. Thumbnails via wp_get_attachment_image.
  • Fonts: system stack default; optional Vazirmatn self-hosted, subset, no external request by default.

3. Queries

  • Avoid N+1: prime post caches (update_post_meta_cache, update_post_term_cache), use wc_get_products with return => ids where only IDs needed, then wc_get_product in loop.
  • Cache expensive counts: filter counts via transient (5 min), search suggestions via transient (5 min).
  • No queries on init for frontend; defer to template.

4. Caching

  • Transients for search/filter counts; wp_cache for in-request repeated lookups (e.g., xshop_get_setting).
  • Compatibility with WP Rocket / LiteSpeed – no DONOTCACHEPAGE abuse.

5. Minification

  • Release build minifies CSS/JS (tools/build-release.ps1 runs cssnano/terser or PHP minify). Source maps for dev.

6. DOM

  • Minimal wrappers, no deep nesting. No layout thrash (batch DOM reads/writes).
  • Carousel: CSS scroll-snap, no heavy JS.

7. Monitoring

  • System Status reports: PHP/WP/WC versions, active plugins, asset sizes, transient hit rate.
  • Lighthouse CI optional (not required for v1).

8. Anti-Patterns Forbidden

  • Global wp_enqueue_script without condition.
  • Querying all products to compute filters.
  • Unbounded WP_Query without posts_per_page / no_found_rows.
  • External fonts/CDNs by default.