Render-blocking resource là gì luôn là thắc mắc hàng đầu của các nhà phát triển và SEO-er khi đối mặt với bảng báo cáo “đỏ rực” trên Google PageSpeed Insights. Khi người dùng truy cập vào một trang web, họ mong muốn nội dung hiển thị ngay lập tức thay vì phải nhìn vào màn hình trắng trong vài giây dài đằng đẵng. Hiện tượng này thường do các tệp tin CSS và JavaScript không được tối ưu gây ra, khiến trình duyệt phải tạm dừng mọi hoạt động hiển thị để tải chúng xuống.
Nội dung dưới đây sẽ giải mã chi tiết về các tài nguyên chặn hiển thị, cơ chế gây chậm trễ của chúng và những giải pháp kỹ thuật thực tế để giải phóng tốc độ cho website của bạn. Bạn sẽ nắm vững cách thức trình duyệt xử lý dữ liệu và cách can thiệp vào quy trình đó một cách thông minh nhất.
Render-blocking resource là gì?
Về mặt kỹ thuật, render-blocking resource (tài nguyên chặn hiển thị) là bất kỳ tệp tin hoặc mã nguồn nào buộc trình duyệt phải tạm dừng việc vẽ giao diện (rendering) cho đến khi chúng được tải xuống và xử lý xong. Theo định nghĩa từ MDN Web Docs, các tài nguyên này trực tiếp ngăn cản người dùng nhìn thấy nội dung trang web hoặc tương tác với giao diện trong những mili giây đầu tiên.
Thông thường, trình duyệt sẽ đọc mã HTML từ trên xuống dưới. Khi gặp các thẻ <link rel="stylesheet"> hoặc thẻ <script>, trình duyệt sẽ coi đây là các tài nguyên quan trọng thuộc đường dẫn hiển thị quan trọng (Critical Rendering Path – CRP). Vì trình duyệt lo ngại rằng nếu hiển thị nội dung trước khi có style hoặc script, trang web sẽ bị lỗi giao diện (FOUC – Flash of Unstyled Content), nên nó chọn cách “đứng chờ”.
Các loại tài nguyên chặn hiển thị phổ biến bao gồm:
- Các tệp tin CSS đặt trong thẻ
<head>. - Mã JavaScript đồng bộ (Synchronous JS) không có thuộc tính
deferhoặcasync. - Các font chữ hệ thống chưa được tối ưu hóa cách tải.
- Các script từ bên thứ ba như widget chat, quảng cáo hoặc công cụ phân tích.
Phân biệt giữa Parser-blocking và Render-blocking
Một hiểu lầm phổ biến là đánh đồng hai khái niệm này. Parser-blocking xảy ra khi trình duyệt dừng đọc tài liệu HTML để tải script, làm chậm việc xây dựng cây DOM. Trong khi đó, render-blocking lại ngăn cản bước “Paint” – bước thực sự vẽ các điểm ảnh lên màn hình. JavaScript đồng bộ thường đóng cả hai vai trò này, khiến hiệu suất tải trang bị sụt giảm nghiêm trọng.
Cách render-blocking resource hoạt động
Để hiểu tại sao các tài nguyên này lại gây chậm trễ, chúng ta cần nhìn vào quy trình làm việc bên trong của trình duyệt. Quá trình này diễn ra theo một chuỗi các bước tuần tự và chặt chẽ.
Đầu tiên, trình duyệt nhận tệp HTML và bắt đầu xây dựng DOM (Document Object Model). Cùng lúc đó, khi gặp các tệp CSS, trình duyệt xây dựng CSSOM (CSS Object Model). Chỉ khi có đủ cả DOM và CSSOM, trình duyệt mới kết hợp chúng lại thành Render Tree.
Mô hình hoạt động có thể tóm tắt như sau:
DOM + CSSOM => Render Tree => Layout => Paint
Khi trình duyệt gặp một dòng mã như <link rel="stylesheet" href="style.css">, nó sẽ thực hiện các bước:
- Tạm dừng việc tạo Render Tree.
- Gửi yêu cầu tải tệp
style.css. - Chờ đợi tệp tin tải xong.
- Phân tích (parse) nội dung CSS.
- Cập nhật CSSOM.
Chỉ sau khi bước 5 hoàn tất, quá trình hiển thị mới được tiếp tục. Đối với JavaScript, tình hình còn phức tạp hơn. Trình duyệt dừng hoàn toàn việc phân tích HTML vì script có khả năng thay đổi cấu trúc DOM hoặc CSSOM thông qua lệnh document.write hoặc thay đổi style trực tiếp. Việc thiếu sự chuẩn bị cho các tài nguyên này dẫn đến “thời gian chết” lãng phí, khiến chỉ số First Paint bị kéo dài.
Ngưỡng hiệu suất liên quan đến tài nguyên chặn hiển thị
Google không đưa ra một con số tuyệt đối về số lượng tài nguyên chặn hiển thị cho phép. Tuy nhiên, họ đánh giá hiệu quả của việc tối ưu hóa thông qua các chỉ số trong bộ Core Web Vitals. Các tài nguyên này ảnh hưởng trực tiếp đến tốc độ phản hồi cảm nhận được của người dùng.
Dưới đây là bảng so sánh các ngưỡng chỉ số quan trọng mà render-blocking resource tác động mạnh nhất:
| Chỉ số | Tốt (Vượt qua) | Cần cải thiện | Kém (Thất bại) |
| FCP (First Contentful Paint) | ≤ 1.8 giây | 1.8 – 3.0 giây | > 3.0 giây |
| LCP (Largest Contentful Paint) | ≤ 2.5 giây | 2.5 – 4.0 giây | > 4.0 giây |
| TBT (Total Blocking Time) | < 200 ms | 200 – 600 ms | > 600 ms |
Khi bạn chạy kiểm tra bằng Lighthouse, trình kiểm tra “Eliminate render-blocking resources” sẽ liệt kê danh sách các tệp tin kèm theo số giây dự kiến tiết kiệm được nếu bạn loại bỏ sự chặn hiển thị của chúng. Đây là mục tiêu quan trọng nhất cần giải quyết để đưa điểm hiệu suất (Performance Score) lên vùng xanh.
Cách kiểm tra render-blocking resource của website
Việc xác định chính xác đâu là “kẻ tội đồ” gây chậm trễ trang web là bước đầu tiên trong quy trình tối ưu hóa. Bạn có thể sử dụng các công cụ chuyên dụng sau để đo lường.
Dùng Google PageSpeed Insights
Đây là công cụ phổ biến nhất đối với các SEO-er tại Việt Nam.
- Truy cập vào trang Google PageSpeed Insights.
- Nhập URL website cần kiểm tra và nhấn “Analyze”.
- Kéo xuống phần Diagnostics (Chẩn đoán).
- Tìm mục Eliminate render-blocking resources. Tại đây, Google sẽ chỉ rõ tên file CSS/JS và dung lượng cụ thể đang chặn đường hiển thị của trang.

Dùng Chrome DevTools
Đối với các lập trình viên, Chrome DevTools cung cấp cái nhìn sâu sắc hơn qua tab Network:
- Mở website, nhấn F12 và chọn thẻ Network.
- Tải lại trang và quan sát cột “Waterfall”.
- Các tệp tin có mức ưu tiên (Priority) là “Highest” thường là các tài nguyên chặn hiển thị.
- Bạn cũng có thể dùng tab Coverage để xem có bao nhiêu phần trăm mã trong các file này thực sự được sử dụng trên trang hiện tại.

Dùng Google Search Console
Nếu bạn quản lý một hệ thống website lớn, Google Search Console là nơi tuyệt vời để theo dõi chỉ số Core Web Vitals trên quy mô rộng. Công cụ này không chỉ đích danh file, nhưng nó sẽ cảnh báo những trang nào đang có chỉ số FCP hoặc LCP kém do ảnh hưởng của các tài nguyên chưa tối ưu.

Cách cải thiện render-blocking resource hiệu quả
Sau khi đã xác định được các tài nguyên gây nghẽn, chúng ta cần áp dụng các kỹ thuật xử lý để chuyển đổi chúng từ trạng thái chặn hiển thị sang trạng thái tải không đồng bộ.
Cách 1 — Sử dụng thuộc tính defer và async cho JavaScript
Đây là phương pháp đơn giản và hiệu quả nhất đối với các tệp script. Thay vì để trình duyệt dừng lại chờ tải JS, chúng ta cho phép nó tải song song với quá trình đọc HTML.
- defer: Script được tải song song nhưng chỉ thực thi sau khi toàn bộ HTML đã được phân tích xong. Đây là lựa chọn tốt nhất cho các file logic chính của trang.
- async: Script được tải song song và thực thi ngay khi tải xong, có thể làm gián đoạn quá trình phân tích HTML. Phù hợp cho các script độc lập như quảng cáo hoặc tracking.
HTML
<!-- Ví dụ sử dụng defer -->
<script src="main-logic.js" defer></script>
Cách 2 — Inline Critical CSS và trì hoãn CSS không quan trọng
Đối với CSS, giải pháp tối ưu là tách phần CSS cần thiết để hiển thị phần nội dung trên màn hình đầu tiên (Above-the-fold) và nhúng trực tiếp vào thẻ <style> trong <head>. Các phần CSS còn lại cho các thành phần ở dưới trang (như footer, comment) sẽ được tải sau bằng cách sử dụng thuộc tính media="print" hoặc JavaScript để thay đổi giá trị rel.
HTML
<!-- Inline Critical CSS -->
<style>.hero-section { display: block; color: #333; }</style>
<!-- Trì hoãn CSS còn lại -->
<link rel="stylesheet" href="full-styles.css" media="print" onload="this.media='all'">
Cách 3 — Sử dụng Preload cho các tài nguyên quan trọng
Kỹ thuật Preload thông báo cho trình duyệt biết một tài nguyên cụ thể sẽ rất cần thiết trong tương lai gần và cần được ưu tiên tải xuống ngay lập tức, nhưng không chặn việc render. Điều này cực kỳ hữu ích cho các font chữ web hoặc các tệp CSS chủ đạo.
HTML
<link rel="preload" href="brand-font.woff2" as="font" type="font/woff2" crossorigin>
Ngoài ra, việc loại bỏ các CSS/JS không sử dụng (Unused CSS/JS) thông qua các công cụ như PurgeCSS hoặc các tính năng Tree Shaking trong Webpack/Vite cũng giúp giảm đáng kể gánh nặng cho trình duyệt.
Render-blocking resource ảnh hưởng SEO thế nào?
Trong kỷ nguyên SEO hiện đại, tốc độ không chỉ là vấn đề kỹ thuật mà là một yếu tố xếp hạng chính thức. Google đã tích hợp Core Web Vitals vào thuật toán xếp hạng từ năm 2021.
Một trang web chứa quá nhiều tài nguyên chặn hiển thị sẽ dẫn đến:
- LCP kém: Khi phần tử lớn nhất (như ảnh Hero hoặc tiêu đề H1) bị trì hoãn hiển thị, Google sẽ đánh giá trang web có trải nghiệm kém.
- Tỷ lệ thoát (Bounce Rate) tăng cao: Người dùng di động thường không đủ kiên nhẫn để đợi quá 3 giây. Nếu trang web trắng quá lâu, họ sẽ quay lại kết quả tìm kiếm, gửi tín hiệu tiêu cực về nội dung cho Google.
- Giảm hiệu quả Crawl: Trình bot của Google có “ngân sách thu thập dữ liệu” (Crawl Budget). Trang web càng nặng và chậm, bot càng tốn thời gian, dẫn đến việc các nội dung mới chậm được lập chỉ mục.
Việc tối ưu hóa để loại bỏ các tài nguyên chặn hiển thị chính là cách bạn tạo ra một “con đường thênh thang” cho cả người dùng và công cụ tìm kiếm.
Câu hỏi thường gặp về Render-blocking resource
Render-blocking resource bao nhiêu là tốt?
Lý tưởng nhất là website của bạn không có tài nguyên nào gây chặn hiển thị ngoài các CSS cực kỳ quan trọng. Mục tiêu thực tế là giảm tổng thời gian chặn (TBT) xuống dưới 200ms để đạt điểm hiệu suất tối đa trên các công cụ đo lường.
Tất cả CSS đều là render-blocking đúng không?
Đúng, theo mặc định trình duyệt coi mọi tệp CSS trong thẻ <head> là render-blocking để tránh lỗi hiển thị giao diện. Tuy nhiên, chúng ta có thể thay đổi hành vi này bằng các kỹ thuật như Inline CSS hoặc sử dụng Media Queries cho từng thiết bị cụ thể.
Làm sao cải thiện render-blocking resource nhanh nhất?
Cách nhanh nhất là cài đặt các plugin tối ưu hóa (nếu dùng WordPress như WP Rocket) hoặc thêm thuộc tính defer vào tất cả các thẻ script không thiết yếu. Đồng thời, hãy sử dụng định dạng font .woff2 và nén dung lượng CSS trước khi đẩy lên server.
Tóm lại, việc hiểu rõ render-blocking resource là gì giúp bạn làm chủ quy trình hiển thị của website. Bằng cách ưu tiên tải những gì người dùng cần thấy trước và trì hoãn những thứ chưa cần thiết, bạn sẽ cải thiện đáng kể tốc độ tải trang. Hãy bắt đầu bằng việc kiểm tra lại file CSS và JS của mình ngay hôm nay để không bỏ lỡ cơ hội bứt phá trên bảng xếp hạng Google.
Đọc tiếp: Code Splitting là gì?


