Bỏ qua điều hướng

Trình duyệt web (web browser) là gì và hoạt động ra sao?

Trình duyệt gồm bảy thành phần, cùng nhau biến mã HTML/CSS tải về thành pixel trên màn hình và cô lập từng tab để bảo vệ dữ liệu của bạn.

Tuan Tran Van
20 phút đọc
Mục lục (10 phần)
  1. Trình duyệt web là gì?
  2. Bên trong một trình duyệt có những gì?
  3. Từ lúc gõ URL đến byte đầu tiên
  4. Trình duyệt đọc HTML và CSS như thế nào?
  5. Từ cây DOM đến pixel trên màn hình
  6. Vì sao trang web bị giật và tải chậm?
  7. Trình duyệt bảo vệ bạn tới đâu?
  8. Vì sao cùng một trang lại hiển thị khác nhau?
  9. Hiểu trình duyệt đổi được gì trong cách bạn viết web?
  10. Tài liệu tham khảo

Trình duyệt web (web browser) là phần mềm ứng dụng dùng để truy cập, truy xuất và hiển thị nội dung từ mạng lưới toàn cầu World Wide Web.

Nhiều người vẫn lẫn lộn giữa trình duyệt và bộ máy tìm kiếm (search engine) như Google hay Bing. Hai thứ này khác nhau: trình duyệt là chương trình chạy cục bộ trên thiết bị của bạn, đóng vai trò một client. Còn bộ máy tìm kiếm là dịch vụ chạy trên hệ thống máy chủ từ xa, được bạn truy cập thông qua chính trình duyệt đó.

Dưới góc độ một kỹ sư hệ thống, trình duyệt là một "động cơ hiển thị" (rendering engine) cực kỳ phức tạp, chứ không phải cửa sổ xem ảnh hay đọc tin. Nhiệm vụ cốt lõi của nó là tải về các tài liệu kỹ thuật, thông dịch những dòng mã khô khan và chuyển chúng thành giao diện đồ họa mà con người tương tác được. Trong vòng chưa đầy một giây, trình duyệt phải thực hiện hàng nghìn phép tính và kết nối mạng để bạn thấy được nội dung mình cần.

Hiểu rõ cơ chế này là bước đầu tiên để tối ưu hiệu năng và bảo mật cho mọi sản phẩm số.

Trình duyệt web nhận mã nguồn tải về từ máy chủ và dựng thành trang web hiển thị trên màn hình

Trình duyệt web là gì?

Trình duyệt web là một trình thông dịch (translator) đa năng. Khi bạn yêu cầu một trang web, trình duyệt nhận dữ liệu thô từ máy chủ dưới dạng các gói tin (packets). Sau đó nó áp dụng các quy chuẩn web để tái cấu trúc dữ liệu này thành văn bản, hình ảnh và video. Không có trình duyệt, internet chỉ là một kho chứa tệp văn bản thuần và mã nguồn mà mắt thường không xử lý hiệu quả được. Trình duyệt chính là công cụ dân chủ hóa thông tin, đưa mã nguồn phức tạp về dạng giao diện con người.

Lược sử phát triển của trình duyệt phản ánh chính xác sự tiến hóa của hạ tầng mạng toàn cầu. Năm 1990, Tim Berners-Lee tạo ra WorldWideWeb (sau này đổi tên thành Nexus) — trình duyệt đầu tiên hỗ trợ siêu văn bản nhưng chỉ ở mức sơ khai. Năm 1991, Line Mode Browser xuất hiện, cho phép các thiết bị đầu cuối cũ hơn cũng truy cập được web. Bước ngoặt thực sự xảy ra vào năm 1993 với Mosaic — trình duyệt đầu tiên hiển thị hình ảnh trực tiếp cùng văn bản thay vì mở trong một cửa sổ riêng. Đây là tiền thân của Netscape Navigator (1994) và cuộc chiến trình duyệt với Internet Explorer sau này.

Với các mô hình kinh doanh số hiện nay, trình duyệt là cổng giao tiếp (gateway) bắt buộc của thương mại điện tử lẫn phần mềm dịch vụ (SaaS). Cách trình duyệt xử lý trang web ảnh hưởng trực tiếp đến tỷ lệ chuyển đổi và niềm tin của khách hàng. Trang hiển thị lỗi hoặc chạy chậm thì người dùng rời đi ngay. Vì vậy các doanh nghiệp luôn phải đầu tư tối ưu trải nghiệm trên những rendering engine phổ biến nhất.

Các trình duyệt phổ biến hiện nay và thành phần kỹ thuật cốt lõi của chúng:

Trình duyệtHãng phát triểnĐộng cơ hiển thị (Rendering Engine)Trình thông dịch JS (JavaScript Engine)
Google ChromeGoogleBlinkV8
Mozilla FirefoxMozillaGeckoSpiderMonkey
Apple SafariAppleWebKitJavaScriptCore
Microsoft EdgeMicrosoftBlinkV8
BraveBrave SoftwareBlinkV8

Bên trong một trình duyệt có những gì?

Một trình duyệt hiện đại là cả một hệ thống đa lớp, chứ không phải chương trình đơn lẻ: nhiệm vụ được phân tách rõ rệt để tối ưu tài nguyên. Cấu trúc này thường được chia thành 7 thành phần cốt lõi:

  1. Giao diện người dùng (User Interface - UI): Gồm thanh địa chỉ, nút tiến/lùi, menu và tất cả các phần ngoài cửa sổ hiển thị nội dung chính.
  2. Trình điều khiển trình duyệt (Browser Engine): Trung tâm điều phối, chịu trách nhiệm chuyển tiếp các câu lệnh giữa UI và Rendering Engine.
  3. Trình dựng hình (Rendering Engine): "Trái tim" của trình duyệt, chuyên trách việc thông dịch HTML/CSS và vẽ nội dung lên màn hình.
  4. Mạng (Networking): Xử lý các giao thức HTTP/HTTPS, quản lý DNS và các kết nối TCP/TLS.
  5. Trình thông dịch JavaScript (JavaScript Engine): Chịu trách nhiệm thực thi mã kịch bản để tạo tính tương tác.
  6. Bộ đệm hiển thị (UI Backend): Sử dụng các hàm vẽ cơ bản của hệ điều hành để vẽ cửa sổ, hộp thoại và tiện ích cơ bản. Đây là lớp giao tiếp trực tiếp với các thư viện đồ họa của hệ thống.
  7. Lưu trữ dữ liệu (Data Storage): Lớp lưu trữ cục bộ giúp trình duyệt ghi nhớ trạng thái người dùng.

Bảy thành phần bên trong một trình duyệt xếp thành các lớp: giao diện người dùng, browser engine, rendering engine, mạng, JavaScript engine, UI backend và lưu trữ dữ liệu

Trong phần lưu trữ, bạn cần phân biệt rõ các loại hình lưu trữ web. Cookie thường dùng cho tác vụ định danh và theo dõi phiên làm việc nhỏ gọn. LocalStorage lưu dữ liệu dạng chuỗi bền vững ngay trên thiết bị người dùng. Với các ứng dụng web phức tạp cần quản lý dữ liệu lớn và có cấu trúc, trình duyệt cung cấp IndexedDB — một hệ quản trị cơ sở dữ liệu phi quan hệ (NoSQL) chạy ngay trong trình duyệt. Chọn đúng loại lưu trữ ảnh hưởng trực tiếp đến tốc độ truy xuất của ứng dụng.

Các thành phần này phối hợp với nhau theo một luồng dữ liệu nghiêm ngặt. Khi bạn nhập một địa chỉ, Browser Engine ra lệnh cho thành phần Networking đi lấy dữ liệu. Dữ liệu thô sau khi tải về được Rendering Engine phân tích. Nếu gặp mã JavaScript, Rendering Engine tạm dừng để chuyển quyền điều khiển cho JavaScript Engine. Chrome dùng V8 với cơ chế biên dịch JIT (Just-In-Time) cực nhanh, trong khi Safari dựa vào JavaScriptCore để tối ưu điện năng. Hiệu quả của các engine này quyết định việc bạn cảm thấy trang web "mượt" hay "lag".

UI Backend là thành phần giữ cho giao diện nhất quán. Nó không tự vẽ mọi thứ mà gọi các nguyên mẫu (primitives) của hệ điều hành để tạo widget. Nhờ vậy trình duyệt tiêu tốn ít tài nguyên hơn khi vẽ các thành phần hệ thống như scrollbar hay cửa sổ thông báo, đồng thời hòa hợp tốt hơn với giao diện tổng thể của macOS, Windows hay Linux mà bạn đang dùng.

Từ lúc gõ URL đến byte đầu tiên

Quá trình từ lúc bạn nhấn Enter đến khi trình duyệt nhận được byte dữ liệu đầu tiên (Time to First Byte - TTFB) là một hành trình tốn kém về độ trễ (latency). Đầu tiên là bước phân giải DNS. Trình duyệt cần ánh xạ tên miền dễ nhớ như google.com thành địa chỉ IP thực tế của máy chủ. Nếu thông tin này không nằm trong bộ nhớ đệm (cache), trình duyệt phải gửi yêu cầu qua nhiều cấp máy chủ DNS. Trên mạng di động, độ trễ này đặc biệt nghiêm trọng do tín hiệu phải đi từ thiết bị qua tháp phát sóng trước khi chạm tới internet.

Hành trình từ lúc gõ URL đến byte đầu tiên: phân giải DNS, bắt tay ba bước TCP, thương lượng TLS rồi mới đến request HTTP

Sau khi có IP, trình duyệt mở kết nối bằng cú bắt tay 3 bước của TCP (TCP three-way handshake). Đây là giai đoạn trình duyệt và máy chủ thương lượng các thông số kết nối.

  1. SYN: Trình duyệt gửi gói tin yêu cầu kết nối.
  2. SYN-ACK: Máy chủ phản hồi xác nhận và gửi lại yêu cầu kết nối của mình.
  3. ACK: Trình duyệt xác nhận lần cuối để thiết lập phiên.

Với HTTPS, quá trình thương lượng TLS (TLS negotiation) tốn thêm khoảng 5 lượt đi-về (round trips) nữa để trao đổi chứng chỉ và khóa mã hóa. Tổng cộng, trình duyệt mất tới 8 lượt đi-về trước khi có thể gửi yêu cầu HTTP thực sự.

Khi kết nối đã an toàn, trình duyệt gửi một HTTP Request. Cấu trúc thực tế của một Request và Response:

http
/* HTTP Request */
GET /index.html HTTP/1.1
Host: example.com
Accept: text/html,application/xhtml+xml
 
/* HTTP Response Header */
HTTP/1.1 200 OK
Content-Type: text/html; charset=UTF-8
Server: Apache/2.4.41
X-XSS-Protection: 1; mode=block
X-Frame-Options: SAMEORIGIN

Một cơ chế mà mọi kỹ sư cần nắm là TCP Slow Start (khởi đầu chậm). Do chưa biết khả năng tải của mạng, máy chủ không gửi ngay toàn bộ tệp tin. Nó bắt đầu với một cửa sổ tắc nghẽn (Congestion Window - CWND) ban đầu, thường là 10 phân đoạn MSS (Maximum Segment Size). Với mỗi MSS tiêu chuẩn là 1500 bytes, lượng dữ liệu đầu tiên máy chủ gửi thường gói gọn trong khoảng 14KB. Thuật toán này tăng gấp đôi CWND sau mỗi lần nhận được xác nhận (ACK) thành công, từ 10 lên 20 rồi 40 MSS. Nếu bạn tối ưu được các thành phần quan trọng của trang (như CSS và HTML cơ bản) nằm gọn trong 14KB đầu tiên này, trang web sẽ hiển thị gần như tức thì.

Trình duyệt đọc HTML và CSS như thế nào?

Khi byte dữ liệu đầu tiên cập bến, trình duyệt không đứng đợi tải xong toàn bộ mà bắt đầu quá trình phân giải (parsing) ngay lập tức để tiết kiệm thời gian. Trình duyệt mã hóa các ký tự nhận được thành các token như StartTag, EndTag, Attribute. Từ các token này, nó xây dựng một cấu trúc cây gọi là mô hình đối tượng tài liệu (Document Object Model - DOM). DOM là đại diện kỹ thuật của nội dung trang web: mỗi thẻ HTML trở thành một nút (node) trong hệ thống phân cấp chặt chẽ.

Trình duyệt đọc HTML và CSS song song thành hai cây riêng biệt là DOM và CSSOM, trong khi preload scanner chạy trước để tải sớm tài nguyên ưu tiên

Trong khi luồng chính (main thread) bận rộn xây dựng DOM, một thành phần quan trọng khác là preload scanner chạy trước để quét mã nguồn. Nó tìm các tài nguyên có ưu tiên cao như tệp CSS, font chữ hoặc JavaScript. Nhờ cơ chế này, trình duyệt bắt đầu tải các tệp phụ trợ ngay lập tức thay vì đợi đến khi trình phân giải HTML đọc tới dòng chứa liên kết của chúng. Kết quả là thời gian chờ (blocking) trong quá trình dựng hình giảm tối đa.

Song song với DOM, trình duyệt xây dựng mô hình đối tượng CSS (CSS Object Model - CSSOM). Nó đọc các quy tắc CSS và áp dụng chúng theo cơ chế phân cấp (cascade) từ tổng quát đến chi tiết. CSSOM là cấu trúc cây độc lập chứa thông tin về phong cách của các node. CSS là tài nguyên render-blocking: trình duyệt không vẽ bất cứ thứ gì lên màn hình cho đến khi xây dựng xong CSSOM hoàn chỉnh, vì vẽ sớm thì giao diện sẽ vỡ cục bộ trước khi nhận được phong cách cuối cùng.

Một tác nhân gây tắc nghẽn khác là JavaScript. Theo mặc định, các thẻ script không có thuộc tính async hoặc defer sẽ là parser-blocking. Khi gặp một thẻ script như vậy, trình duyệt phải dừng việc xây dựng DOM để tải và thực thi mã JavaScript, vì script có quyền thay đổi DOM. Nếu bạn có một tệp JS nặng 2MB ở ngay đầu trang, người dùng sẽ nhìn màn hình trắng trong một khoảng thời gian dài. Giải pháp luôn là dùng defer để việc phân giải HTML tiếp tục diễn ra trong khi tệp JS được tải ngầm.

Từ cây DOM đến pixel trên màn hình

Sau khi đã có DOM và CSSOM, trình duyệt bắt đầu giai đoạn thực thi đồ họa. Đầu tiên là cây hiển thị (Render Tree): trình duyệt kết hợp DOM và CSSOM để xác định những phần tử nào thực sự hiển thị. Lưu ý một điểm hay nhầm: các node có thuộc tính display: none bị loại bỏ hoàn toàn khỏi Render Tree, còn các node có visibility: hidden vẫn được giữ lại vì chúng vẫn chiếm không gian hình học trên trang.

Đường đi từ cây DOM tới pixel trên màn hình: Render Tree, bố cục Layout, vẽ Paint rồi hợp nhất lớp Compositing

Tiếp theo là công đoạn bố cục (Layout/Reflow). Tại đây, trình duyệt bắt đầu từ nút gốc và tính toán kích thước, vị trí chính xác của từng phần tử dựa trên kích thước khung nhìn (viewport). Mọi thứ trên web về cơ bản là những chiếc hộp. Trình duyệt phải xác định một hộp rộng bao nhiêu pixel, nằm cách lề bao nhiêu, dựa trên kích thước màn hình thiết bị của bạn. Nếu bạn thay đổi kích thước cửa sổ trình duyệt, quá trình reflow này phải chạy lại toàn bộ.

Sau khi có tọa độ, trình duyệt bước vào công đoạn vẽ (Paint/Rasterization). Nó chuyển các thông số hình học thành pixel thực tế trên màn hình, gồm việc đổ màu, vẽ biên, bóng và văn bản. Để tối ưu, trình duyệt dùng cơ chế hợp nhất lớp (Compositing): nó tách trang web thành nhiều lớp riêng biệt, rồi đẩy các lớp này xuống GPU xử lý thay vì CPU. Khi bạn cuộn trang hoặc chạy hiệu ứng animation, GPU chỉ cần di chuyển vị trí của các lớp thay vì vẽ lại từng pixel từ đầu.

Để tăng tốc độ hiển thị, các kỹ sư thường dùng thuộc tính CSS để ép trình duyệt tạo ra một layer mới trên GPU. Hiệu ứng nhờ vậy mượt hơn hẳn:

css
/* Sử dụng transform hoặc will-change để ép tạo layer mới trên GPU */
.element-to-animate {
  will-change: transform;
  /* Thủ thuật translateZ(0) kích hoạt 3D rendering trên GPU để tối ưu hóa lớp */
  transform: translateZ(0);
}

Vì sao trang web bị giật và tải chậm?

Trình duyệt về bản chất là một hệ thống đơn luồng (single-thread). Luồng chính phải gánh gần như mọi công việc: từ phân giải HTML, xây dựng cây DOM, tính toán bố cục cho đến thực thi JavaScript. Nếu bạn viết một đoạn mã JavaScript xử lý logic quá nặng, nó chiếm dụng luồng chính và khiến trình duyệt không thể phản hồi bất kỳ tương tác nào từ người dùng, kể cả cuộn trang hay nhấn nút. Đây chính là nguyên nhân gốc rễ của hiện tượng "đơ" trình duyệt.

Luồng chính đơn luồng với ngân sách 16.67ms cho mỗi khung hình: một tác vụ nặng chiếm luồng khiến trang bị giật

Để đạt trải nghiệm mượt 60 khung hình trên giây, trình duyệt chỉ có đúng 16.67ms để hoàn thành toàn bộ chu trình xử lý cho một khung hình. Nếu tổng thời gian tính toán bố cục và vẽ vượt quá con số này, hiện tượng giật (jank) sẽ xuất hiện. Với thiết bị di động cấu hình yếu, ngưỡng 16.67ms là một thử thách thực sự. Mọi phép tính dư thừa trong CSS hay JS đều có thể phá vỡ ngưỡng đó.

Một chỉ số kỹ thuật quan trọng khác là thời gian tương tác (Time to Interactive - TTI). TTI đo khoảng thời gian từ khi bắt đầu tải trang đến khi trang có khả năng phản hồi tương tác người dùng trong vòng 50ms. Rất nhiều trang web hiện nay mắc lỗi "giao diện hiển thị xong nhưng không nhấn được". Lỗi đó xảy ra khi bạn nhồi quá nhiều script nặng. Dù trình duyệt đã vẽ xong giao diện (First Contentful Paint), luồng chính vẫn đang mải miết thực thi và biên dịch đống JS đó, khiến người dùng cảm thấy trang web bị liệt.

Vấn đề của tài nguyên lớn không dừng lại ở băng thông. Ngay cả khi người dùng có mạng cực nhanh, một tệp JavaScript khổng lồ vẫn cần CPU mạnh để phân tích và biên dịch. Trên những chiếc điện thoại Android tầm thấp, việc thực thi 2MB JS có thể tốn vài giây CPU, khiến thiết bị nóng lên và pin sụt nhanh. Là một kỹ sư, bạn không nên chỉ nhìn vào tốc độ tải tệp mà phải nhìn vào khối lượng công việc bạn đang ép CPU của người dùng phải làm.

Trình duyệt bảo vệ bạn tới đâu?

Trình duyệt là tuyến phòng thủ đầu tiên và quan trọng nhất đối với người dùng cuối. Cơ chế đầu tiên là HTTPS và TLS, đảm bảo mọi dữ liệu trao đổi giữa máy tính của bạn và máy chủ được mã hóa hoàn toàn. Không có lớp này, mọi mật khẩu hay thông tin thẻ tín dụng đều có thể bị bên thứ ba đọc trộm trên đường truyền. Trình duyệt hiện nay cảnh báo ngay lập tức nếu bạn truy cập một trang chỉ dùng giao thức HTTP cũ.

Các lớp bảo vệ của trình duyệt: mã hoá HTTPS/TLS, cô lập sandbox từng tab và thuộc tính SameSite cho cookie

Cơ chế sandboxing (cô lập) là một thành tựu quan trọng của kiến trúc trình duyệt hiện đại. Mỗi tab hoặc mỗi tiến trình web chạy trong một "hộp cát" riêng biệt, tách khỏi hệ điều hành. Nếu bạn vô tình truy cập một trang chứa mã độc, mã độc đó chỉ phá phách được bên trong tab đó mà không lây sang tệp tin hệ thống hoặc đánh cắp dữ liệu ở các tab khác. Đây là lý do Chrome hay Edge tiêu tốn nhiều RAM: chúng nhân bản nhiều tiến trình để đảm bảo sự cô lập.

Về quyền riêng tư, thuộc tính SameSite cho cookie là một bước tiến lớn để chống lại tấn công giả mạo yêu cầu chéo trang (CSRF). Chrome 51, phát hành năm 2016, là phiên bản đầu tiên áp dụng chuẩn này, giúp ngăn các trang web độc hại tự ý gửi cookie của người dùng đến những dịch vụ khác mà họ đang đăng nhập. Tuy nhiên, các trình duyệt áp dụng chuẩn này không đồng đều. Safari chẳng hạn có cơ chế ngăn chặn theo dõi (Intelligent Tracking Prevention) khắt khe hơn, đôi khi gây khó cho nhà phát triển nhưng lại bảo vệ người dùng tốt hơn trước các mạng lưới quảng cáo.

Để duy trì tính an toàn, các hãng trình duyệt vận hành những chương trình Bug Bounty (săn lỗi nhận thưởng). Google hay Mozilla sẵn sàng chi trả hàng chục nghìn USD cho bất kỳ ai tìm ra lỗ hổng bảo mật trong engine của họ. Những khoản đầu tư này giúp trình duyệt được vá liên tục, biến chúng thành một trong những phần mềm an toàn nhất bạn từng dùng. Hãy luôn giữ trình duyệt ở phiên bản mới nhất để nhận được các bản vá đó.

Vì sao cùng một trang lại hiển thị khác nhau?

Các engine phân mảnh là nguyên nhân chính khiến cùng một dòng mã CSS lại hiển thị khác nhau trên mỗi trình duyệt. Dù các tổ chức như W3C nỗ lực đưa ra tiêu chuẩn chung, cách Blink (Chrome/Edge), Gecko (Firefox) và WebKit (Safari) thông dịch mã nguồn luôn có những sai số nhỏ. Một thuộc tính CSS mới có thể hoạt động hoàn hảo trên Chrome nhưng bị Safari phớt lờ do chưa kịp cập nhật API tương ứng.

Ba engine hiển thị Blink, Gecko và WebKit thông dịch cùng một trang web theo cách khác nhau

Apple có một chính sách gây nhiều tranh cãi: trên iOS, mọi trình duyệt kể cả Chrome hay Firefox đều phải dùng engine WebKit của Apple. Từ iOS 17.4, Apple mở cửa cho engine khác, nhưng chỉ với người dùng trong Liên minh châu Âu và kèm những điều kiện cấp phép ngặt nghèo, nên ngoài EU thì WebKit vẫn là bắt buộc. Ràng buộc đó tạo ra một "nỗi đau" về tương thích cho nhà phát triển, vì bạn không tận dụng được các tính năng web mới nhất trên iOS nếu WebKit chưa hỗ trợ. Đây là hiện tượng độ trễ tiêu chuẩn: một trình duyệt kìm hãm sự phát triển của công nghệ web vì lộ trình cập nhật chậm.

Chính vì những lý do trên, kiểm thử đa trình duyệt (cross-browser testing) là yêu cầu bắt buộc với bất kỳ kỹ sư chuyên nghiệp nào. Bạn không thể chỉ kiểm tra trên Chrome rồi mặc định nó chạy tốt trên mọi thiết bị. Sự khác biệt về mật độ điểm ảnh (DPI), khả năng xử lý của GPU và phiên bản hệ điều hành khiến kiểm thử trên thiết bị thật trở nên đặc biệt quan trọng. Chỉ một lỗi nhỏ trong cách Render Tree tính layout trên Safari di động cũng có thể phá hỏng hoàn toàn quy trình thanh toán của khách hàng.

Hãy dùng các công cụ như BrowserStack hoặc phòng lab thiết bị để kiểm tra sản phẩm trên ít nhất 3 engine lớn và các phiên bản hệ điều hành phổ biến nhất của 2 năm gần đây. Một kỹ sư giỏi luôn chuẩn bị cho trường hợp xấu nhất — người dùng mở trang bằng trình duyệt cũ trên thiết bị yếu — và đảm bảo sản phẩm vẫn vận hành ở mức chấp nhận được (graceful degradation).

Hiểu trình duyệt đổi được gì trong cách bạn viết web?

Viết code không dừng lại ở chỗ làm cho nó chạy — nó còn phải chạy hài hòa với cơ chế vận hành của trình duyệt. Bạn không thể chiến đấu chống lại cách trình duyệt xử lý luồng chính; hãy nương theo nó. Cụ thể, có bốn việc đáng làm trước tiên:

  • Dùng async hoặc defer cho tất cả script không thiết yếu để giải phóng luồng phân giải HTML.
  • Khai báo rõ kích thước (width/height) cho hình ảnh để trình duyệt dành sẵn không gian trong công đoạn Layout, tránh hiện tượng nhảy trang khi ảnh tải xong.
  • Cắt nhỏ tài nguyên CSS và HTML sao cho phần hiển thị đầu tiên (above the fold) nằm gọn trong 14KB dữ liệu đầu tiên, để tận dụng tối đa TCP Slow Start.
  • Hạn chế các hiệu ứng làm thay đổi thuộc tính layout như margin hay width trong animation, thay vào đó dùng transform để tận dụng GPU.

Hiểu rõ vòng đời của một byte dữ liệu — từ khi rời máy chủ cho đến khi trở thành một pixel trên màn hình — mới là thứ tách một kỹ sư giỏi khỏi người chỉ thuộc lòng cú pháp ngôn ngữ.

Tài liệu tham khảo

Chia sẻ bài viết

X / TwitterFacebookLinkedIn