Bài 10 · Vận dụng · 22 phút
Tối ưu tốc độ tải trang
Biên soạn bởi Nguyễn Anh Tuấn
Các thủ thuật HTML giúp trang tải nhanh: resource hints (preload, preconnect, dns-prefetch), hoãn tải (lazy) ảnh/iframe, và thứ tự nạp tài nguyên hợp lý.
Hãy nhớ lần mèo con mở một trang mà nó cứ quay vòng mãi không hiện. Bực chứ? Đa số người dùng sẽ bỏ đi nếu trang lâu hiện. Tốc độ không phải thứ xa xỉ - nó là một phần của trải nghiệm, và công cụ tìm kiếm cũng tính tốc độ khi xếp hạng. Nói gọn: nhanh cũng là một tính năng.
Tin vui là phần lớn việc tối ưu nằm trong tầm tay người viết HTML, và mèo con đã học kha khá rồi. Bài này gom các thủ thuật còn lại mà site thật hay dùng.
- ▸Trang chậm thì người dùng bỏ đi - tốc độ là một phần trải nghiệm.
- ▸Công cụ tìm kiếm cũng tính tốc độ khi xếp hạng (SEO).
- ▸Phần lớn việc tối ưu nằm trong tầm tay người viết HTML.
Trình duyệt sẽ nhanh hơn nếu được báo trước về tài nguyên sắp cần. Ta báo bằng thẻ <link rel="…"> đặt trong head. Mỗi giá trị rel là một kiểu gợi ý khác nhau:
Hai gợi ý "dọn đường" tới một domain khác (nơi chứa font, ảnh…): dns-prefetch tra cứu DNS sớm, còn preconnect mở sẵn cả kết nối (mạnh hơn, nên chỉ dùng cho vài domain quan trọng).
hints.html · dọn đường tới domain chứa font (đặt trong <head>)
<link rel="preconnect" href="https://fonts.example.com" />
<link rel="dns-prefetch" href="https://anh.example.com" /> - ▸Resource hints là thẻ <link rel="…"> trong head, báo trước cho trình duyệt.
- ▸dns-prefetch: tra cứu DNS sớm tới domain khác.
- ▸preconnect: mở sẵn cả kết nối - mạnh hơn, chỉ dùng cho domain quan trọng.
Hai gợi ý còn lại tải hẳn tài nguyên về trước. Khác nhau ở thời điểm cần: preload cho thứ trang HIỆN TẠI cần sớm và chắc chắn dùng (font chữ chính, ảnh lớn đầu trang) - kéo lên ưu tiên cao. prefetch cho thứ CÓ THỂ cần ở trang sau (tài nguyên của trang người dùng dễ bấm tới), tải lúc rảnh.
preload-prefetch.html · cần ngay vs có thể cần sau
<!-- cần NGAY ở trang này -->
<link rel="preload" href="/fonts/chinh.woff2" as="font" crossorigin />
<!-- CÓ THỂ cần ở trang sau -->
<link rel="prefetch" href="/trang-sau.html" /> Trung thực
Chiều ngược lại với "tải sớm" là hoãn tải thứ chưa cần. Mèo con đã gặp loading="lazy" cho ảnh ở bài Liên kết, ảnh & đa phương tiện; nó cũng dùng được cho iframe (bản đồ, video nhúng) nằm xa phía dưới.
lazy-iframe.html · hoãn tải iframe nặng nằm cuối trang
<iframe src="ban-do.html" loading="lazy" title="Bản đồ cửa hàng"></iframe> Quan trọng hơn mọi gợi ý: phần lớn tốc độ đến từ những nền mèo con đã học - như chuyện nạp script không chặn ở bài Thẻ script: defer & async. Nhắc lại nhanh:
- ▸Ảnh đúng cỡ bằng srcset (bài Liên kết, ảnh) - điện thoại không tải ảnh khổng lồ.
- ▸Script không chặn bằng defer/async (bài trước) - trang hiện sớm.
- ▸HTML semantic gọn gàng - ít rác, trình duyệt dựng nhanh.
- ▸loading="lazy" cho ảnh/iframe nằm xa phía dưới.
Một cạm bẫy thường gặp: rải hint khắp nơi theo cảm tính rồi tưởng trang đã nhanh. Cách làm đúng là đo trước khi tối ưu - tìm xem chỗ nào thật sự chậm rồi mới sửa đúng chỗ đó. Có sẵn công cụ đo miễn phí ngay trong trình duyệt như Lighthouse (mèo con chỉ cần biết nó tồn tại ở giai đoạn này).
Trung thực
Bước tiếp theo
Câu hỏi thường gặp
Cả hai đều "dọn đường" tới một domain khác trước khi cần. dns-prefetch chỉ tra cứu DNS sớm (đổi tên miền ra địa chỉ máy chủ); preconnect làm nhiều hơn: thiết lập sẵn cả kết nối (tra DNS và thiết lập kênh bảo mật). preconnect mạnh hơn nhưng tốn tài nguyên hơn, nên chỉ dùng cho vài domain thật sự quan trọng.
preload cho thứ trang HIỆN TẠI cần SỚM và chắc chắn dùng (vd font chữ chính, ảnh hero đầu trang) - kéo nó lên ưu tiên cao. prefetch cho thứ CÓ THỂ cần ở trang SAU (vd tài nguyên của trang người dùng dễ bấm tới tiếp), tải lúc rảnh. Nhớ: preload = ngay đây; prefetch = có thể sau này.
Có. preload kéo tài nguyên lên ưu tiên cao; nếu preload quá nhiều thứ thì chúng giành băng thông với nhau và với những thứ thật sự quan trọng, làm trang chậm hơn. Chỉ preload vài tài nguyên then chốt cho lần hiện đầu tiên.
Tick những điều em tự tin làm được. Càng lên cao, em càng hiểu sâu.
Trả lời vài câu để chắc rằng em đã nắm bài.
preload khác prefetch ở điểm chính nào?
- 1
Kết nối sớm
Trang dùng font từ một domain ngoài. Viết thẻ link báo trình duyệt mở sẵn kết nối tới domain đó.
✅ Hoàn thành khi: Có <link rel="preconnect" href="https://..."> trong head, trỏ tới domain chứa font.
- 2
preload hay prefetch?
Chọn preload hay prefetch: (a) font chữ chính dùng ngay ở trang này; (b) ảnh của trang "Chi tiết" mà người dùng có thể bấm vào sau.
✅ Hoàn thành khi: (a) preload (cần ngay trang này); (b) prefetch (có thể cần ở trang sau).
- 3
Lazy cho iframe
Một bản đồ nhúng bằng iframe nằm tận cuối trang. Viết thuộc tính giúp hoãn tải nó.
✅ Hoàn thành khi: iframe có loading="lazy" (vì nằm xa phía dưới, hoãn tải tới khi cuộn gần tới).
- 4
Liệt kê nền tốc độ
Kể ba thứ đã học ở các bài trước góp phần làm trang nhanh, mỗi thứ một câu.
✅ Hoàn thành khi: Nêu: srcset (ảnh đúng cỡ), defer/async (script không chặn), HTML semantic gọn gàng (hoặc loading=lazy).
- 5
Bắt lỗi lạm dụng preload
Một bạn preload cả 30 ảnh trong trang "cho chắc". Giải thích vì sao việc này phản tác dụng.
✅ Hoàn thành khi: Nêu: preload nhiều thứ làm chúng giành băng thông, thứ thật sự quan trọng bị chậm; chỉ preload vài tài nguyên then chốt.
- 6
Đo trước khi tối ưu
Bằng lời mèo con, giải thích vì sao nên ĐO tốc độ trang (vd bằng Lighthouse) trước khi thêm các hint.
✅ Hoàn thành khi: Nêu: đo để biết chỗ nào thật sự chậm rồi sửa đúng chỗ, tránh tối ưu mò không hiệu quả.