- 1. Bước đầu tiên: tải và phân tích tài nguyên
- 2. Xây dựng cây DOM (Document Object Model)
- 3. Xây dựng cây CSSOM (CSS Object Model)
- 4. Kết hợp DOM và CSSOM thành Render Tree
- 5. Quá trình Layout (Reflow)
- 6. Bước Paint (vẽ pixel)
- 7. Compositing – Ghép lớp hiển thị cuối cùng
- 8. Repaint, Reflow và tác động đến hiệu năng
- 9. Những yếu tố ảnh hưởng đến quá trình render
- 10. Cách tối ưu quá trình render
- Kết luận
1. Bước đầu tiên: tải và phân tích tài nguyên
Khi người dùng nhập một địa chỉ URL, trình duyệt bắt đầu chuỗi quy trình gồm nhiều bước:
- Gửi yêu cầu HTTP/HTTPS: Trình duyệt gửi request đến máy chủ để lấy nội dung trang.
- Nhận phản hồi: Máy chủ trả về tệp HTML chính và các tài nguyên liên quan như CSS, JavaScript, hình ảnh, font.
- Tải song song: Trình duyệt phân tích HTML, đồng thời bắt đầu tải các tài nguyên được phát hiện (CSS, script, v.v.).
Trình duyệt xử lý HTML theo dạng luồng (streaming) — nghĩa là vừa đọc vừa xây dựng cấu trúc trang thay vì chờ tải xong toàn bộ nội dung.
2. Xây dựng cây DOM (Document Object Model)
HTML được phân tích cú pháp (parse) thành một cấu trúc dạng cây gọi là DOM. Mỗi thẻ HTML tương ứng với một nút (node) trong cây DOM. Ví dụ:
<div><p>Hello</p></div>
Sẽ được biểu diễn dưới dạng cây:
divp"Hello"
DOM là đại diện của cấu trúc tài liệu và được JavaScript truy cập, thay đổi trong thời gian thực.
3. Xây dựng cây CSSOM (CSS Object Model)
Trong khi DOM mô tả nội dung, CSSOM mô tả cách nội dung đó được hiển thị. Khi trình duyệt tải xong tệp CSS, nó phân tích cú pháp và tạo cây CSSOM – mỗi quy tắc CSS được ánh xạ tới phần tử tương ứng trong DOM.
Ví dụ:
p { color: red; font-size: 16px; }
Sẽ tạo ra nút CSSOM chứa quy tắc định dạng cho phần tử <p>.
4. Kết hợp DOM và CSSOM thành Render Tree
Trình duyệt kết hợp hai cấu trúc DOM và CSSOM để tạo thành Render Tree – cây mô tả chính xác những gì sẽ được hiển thị trên màn hình (chỉ bao gồm các phần tử có thể nhìn thấy, bỏ qua thẻ như <head> hoặc <script>).
Mỗi nút trong Render Tree chứa thông tin về:
- Vị trí và kích thước phần tử (layout box)
- Kiểu hiển thị: màu, font, độ mờ, border, shadow
- Các thuộc tính tính toán cuối cùng sau khi áp dụng CSS cascade và inheritance
5. Quá trình Layout (Reflow)
Khi Render Tree được tạo, trình duyệt bắt đầu tính toán kích thước, vị trí và quan hệ không gian giữa các phần tử – quá trình này gọi là layout hay reflow. Đây là bước cực kỳ quan trọng và tốn tài nguyên, đặc biệt với các trang có cấu trúc phức tạp.
Trình duyệt xác định tọa độ (x, y) và kích thước (width, height) của từng phần tử dựa trên box model, margin, padding, border, flex, grid, v.v.
6. Bước Paint (vẽ pixel)
Sau khi có thông tin vị trí, trình duyệt chuyển sang paint: vẽ từng phần tử trên các lớp (layer) riêng biệt. Mỗi layer chứa thông tin về màu, hình ảnh, shadow, text, gradient và các hiệu ứng khác. Quá trình này yêu cầu CPU và GPU phối hợp để tạo bitmap cho từng phần tử.
7. Compositing – Ghép lớp hiển thị cuối cùng
Trình duyệt ghép (composite) các layer lại với nhau để tạo khung hình hoàn chỉnh. Một số thuộc tính như transform, opacity, filter hoặc will-change có thể khiến phần tử được render trên layer riêng do GPU xử lý, giúp tăng hiệu năng khi animation hoạt động.
8. Repaint, Reflow và tác động đến hiệu năng
Không phải lúc nào trang cũng render một lần rồi xong. Mỗi khi JavaScript thay đổi DOM hoặc CSS, trình duyệt có thể phải:
- Repaint: Vẽ lại giao diện khi màu sắc, border, shadow thay đổi nhưng không ảnh hưởng layout.
- Reflow: Tính toán lại toàn bộ layout khi kích thước, vị trí phần tử thay đổi.
Reflow đặc biệt tốn tài nguyên, có thể gây giật lag nếu xảy ra thường xuyên (ví dụ khi animation dùng thuộc tính top, left thay vì transform).
9. Những yếu tố ảnh hưởng đến quá trình render
- CSS phức tạp: Selector sâu hoặc không tối ưu làm chậm quá trình tính toán CSSOM.
- JavaScript blocking: Script đặt ở đầu trang ngăn trình duyệt render trước khi tải xong.
- Hiệu ứng không được tối ưu: Box-shadow, blur, filter hoặc transition liên tục khiến GPU hoạt động mạnh.
- Font và hình ảnh lớn: Tăng thời gian paint và compositing.
10. Cách tối ưu quá trình render
- Giảm số lượng reflow: Gom các thay đổi DOM vào cùng một frame hoặc sử dụng
requestAnimationFrame(). - Tận dụng transform và opacity: Các thuộc tính này được GPU xử lý nên mượt hơn khi animation.
- Trì hoãn script không cần thiết: Dùng
deferhoặcasyncđể script không chặn render. - Tối ưu CSS: Giữ selector ngắn, tránh CSS lồng nhiều cấp và loại bỏ quy tắc không dùng.
- Sử dụng lazy loading: Chỉ tải hình ảnh và video khi cần hiển thị.
Kết luận
Quá trình render trang web là chuỗi công việc phức tạp, đòi hỏi sự phối hợp chặt chẽ giữa CPU, GPU và trình duyệt. Việc nắm vững cơ chế từ HTML đến pixel giúp nhà phát triển hiểu được nguyên nhân của các vấn đề hiệu năng và tối ưu code hiệu quả hơn. Một trang web nhanh, mượt và ổn định không chỉ mang lại trải nghiệm người dùng tốt hơn mà còn phản ánh sự chuyên nghiệp trong tư duy kỹ thuật và thiết kế của đội ngũ phát triển.
Bình luận