Một trang Shopify được dựng ra sao — theme, app Avada, và app bên thứ ba được nạp thế nào. Từ đó biết cách check bằng số và trả lời đúng khi khách phàn nàn "app làm chậm site".
Khách complain "app làm chậm store" là những case rất dễ bị đổ lỗi nhầm — mặc định nghĩ app Avada là thủ phạm.
Theme, app, third-party — ai nạp cái gì, khi nào.
LCP / INP / CLS nghĩa là gì, ngưỡng nào là kém.
PageSpeed → DevTools → Playwright. Ra verdict rõ ràng.
Trước khi nói app có làm chậm không, phải hiểu trang được dựng thế nào — ai sở hữu cái gì, và code được nạp vào trang bằng đường nào.
Shopify trả HTML do theme dựng.
Trình duyệt parse từ trên xuống, gặp CSS/JS thì xử lý.
Theme + app + third-party. Script chặn (blocking) làm dừng cả trang.
Vẽ nội dung chính (LCP), widget xuất hiện.
Bật trong Theme Editor, chạy trên mọi trang. Chưa bật = widget mất (lỗi phổ biến nhất).
Chèn vào 1 vị trí cụ thể (vd widget review ở trang product).
Tự inject, không cần theme. Deprecated Feb 2025, chỉ còn theme vintage.
3 chỉ số Google dùng để chấm trải nghiệm tốc độ. Hiểu chúng thì mới "dịch" được kết quả cho khách.
Bao lâu để phần nội dung lớn nhất (ảnh/heading) hiện ra. Script chặn làm chậm LCP.
Giống như đợi món chính được bưng ra bàn.Trang phản hồi thao tác nhanh không (đã thay FID). Event listener nặng chặn main thread (luồng xử lý chính của trình duyệt — nghẽn ở đây là trang khựng) → INP tệ.
Như bấm nút thang máy mà đèn không sáng ngay.Layout có bị nhảy không. Widget không chừa chỗ trước khi load → đẩy nội dung → CLS cao.
Nội dung nhảy lung tung lúc đang load, dễ bấm nhầm nút.Chạy trên máy khác nhau → số khác nhau. Đừng lấy 1 lần chạy làm chân lý.
Đây mới là cái khách & Google thực sự thấy. Ưu tiên khi kết luận.
Cùng một câu hỏi "app có làm chậm không", nhưng dùng sai tool sẽ ra số lệch 2–3 lần so với khách. Đây là thứ tự ưu tiên chuẩn.
Ưu tiên cao nhất. Chính là tool Google tính CWV thật → khớp với cái khách thấy. Trả về LCP/CLS/TBT + breakdown từng third-party script. Không cần browser, không phụ thuộc máy test.
Fallback khi cần đào sâu. Khi cần đào sâu hơn PageSpeed, agent tự dùng tool này để đo chính xác hơn (network waterfall (biểu đồ thứ tự tải từng file, xem cái nào chặn cái nào), thứ tự script). Đo qua CDP (giao thức Chrome dùng để đo chính xác hơn).
Thấp nhất cho performance. Throttle kém chính xác, LCP đo qua JS dễ miss. Chỉ dùng để screenshot / thao tác, không dùng đo CWV.
Ví dụ verdict thật:
Có số rồi thì nói thẳng, không vòng vo. Phân biệt rõ khi nào là Avada, khi nào không — và escalate dev cần mang theo gì.
Trang cụ thể bị chậm (product / collection / home).
Điểm PageSpeed trước & sau khi cài/bật app.
Breakdown script nào chặn bao nhiêu ms.
3 ca thật của Air Reviews & Joy — cùng cách khách complain, và cách mình dùng số để tìm đúng thủ phạm. Không lý thuyết.
Khách gửi số đo
TL;DR: Air Reviews chỉ 82ms, không block main thread — không phải thủ phạm LCP 15.4s.
Screenshot PSI: Performance 52 · LCP 15.4s · FCP 6.3s · TBT ~750ms. Chỉ vào AR load 19 file script (194 KiB, 82ms) từ cdn-air-reviews và đổ cho app làm chậm.
TS soi lại waterfall
Thủ phạm LCP thật: uploadly-cdn.com (825ms) + Facebook Pixel, cộng ảnh sản phẩm theme set 3840px trên mobile. AR không block main thread — 82ms là không đáng kể.
Khách thấy điểm 52 rồi chỉ tay vào app đầu tiên nhìn thấy. Mình đọc waterfall → thủ phạm là third-party (uploadly, FB Pixel) + ảnh theme, không phải AR (82ms). Không có số này thì rất dễ nhận oan.
Khách gửi
TL;DR: File Lighthouse khách gửi đo bản v3 cũ (219KB) — store thật đang chạy v4 nhẹ hơn nhiều, không phải Joy làm chậm.
Upload thẳng vào Crisp avada-lighthouse-report.json + Google Drive (report.html + trace). Chỉ ra Joy gọi Google Fonts (Instrument Serif) render-blocking + avada-joy bundle nạp tuần tự, đổ cho Joy làm chậm LCP mobile.
TS + dev soi trace
Trace cho thấy script widget v3 (219KB) — nhưng store thật đang chạy v4 (~40KB). Số trong file khách gửi là version cũ, không phản ánh live. Font là chủ ý (tránh FOUT FAB label).
Khách gửi cả file .json + trace vẫn có thể sai — vì đo trên version/cache cũ. Luôn đối chiếu với store live.
Khách yêu cầu
TL;DR: App đã tự động không load JS ở trang không có block — chỉ cần gỡ block, không cần sửa code.
Air Reviews chỉ nên load JS trên product page, không load toàn site, để các trang khác nhẹ hơn.
Dev phản hồi
App đã có sẵn logic không load JS nếu trang không có block AR nào (review sidebar, popup…). Chỉ cần add block ở product page thì JS chỉ load ở đó. Không đổi code.
Nối thẳng slide "các cửa delivery": App Block ở đâu → script load ở đó. Gỡ block ở trang không cần là widget + JS tự biến mất khỏi trang đó.
Khách gửi & đòi
TL;DR: AR có đóng góp nhưng không phải thủ phạm chính — cần đưa test delta cụ thể, không chỉ nói "không phải app".
Link PSI product page, mobile 57 điểm. Chỉ vào utilities-FullScreen…js (~340KB) do air-reviews-main nạp. 3 yêu cầu: lazy-load script đó, thêm toggle tắt, giảm JS payload.
Ryan soi PSI
AR có đóng góp nhưng không phải thủ phạm chính — LCP/TBT chủ yếu từ theme + third-party. Chạy lại PSI điểm nhảy lên 67 (số dao động). AR bundle chung, không tách lazy-load được. Ticket-only, không báo dev.
Trả lời kiểu "không phải lỗi app, dùng app SEO đi" → khách nổi cáu ("poorest response ever"). CSL coach lại:
Triệu chứng
Merchant báo LCP kém đi sau khi bật widget accessibility. Lần này số đo trỏ đúng vào app: preloader + logo của widget là phần tử LCP nhưng không được preload (preload = báo trình duyệt tải sớm tài nguyên quan trọng) → hiện muộn.
Dev fix thật
TL;DR: Lần này đúng là app gây LCP kém — dev fix bằng preload logo, đã cải thiện.
Preload preloader logo + preload logo → phần tử LCP tải
sớm → LCP cải thiện. Verify bằng PSI before/after đúng khung
toggle test.
Các case trên đa số là đổ oan cho app — nhưng có ca app đúng là nguyên nhân. Cùng một quy trình đo bằng số: nếu delta chỉ vào Avada thì thừa nhận, escalate dev, và fix — chứ không phủ nhận sạch.
Khách: "Cài Air Reviews xong LCP lên 7s." → Chạy PSI, tách script Avada vs theme vs third-party. Verdict?
Khách gửi Lighthouse 32 điểm mobile. → Field data nói gì? Thủ phạm top-3 là ai, có Avada không?
Khách: "Widget nhảy layout." → CLS hay do widget không chừa chỗ? In-scope fix được không?
Hiểu trang load ra sao → đọc được CWV → check đúng tool → chia scope rõ ràng. Không bao giờ nhận lỗi cho app khi chưa có số.