Giảm phạm vi và độ phức tạp của việc tính toán kiểu

JavaScript thường là yếu tố kích hoạt cho những thay đổi về hình ảnh. Đôi khi, lớp này thực hiện các thay đổi đó trực tiếp thông qua thao tác với kiểu, và đôi khi thông qua các phép tính dẫn đến thay đổi về hình ảnh, chẳng hạn như tìm kiếm hoặc sắp xếp dữ liệu. JavaScript chạy trong thời gian không phù hợp hoặc chạy trong thời gian dài có thể là nguyên nhân phổ biến gây ra các vấn đề về hiệu suất. Bạn nên tìm cách giảm thiểu tác động của JavaScript khi có thể.

Tính toán kiểu

Việc thay đổi DOM bằng cách thêm và xoá các phần tử, thay đổi thuộc tính, lớp hoặc phát ảnh động sẽ khiến trình duyệt phải tính toán lại kiểu phần tử và trong nhiều trường hợp, bố cục của một phần hoặc toàn bộ trang. Quá trình này được gọi là tính toán kiểu.

Trình duyệt bắt đầu tính toán kiểu bằng cách tạo một tập hợp các bộ chọn phù hợp để xác định lớp, bộ chọn giả và mã nhận dạng áp dụng cho bất kỳ phần tử nào. Sau đó, trình xử lý này sẽ xử lý các quy tắc kiểu từ bộ chọn phù hợp và xác định kiểu cuối cùng của phần tử.

Vai trò của tính năng tính toán lại kiểu trong độ trễ tương tác

Tương tác với Nội dung hiển thị tiếp theo (INP) là một chỉ số hiệu suất trong thời gian chạy tập trung vào người dùng, đánh giá khả năng phản hồi tổng thể của một trang đối với hoạt động đầu vào của người dùng. Chỉ số này đo lường độ trễ tương tác từ khi người dùng tương tác với trang cho đến khi trình duyệt hiển thị khung tiếp theo và hiển thị nội dung cập nhật trực quan tương ứng cho giao diện người dùng.

Một thành phần quan trọng của một hoạt động tương tác là thời gian cần thiết để vẽ khung tiếp theo. Công việc kết xuất được thực hiện để hiển thị khung hình tiếp theo bao gồm nhiều phần, bao gồm cả việc tính toán kiểu trang xảy ra ngay trước khi bố cục, sơn và kết hợp. Hướng dẫn này tập trung vào chi phí tính toán kiểu, nhưng việc giảm bất kỳ phần nào trong tổng thời lượng kết xuất của lượt tương tác cũng làm giảm tổng độ trễ.

Giảm độ phức tạp của bộ chọn

Việc đơn giản hoá bộ chọn CSS có thể giúp tăng tốc độ tính toán kiểu của trang. Bộ chọn đơn giản nhất tham chiếu đến một phần tử trong CSS chỉ bằng tên lớp:

.title {
  /* styles */
}

Tuy nhiên, khi bất kỳ dự án nào phát triển, dự án đó có thể cần CSS phức tạp hơn và bạn có thể kết thúc bằng các bộ chọn có dạng như sau:

.box:nth-last-child(-n+1) .title {
  /* styles */
}

Để xác định cách áp dụng các kiểu này cho trang, trình duyệt phải hỏi một cách hiệu quả "đây có phải là phần tử có lớp title với phần tử mẹ là lớp box, là phần tử con minus-nth-plus-1 của phần tử mẹ không? Trình duyệt có thể mất chút thời gian để tìm hiểu điều này. Để đơn giản hoá việc này, bạn có thể thay đổi bộ chọn thành tên lớp cụ thể hơn:

.final-box-title {
  /* styles */
}

Những tên lớp thay thế này có vẻ hơi khó hiểu, nhưng giúp công việc của trình duyệt trở nên đơn giản hơn nhiều. Ví dụ: trong phiên bản trước, để trình duyệt biết một phần tử là phần tử cuối cùng thuộc loại đó, trước tiên, trình duyệt phải biết mọi thứ về tất cả các phần tử khác để xác định xem có phần tử nào sau đó có thể là nth-last-child hay không. Việc này có thể tốn kém nhiều hơn so với việc so khớp bộ chọn với một phần tử dựa trên tên lớp duy nhất.

Giảm số lượng phần tử được tạo kiểu

Một yếu tố khác cần cân nhắc về hiệu suất (và thường quan trọng hơn độ phức tạp của bộ chọn) là lượng công việc cần thực hiện khi một phần tử thay đổi.

Nói chung, chi phí trong trường hợp xấu nhất khi tính toán kiểu phần tử đã tính là số lượng phần tử nhân với số lượng bộ chọn, vì trình duyệt cần kiểm tra từng phần tử ít nhất một lần so với mọi kiểu để xem kiểu có khớp hay không.

Các phép tính kiểu có thể trực tiếp nhắm đến một vài phần tử thay vì vô hiệu hoá toàn bộ trang. Trong các trình duyệt hiện đại, vấn đề này có xu hướng ít xảy ra hơn vì trình duyệt không phải lúc nào cũng cần kiểm tra tất cả các phần tử mà thay đổi có thể ảnh hưởng. Mặt khác, các trình duyệt cũ không phải lúc nào cũng được tối ưu hoá cho những tác vụ như vậy. Khi có thể, bạn nên giảm số lượng phần tử không hợp lệ.

Đo lường chi phí tính toán lại kiểu

Có một số cách để bạn có thể đo lường chi phí tính toán lại kiểu trong trình duyệt. Mỗi phương thức phụ thuộc vào việc bạn muốn đo lường trong trình duyệt trong môi trường phát triển hay bạn muốn đo lường thời gian thực hiện quy trình này cho người dùng thực trên trang web của mình.

Đo lường chi phí tính toán lại kiểu trong Chrome DevTools

Một cách để đo lường chi phí tính toán lại kiểu là sử dụng bảng điều khiển hiệu suất trong Công cụ của Chrome cho nhà phát triển. Hãy làm như sau để bắt đầu:

  1. Mở Công cụ cho nhà phát triển.
  2. Chuyển đến thẻ Hiệu suất.
  3. Đánh dấu vào hộp Số liệu thống kê về bộ chọn (không bắt buộc).
  4. Nhấp vào Record (Ghi).
  5. Tương tác với trang.

Khi dừng quay, bạn sẽ thấy hình ảnh như sau:

Công cụ cho nhà phát triển hiển thị kết quả tính toán kiểu.
Báo cáo trong Công cụ cho nhà phát triển cho thấy các phép tính về kiểu.

Dải ở trên cùng là biểu đồ ngọn lửa thu nhỏ cũng biểu thị số khung hình/giây. Hoạt động càng gần cuối dải, thì trình duyệt càng vẽ nhanh các khung hình. Nếu bạn thấy biểu đồ hình ngọn lửa ở trên cùng bằng các thanh màu đỏ phía trên, thì có nghĩa là công việc của bạn đang gây ra các khung hình chạy trong thời gian dài.

Phóng to một khu vực gặp sự cố trong Công cụ của Chrome cho nhà phát triển trong phần tóm tắt hoạt động của bảng điều khiển hiệu suất đã điền sẵn trong Công cụ của Chrome cho nhà phát triển.
Khung chạy trong thời gian dài trong phần tóm tắt hoạt động của DevTools.

Bạn nên xem xét kỹ hơn các khung hình chạy trong thời gian dài trong một hoạt động tương tác như cuộn. Nếu bạn thấy một khối màu tím lớn, hãy phóng to hoạt động đó và chọn bất kỳ công việc nào có nhãn Tính toán lại kiểu để biết thêm thông tin về công việc tính toán lại kiểu có thể tốn kém.

Lấy thông tin chi tiết về các phép tính kiểu lâu dài, bao gồm cả thông tin quan trọng như số lượng phần tử bị ảnh hưởng bởi công việc tính toán lại kiểu.
Quá trình tính toán lại kiểu lâu dài chỉ mất hơn 25 mili giây trong phần tóm tắt Công cụ cho nhà phát triển.

Khi nhấp vào sự kiện, bạn sẽ thấy ngăn xếp lệnh gọi của sự kiện đó. Nếu hoạt động kết xuất là do một lượt tương tác của người dùng gây ra, thì hoạt động này sẽ gọi ra JavaScript đã kích hoạt thay đổi kiểu. Thông tin này cũng cho biết số lượng phần tử bị ảnh hưởng bởi thay đổi (chỉ hơn 900 phần tử trong trường hợp này) và thời gian tính toán kiểu. Bạn có thể sử dụng thông tin này để bắt đầu tìm cách khắc phục trong mã của mình.

Nếu bạn đã đánh dấu hộp đánh dấu Thống kê bộ chọn trong phần cài đặt Bảng điều khiển hiệu suất trước khi theo dõi, thì bảng điều khiển dưới cùng trong dấu vết sẽ có thêm một thẻ cùng tên.

Bảng số liệu thống kê về bộ chọn CSS khi xuất hiện trong bảng điều khiển hiệu suất của Công cụ của Chrome cho nhà phát triển. Bảng này chứa các tiêu đề và dữ liệu tương ứng cho các thông tin như thời gian đã trôi qua, số lần khớp, số lần khớp, tỷ lệ phần trăm các nút không khớp, bộ chọn và trang tính kiểu có thể chứa các nút đó.
Bảng số liệu thống kê về bộ chọn như hiển thị trong bảng điều khiển hiệu suất của Chrome DevTools.

Bảng điều khiển này cung cấp dữ liệu hữu ích về chi phí tương đối của từng bộ chọn, cho phép bạn xác định các bộ chọn CSS tốn kém.

Để biết thêm thông tin, hãy xem tài liệu về Số liệu thống kê về bộ chọn CSS.

Đo lường chi phí tính toán lại kiểu cho người dùng thực

Nếu bạn muốn biết mất bao lâu để việc tính toán lại kiểu diễn ra đối với người dùng thực sự trên trang web của bạn, thì API Khung ảnh động dài sẽ cung cấp cho bạn các công cụ cần thiết để thực hiện việc đó. Dữ liệu từ API này đã được thêm vào thư viện JavaScript web-vitals, bao gồm cả thời gian tính toán lại kiểu.

Nếu nghi ngờ độ trễ hiển thị của một lượt tương tác là yếu tố chính góp phần vào INP của trang, bạn nên tìm hiểu xem thời gian đó được dùng để tính toán lại các kiểu trên trang là bao nhiêu. Để biết thêm thông tin, hãy đọc về cách đo lường thời gian tính toán lại kiểu trong trường.

Tài nguyên