← HTML: cấu trúc & semantic

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:

Trình duyệtđọc gợi ýrel="preconnect"Mở sẵn kết nối tới domain khác (font, ảnh…)rel="preload"Tải sớm thứ CẦN NGAY ở trang này (font, ảnh hero)rel="prefetch"Tải trước thứ CÓ THỂ cần ở trang SAU
Các gợi ý link rel giúp trình duyệt chuẩn bị tài nguyên trước khi thật sự cần.

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

Đừng preload mọi thứ "cho chắc". preload kéo tài nguyên lên ưu tiên cao; preload quá nhiều thì chúng giành băng thông lẫn nhau, làm thứ thật sự quan trọng chậm đi. Chỉ preload vài tài nguyên then chốt cho lần hiện đầu tiên.

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

Tối ưu hiệu năng web là cả một lĩnh vực rộng (Core Web Vitals, critical rendering path, nén, cache…). Bài này chỉ chạm phần thuộc HTML. Đừng lo phải nhớ hết - nắm tư duy "đo rồi mới sửa" và vài công cụ nền là đủ cho giờ; phần sâu để dành khoá hiệu năng riêng.

Bước tiếp theo

Hết phần nâng cao! Mèo con giờ đã hiểu cả cách site thật giữ cho trang nhanh. Đã đến lúc xắn tay áo: bốn bài cuối là dự án thực hành dựng trang thật. Bài kế là dự án đầu tiên - trang web bán hàng.

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.

Được. Giống ảnh, một iframe (vd nhúng bản đồ, video) nằm xa phía dưới có thể đặt loading="lazy" để hoãn tải tới khi người dùng cuộn gần tới. iframe thường nặng nên lazy giúp trang mở nhanh hơn rõ rệt.

Không hẳn. Resource hints là gia vị; phần lớn tốc độ đến từ nền tảng: ảnh đúng cỡ (srcset), script không chặn (defer/async), HTML gọn gàng, và máy chủ tốt. Quan trọng nhất là ĐO trước khi tối ưu - đừng rải hint khắp nơi theo cảm tính.

Tick những điều em tự tin làm được. Càng lên cao, em càng hiểu sâu.

Tick những điều em tự tin làm được sau khi học bài này. 0/6

Trả lời vài câu để chắc rằng em đã nắm bài.

Câu 1/3 Điểm: 0

preload khác prefetch ở điểm chính nào?

Bài tập về nhà

  1. 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. 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. 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. 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. 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. 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ả.