Khi PageSpeed Insights hoặc Lighthouse báo Render-blocking requests, điều đó có nghĩa một số CSS hoặc JavaScript đang nằm trên critical rendering path và có thể trì hoãn lần hiển thị đầu tiên của trang. Mục tiêu tối ưu không phải xóa tất cả CSS/JS, mà là xác định tài nguyên nào thực sự cần cho màn hình đầu tiên, tài nguyên nào có thể trì hoãn và tài nguyên nào không còn cần thiết.
Với website WordPress, lỗi này thường xuất hiện khi theme, plugin, font, page builder, analytics và script bên thứ ba cùng tải sớm. Cách xử lý an toàn là đo trước, tối ưu từng nhóm tài nguyên, kiểm tra lại giao diện và chức năng sau mỗi thay đổi.
Tài nguyên chặn hiển thị là gì?
Trình duyệt nhận HTML rồi phân tích tài liệu để tạo DOM, tải CSS để xây CSSOM và kết hợp các cấu trúc này trước khi vẽ nội dung lên màn hình. Một số request có thể buộc quá trình hiển thị phải chờ.
Lighthouse hiện tập trung vào hai nhóm request chính:
- Stylesheet: các thẻ
<link rel="stylesheet">cần áp dụng cho viewport hiện tại. - JavaScript: các script cổ điển tải trong
<head>nhưng không dùngasync,deferhoặc cơ chế tương đương.
Web font thường không được xếp cùng cách với stylesheet chặn hiển thị, nhưng font vẫn có thể ảnh hưởng thời gian hiển thị chữ, LCP và layout nếu cấu hình tải không tốt.
Vì vậy, nên dùng thuật ngữ giảm tài nguyên chặn hiển thị hoặc giảm tác động của render-blocking requests thay vì hiểu theo nghĩa phải xóa hết các file bị PageSpeed liệt kê.
Render-blocking ảnh hưởng những chỉ số nào?
Request nằm trên critical rendering path có thể trì hoãn First Paint và khiến phần tử LCP xuất hiện muộn hơn. Tác động thực tế phụ thuộc:
- Kích thước CSS/JS.
- Độ trễ mạng.
- Server response.
- Khoảng cách tới CDN.
- Số dependency phải tải nối tiếp.
- Khối lượng CSS/JS thực sự được dùng.
- Khả năng cache.
Google hiện đánh giá Core Web Vitals bằng ba chỉ số chính: LCP cho loading performance, INP cho responsiveness và CLS cho visual stability. Render-blocking thường liên quan rõ nhất tới LCP, nhưng JavaScript nặng còn có thể làm main thread bận và ảnh hưởng INP.
Xem thêm Core Web Vitals để phân biệt chỉ số tốc độ thực tế với điểm Lighthouse trong môi trường lab.
PageSpeed Score có phải yếu tố xếp hạng trực tiếp không?
Không nên hiểu theo cách đó.
Google cho biết Core Web Vitals được sử dụng trong các hệ thống xếp hạng, nhưng không có một “PageSpeed score” duy nhất quyết định website lên hay xuống hạng. Điểm 100 trong Lighthouse cũng không bảo đảm Top Google.
PageSpeed Insights hữu ích vì giúp tìm cơ hội cải thiện trải nghiệm và xác định bottleneck. Tuy nhiên, cần ưu tiên:
- Dữ liệu người dùng thực.
- Core Web Vitals.
- Critical request chain.
- Unused CSS/JS.
- Server response.
- Ảnh LCP.
- Third-party code.
Không nên tối ưu chỉ để một con số từ 89 thành 100 nếu việc đó làm giao diện lỗi, tracking mất dữ liệu hoặc tăng chi phí bảo trì.
“Tốc độ tốt không đến từ việc bật toàn bộ nút tối ưu. Mỗi CSS hoặc JavaScript phải được quyết định theo vai trò của nó trên critical rendering path và được kiểm tra lại sau khi thay đổi.”
Anh Thắng Giấu Tên – CEO Xuyên Việt Media
Cách xác định tài nguyên chặn hiển thị
PageSpeed Insights
Nhập URL cần kiểm tra vào PageSpeed Insights và xem phần Performance. Trong báo cáo Lighthouse hiện hành, cảnh báo render-blocking nằm trong nhóm Performance Insights.
Báo cáo có thể chỉ ra các request CSS/JS làm chậm lần render đầu. Hãy lưu URL, kích thước, thời gian và domain nguồn để biết file thuộc theme, plugin, CDN hay bên thứ ba.

Chrome DevTools Coverage
Coverage giúp xem bao nhiêu CSS/JavaScript được tải nhưng chưa sử dụng trong lần kiểm tra. Đây là tín hiệu rất hữu ích để tìm bundle quá lớn hoặc plugin tải asset trên những trang không cần.
Không nên xóa code chỉ vì Coverage báo “unused” trong một lần tải. Một đoạn JavaScript có thể chỉ chạy sau click, mở modal, add-to-cart hoặc submit form.
Network Dependency Tree
Hãy kiểm tra các chuỗi dependency nối tiếp. Một stylesheet có thể gọi thêm font, background image hoặc @import; một script có thể tải thêm SDK khác. Chuỗi càng dài, nguy cơ trì hoãn render càng lớn.
Nguyên tắc xử lý: Critical, Non-critical và Unused
| Nhóm | Cách nhận biết | Hướng xử lý |
|---|---|---|
| Critical | Cần để render màn hình đầu hoặc chức năng bắt buộc | Giữ ưu tiên cao; có thể inline một phần nhỏ khi thật sự cần |
| Non-critical | Chỉ cần sau lần render đầu | Defer, async, delay hoặc tải theo điều kiện |
| Unused | Không cần trên URL hiện tại | Không enqueue, unload hoặc loại khỏi bundle |
Đây là điểm khác biệt quan trọng. Minify chỉ giảm kích thước. Defer thay đổi thời điểm thực thi. Remove unused code giảm lượng code phải tải. Ba kỹ thuật giải quyết ba vấn đề khác nhau.
Cách xử lý CSS chặn hiển thị
1. Giảm CSS không sử dụng
Trên WordPress, theme và plugin thường enqueue stylesheet toàn site dù chỉ một số trang dùng component đó.
Ví dụ:
- CSS form được tải cả trên bài không có form.
- CSS slider được tải trên mọi trang dù slider chỉ có ở trang chủ.
- WooCommerce asset tải trên blog không có chức năng bán hàng.
- CSS page builder chứa nhiều block không dùng.
Tối ưu đúng là giảm asset không cần ở từng template hoặc tạo Used CSS theo trang.
2. Inline Critical CSS khi cần
Critical CSS là phần style tối thiểu cần cho nội dung xuất hiện ở viewport đầu.
Có thể đặt một lượng CSS nhỏ trực tiếp trong <head>:
<style>
/* Chỉ chứa CSS thật sự cần cho lần render đầu */
</style>
Chrome lưu ý đây là kỹ thuật nâng cao và có thể gây bug nếu triển khai sai. Không cần ép mọi website phải dùng Critical CSS thủ công để đạt hiệu suất tốt.
3. Tải CSS không quan trọng sau
Một pattern phổ biến là preload stylesheet rồi đổi quan hệ sang stylesheet khi tải xong:
<link rel="preload"
href="/assets/non-critical.css"
as="style"
onload="this.onload=null;this.rel='stylesheet'">
<noscript>
<link rel="stylesheet" href="/assets/non-critical.css">
</noscript>
Cách này chỉ nên dùng với CSS không cần cho lần render đầu. Nếu trì hoãn nhầm CSS của header hoặc hero, người dùng có thể thấy layout không style hoặc CLS.
4. Dùng media query đúng mục đích
Stylesheet chỉ dùng cho một loại media có thể khai báo điều kiện:
<link rel="stylesheet"
href="/assets/print.css"
media="print">
Không nên thêm media giả chỉ để PageSpeed ngừng cảnh báo. Điều kiện phải phản ánh đúng nơi stylesheet được sử dụng.

5. Hạn chế dependency từ @import
@import trong stylesheet có thể tạo thêm dependency chain vì trình duyệt phải tải CSS cha rồi mới phát hiện stylesheet con.
Với CSS quan trọng, nên để browser phát hiện stylesheet sớm từ HTML hoặc bundler thay vì tạo chuỗi import không cần thiết.
6. Không gộp tất cả CSS một cách máy móc
Gộp file từng là cách phổ biến để giảm số request. Với HTTP/2 và HTTP/3, lợi ích này không còn đơn giản như trước.
Một bundle CSS quá lớn có thể:
- Tăng dữ liệu tải trên trang không cần.
- Làm cache mất hiệu quả khi một phần nhỏ thay đổi.
- Làm khó tách CSS theo template.
Ưu tiên ship ít CSS hơn thay vì chỉ biến 20 file thành một file lớn.
Cách xử lý JavaScript chặn hiển thị
1. Dùng defer cho script phụ thuộc DOM hoặc có thứ tự
Với script cổ điển có src, defer cho phép browser tải song song trong khi parse HTML và thực thi sau khi document được parse.
<script src="/assets/vendor.js" defer></script>
<script src="/assets/app.js" defer></script>
Các script defer giữ thứ tự xuất hiện. Đây thường là lựa chọn phù hợp với code phụ thuộc DOM hoặc phụ thuộc script trước đó.
2. Dùng async cho script độc lập
async cũng tải song song, nhưng script sẽ thực thi ngay khi tải xong và không bảo đảm thứ tự giữa nhiều script async.
<script src="/assets/independent.js" async></script>
Chỉ dùng khi script thật sự độc lập. Không nên tự động đổi toàn bộ JavaScript sang async.
3. Module script đã được defer mặc định
Script dùng type="module" có hành vi defer theo mặc định:
<script type="module" src="/assets/main.js"></script>
Vì vậy, thêm defer vào module script không tạo thêm tác dụng.
4. Delay script không cần trước tương tác
Chat widget, heatmap, social embed, marketing SDK hoặc một số script bên thứ ba có thể chưa cần ở lần render đầu.
Delay execution có thể giúp giảm main-thread work và cải thiện lần hiển thị ban đầu. Nhưng nếu trì hoãn tracking, consent, menu, checkout hoặc script cần cho user journey thì dữ liệu hoặc chức năng có thể sai.
Không dùng một danh sách exclude copy từ website khác. Mỗi site có dependency riêng.
Font có phải tài nguyên chặn hiển thị không?
Font file không nên được xử lý giống CSS hoặc classic JavaScript. Tuy nhiên, web font vẫn có thể khiến text hiển thị muộn hoặc thay font gây layout shift.
Hướng tối ưu thường gồm:
- Chỉ tải weight/style thực sự dùng.
- Dùng WOFF2 khi phù hợp.
- Self-host khi có lợi cho kiến trúc.
- Dùng
font-displayphù hợp. - Preload chỉ font quan trọng thật sự.
- Tránh preload quá nhiều font.
Không nên preload mọi asset “để nhanh hơn”. Preload tăng ưu tiên mạng; dùng quá nhiều có thể cạnh tranh với tài nguyên LCP.
Tối ưu trên WordPress: nên làm theo thứ tự nào?
WordPress nên được xử lý từ nguyên nhân trước khi thêm plugin tối ưu.
- Kiểm tra theme và page builder.
- Liệt kê plugin đang enqueue CSS/JS.
- Gỡ plugin không còn dùng.
- Unload asset theo trang khi an toàn.
- Tối ưu CSS.
- Defer/delay JavaScript.
- Giảm script bên thứ ba.
- Kiểm tra cache/CDN.
- Đo lại field data và lab data.
Đây là một phần của Technical SEO, nhưng performance không nên tách khỏi trải nghiệm và conversion.
WP Rocket: cấu hình nào liên quan render-blocking?
WP Rocket hiện có các tính năng chính trong File Optimization:
Remove Unused CSS
WP Rocket khuyến nghị Remove Unused CSS như phương án tối ưu CSS chính. Tính năng tạo Used CSS cho từng trang và có thể loại render-blocking CSS ở nhiều trường hợp.
Sau khi bật, cần kiểm tra:
- Header.
- Mega menu.
- Slider.
- Popup.
- Responsive breakpoints.
- WooCommerce cart/checkout.
- Component xuất hiện sau tương tác.
Load JavaScript deferred
Tính năng này chuyển cách tải JavaScript để browser có thể render trang trước thay vì chờ script cổ điển chặn parse.
Delay JavaScript execution
Đây là tối ưu mạnh hơn: JavaScript có thể bị trì hoãn tới khi người dùng tương tác. Nó hữu ích cho script không cần ngay nhưng cũng dễ làm lỗi component nếu áp dụng không đúng.
Khi phát sinh lỗi, hãy xác định script cụ thể để exclude thay vì tắt toàn bộ tối ưu.

Autoptimize: nên hiểu đúng trước khi bật
Autoptimize hỗ trợ tối ưu CSS, JavaScript, HTML và có hệ Critical CSS tích hợp.
Không có một cấu hình “chuẩn” áp dụng cho mọi WordPress. Theme, builder và cache server có thể thay đổi kết quả.
Khi bật JavaScript optimization:
- Test menu mobile.
- Search.
- Form.
- Popup.
- Slider.
- Tracking.
- WooCommerce.

Khi bật CSS optimization, hãy kiểm tra Critical CSS, CSS của component động và cache. Nếu dùng thêm plugin cache hoặc CDN có chức năng minify/defer tương tự, tránh bật trùng hai lớp cùng xử lý một tài nguyên.

W3 Total Cache có xử lý được không?
Có thể. W3 Total Cache cung cấp các lớp cache và minify, trong đó có khả năng cấu hình JavaScript theo cách non-blocking.
Tuy nhiên, cấu hình thủ công danh sách file CSS/JS dễ lỗi khi theme/plugin cập nhật. Với website không có đội kỹ thuật theo dõi thường xuyên, nên ưu tiên cấu hình đơn giản và kiểm thử sau mỗi thay đổi.
5 lỗi thường gặp khi xử lý render-blocking
1. Xóa file bị Lighthouse báo
Lighthouse báo file nằm trên critical path, không có nghĩa file vô dụng. Xóa nhầm có thể làm mất style hoặc chức năng.
2. Defer toàn bộ JavaScript
Script phụ thuộc timing hoặc inline dependency có thể chạy sai thứ tự.
3. Delay analytics và consent không kiểm tra
Có thể làm mất event, attribution hoặc tạo hành vi consent không đúng.
4. Inline quá nhiều Critical CSS
HTML response phình lớn, cache khó tận dụng và mỗi template có thể cần Critical CSS khác nhau.
5. Bật nhiều plugin cùng tối ưu CSS/JS
Hai lớp minify, combine, defer hoặc delay có thể xung đột và khiến việc debug khó hơn.
Checklist kiểm tra sau khi tối ưu
| Hạng mục | Cần kiểm tra | Mục tiêu |
|---|---|---|
| Layout | Header, hero, footer, responsive | Không flash/vỡ CSS |
| Navigation | Menu, mega menu, search | JS hoạt động đúng |
| Conversion | Form, CTA, checkout | Không mất chức năng |
| Tracking | GA4, Ads, consent | Event vẫn gửi đúng |
| Performance | LCP, INP, CLS, request chain | Critical path giảm |
| SEO | HTML, canonical, robots, internal links | Không ảnh hưởng crawl/index |
Khi nào không nên cố loại bỏ 100% render-blocking?
Một lượng CSS cần thiết để hiển thị giao diện là bình thường. Mục tiêu không phải đạt con số “0 request” bằng mọi giá.
Đừng đánh đổi:
- CSS của màn hình đầu.
- Khả năng truy cập.
- Chức năng checkout.
- Consent management.
- Khả năng theo dõi conversion.
- Độ ổn định giao diện.
Nếu website đã có LCP, INP và CLS tốt trên dữ liệu người dùng thực, hãy ưu tiên bottleneck có tác động lớn hơn thay vì tiếp tục tối ưu một insight nhỏ chỉ để tăng điểm lab.
Render-blocking có liên quan SEO On-page không?
Đây chủ yếu là vấn đề performance/Technical SEO, nhưng vẫn có liên hệ với SEO On-page vì template, media, font và component nội dung quyết định lượng CSS/JS cần tải.
Một bài viết có HTML gọn và component nhất quán thường dễ tối ưu hơn trang được ghép từ nhiều widget, slider và script riêng lẻ.
Câu hỏi thường gặp
Render-blocking resources có phải lỗi nghiêm trọng không?
Không phải mọi request render-blocking đều là lỗi. CSS quan trọng thường cần cho lần render đầu. Hãy đánh giá thời gian trì hoãn và tác động thực tế.
Có nên defer jQuery không?
Có thể, nhưng phải kiểm tra các script phụ thuộc jQuery và inline scripts. Không nên áp dụng theo một công thức chung.
Async hay defer tốt hơn?
Defer thường phù hợp với script cần DOM hoặc cần giữ thứ tự. Async phù hợp với script độc lập có thể chạy ngay khi tải xong.
Có nên gộp toàn bộ CSS và JavaScript?
Không mặc định. HTTP/2 và HTTP/3 cho phép nhiều request hiệu quả hơn; bundle quá lớn có thể làm caching và tải theo trang kém hiệu quả.
PageSpeed 100 có cần thiết cho SEO không?
Không. Hãy ưu tiên trải nghiệm thực tế và Core Web Vitals thay vì cố đạt điểm tuyệt đối trong lab.
WP Rocket hay Autoptimize tốt hơn?
WP Rocket tích hợp cache và nhiều tối ưu tự động trong sản phẩm trả phí. Autoptimize tập trung tối ưu asset và có thể phối hợp với giải pháp cache khác. Lựa chọn phụ thuộc hosting và stack hiện tại.
Tối ưu render-blocking có làm mất tracking không?
Có thể nếu delay hoặc exclude sai. Sau mỗi thay đổi cần kiểm tra GA4, Ads, consent và các conversion event quan trọng.
Kết luận
Giảm tài nguyên chặn hiển thị là bài toán tối ưu critical rendering path, không phải xóa file CSS/JavaScript theo danh sách PageSpeed. Cách làm hiệu quả là phân loại Critical, Non-critical và Unused rồi dùng đúng kỹ thuật cho từng nhóm.
Với CSS, ưu tiên giảm unused CSS, tách Critical CSS khi cần và tránh dependency chain không cần thiết. Với JavaScript, dùng defer cho script phụ thuộc DOM/thứ tự, async cho script độc lập và delay chỉ những thành phần thật sự chưa cần trước tương tác.
Trên WordPress, plugin giúp tự động hóa nhiều bước nhưng mọi thay đổi vẫn phải được kiểm tra trên staging hoặc backup đầy đủ. Hiệu suất tốt nhất là trạng thái website tải nhanh mà vẫn giữ nguyên giao diện, chức năng, tracking và khả năng chuyển đổi.
Khi website có nhiều plugin, page builder, CSS/JS chồng chéo hoặc Core Web Vitals không ổn định, dịch vụ quản trị website nên xử lý performance theo từng lớp từ hosting, cache, asset đến code thay vì chỉ bật một plugin tối ưu.
Tài liệu tham khảo
Chrome for Developers. Render-blocking requests.
Chrome for Developers. Eliminate render-blocking resources.
Google Search Central. Understanding Core Web Vitals and Google Search results.
Google Search Central. Understanding page experience in Google Search results.
MDN Web Docs. <script> element: async and defer.
WP Rocket Knowledge Base. Remove Unused CSS.
WP Rocket Knowledge Base. Load JavaScript deferred.
WP Rocket Knowledge Base. Delay JavaScript execution.
WordPress.org. Autoptimize.
