Hướng dẫn css-in-js performance - hiệu suất css-in-js

CSS-in-JS đã chiếm một vị trí vững chắc trong công cụ phía trước, và có vẻ như xu hướng này sẽ tiếp tục trong tương lai gần. Đặc biệt là trong thế giới phản ứng. Ví dụ, trong số 11492 người tham gia khảo sát trạng thái CSS vào năm 2020, chỉ có 14,3% không nghe thấy các thành phần theo kiểu (một thư viện CSS-in-JS thống trị). Và hơn 40% người tham gia đã sử dụng thư viện.

Tôi muốn thấy một so sánh hiệu suất chuyên sâu của các thư viện CSS-in-JS như các thành phần kiểu dáng và CSS cũ tốt trong một thời gian dài. Đáng buồn thay, tôi đã không thể tìm thấy một sự so sánh về một dự án trong thế giới thực chứ không phải một số kịch bản thử nghiệm đơn giản. Vì vậy, tôi quyết định tự làm điều đó. Tôi đã di chuyển ứng dụng trong thế giới thực từ các thành phần theo kiểu sang Linaria, sẽ trích xuất CSS theo thời gian xây dựng. Không có thế hệ thời gian chạy của các kiểu trên máy người dùng.

Một thông báo ngắn, trước khi chúng tôi bắt đầu. Tôi không phải là một người ghét CSS-in-JS. Tôi thừa nhận họ có DX tuyệt vời, và mô hình sáng tác được thừa hưởng từ React là tuyệt vời. Nó có thể cung cấp cho các nhà phát triển một số lợi thế tốt đẹp như Josh W. Comeau nổi bật trong bài viết của mình The Style-Thành phần Happy Path. Tôi cũng sử dụng các thành phần theo kiểu trên một số dự án hoặc dự án của tôi mà tôi đã làm việc. Nhưng tôi tự hỏi, giá cho DX tuyệt vời này theo quan điểm của người dùng là bao nhiêu.

Hãy để xem những gì tôi đã tìm thấy.

TLDR: #

Don Tiết sử dụng thời gian chạy CSS-in-JS nếu bạn quan tâm đến hiệu suất tải của trang web của bạn. Đơn giản là ít JS = trang web nhanh hơn. Có rất nhiều chúng tôi có thể làm về nó. Nhưng nếu bạn muốn xem một số con số, hãy tiếp tục đọc.Simply less JS = Faster Site. There isn’t much we can do about it. But if you want to see some numbers, continue reading.

Những gì tôi đã đo và làm thế nào #

Ứng dụng tôi đã sử dụng cho thử nghiệm là một ứng dụng React khá chuẩn. Bootstrapped bằng cách sử dụng Dự án ứng dụng Created React, với Redux và được tạo kiểu bằng cách sử dụng các thành phần kiểu dáng (V5). Đây là một ứng dụng khá lớn với nhiều màn hình, bảng điều khiển có thể tùy chỉnh, theo chủ đề của khách hàng và nhiều hơn nữa. Vì nó được xây dựng với CRA, nó không có kết xuất phía máy chủ, vì vậy mọi thứ đều được hiển thị trên máy khách (vì nó là một ứng dụng B2B, đây không phải là một yêu cầu).

Tôi đã sử dụng ứng dụng này và thay thế các thành phần theo kiểu bằng Linaria, dường như có API tương tự. Tôi nghĩ rằng việc chuyển đổi sẽ dễ dàng. Hóa ra nó không dễ dàng. Tôi đã mất hơn hai tháng để di chuyển nó, và thậm chí sau đó, tôi đã di chuyển chỉ một vài trang chứ không phải toàn bộ ứng dụng. Tôi đoán rằng tại sao không có sự so sánh như thế này. Thay thế thư viện kiểu dáng là thay đổi duy nhất. Mọi thứ khác vẫn còn nguyên vẹn.

Tôi đã sử dụng các công cụ Chrome Dev để chạy một số thử nghiệm trên hai trang được sử dụng nhiều nhất. Tôi đã luôn chạy các bài kiểm tra ba lần và các số được trình bày là trung bình của 3 lần chạy đó. Đối với tất cả các bài kiểm tra, tôi đã đặt CPU điều chỉnh thành 4 lần và kết nối mạng để làm chậm 3G. Tôi đã sử dụng một cấu hình chrome riêng để kiểm tra hiệu suất mà không cần bất kỳ phần mở rộng nào.

Chạy kiểm tra:

  1. Mạng (kích thước của tài sản JS và CSS, phạm vi bảo hiểm, số lượng yêu cầu)
  2. Kiểm toán ngọn hải đăng (Kiểm toán hiệu suất với cài đặt trước trên thiết bị di động).
  3. Hồ sơ hiệu suất (kiểm tra tải trang, một cho tương tác kéo và thả)

So sánh mạng #

Chúng tôi sẽ bắt đầu với một mạng. Một trong những lợi thế của CSS-in-JS là không có phong cách không sử dụng, phải không? Không hẳn là chính xác lắm. Mặc dù bạn chỉ hoạt động các kiểu được sử dụng trên trang, bạn vẫn có thể tải xuống các kiểu không cần thiết. Nhưng thay vì có chúng trong một tệp CSS riêng biệt, bạn có chúng trong gói JS của bạn.

Dưới đây là so sánh dữ liệu của cùng một bản dựng trang chủ với các thành phần theo kiểu và Linaria. Kích thước trước khi cắt giảm kích thước Gzipped, kích thước không nén là sau nó.

So sánh thống kê mạng lưới trang chủ
Thành phần kiểu dángLinaria
Tổng số yêu cầu11 13
Tổng kích thước361kb/1,8MB356kb/1,8MB
Kích thước CSS2,3kb/7,2kb14,7kb/71,5kb
Số yêu cầu CSS1 3
Kích thước js322kb/1,8MB305kb/1,7MB
Số yêu cầu của JS6 6
So sánh số liệu thống kê mạng của trang tìm kiếm
Thành phần kiểu dángLinaria
Tổng số yêu cầu10 12
Tổng kích thước361kb/1,8MB356kb/1,8MB
Kích thước CSS2,3kb/7,2kb14,7kb/71,5kb
Số yêu cầu CSS1 3
Kích thước js322kb/1,8MB305kb/1,7MB
Số yêu cầu của JS6 6

So sánh số liệu thống kê mạng của trang tìm kiếm

395kb/1,9mb

391kb/1,9mb

So sánh bảo hiểm - Trang chủ
Thành phần kiểu dángLinaria
Kích thước của CSS không sử dụng6,5kb55,6kb
Kích thước của JS không sử dụng932kb915kb
Tổng kích thước938,5k970,6kb
So sánh bảo hiểm - trang tìm kiếm
Thành phần kiểu dángLinaria
Kích thước của CSS không sử dụng6,5kb55,6kb
Kích thước của JS không sử dụng932kb915kb
Tổng kích thước938,5k970,6kb

So sánh bảo hiểm - trang tìm kiếm

6,3kb

Hướng dẫn css-in-js performance - hiệu suất css-in-js
Hướng dẫn css-in-js performance - hiệu suất css-in-js

52,9kb

937kb

912kb

Hướng dẫn css-in-js performance - hiệu suất css-in-js
Hướng dẫn css-in-js performance - hiệu suất css-in-js

Kiểm toán hiệu suất của Ngọn hải đăng #

Nếu chúng ta đang nói về hiệu suất, sẽ thật xấu hổ khi không sử dụng ngọn hải đăng. Bạn có thể thấy các so sánh trong các biểu đồ dưới đây (trung bình từ 3 LI chạy.). Ngoài sức sống của web, tôi cũng bao gồm công việc chủ đề chính (thời gian để phân tích, biên dịch và thực hiện tài sản, phần lớn nhất trong số này là JS, nhưng nó bao gồm tính toán bố cục và kiểu dáng, vẽ, v.v.) và thời gian thực hiện của JS. Tôi đã bỏ qua sự thay đổi bố cục tích lũy vì nó gần bằng 0, và hầu như không có sự khác biệt giữa Linaria và thành phần kiểu dáng.

Hướng dẫn css-in-js performance - hiệu suất css-in-js

Như bạn có thể thấy, Linaria tốt hơn trong hầu hết các sức sống của web (bị mất một lần trong CLS). Và đôi khi bằng một biên độ lớn. Ví dụ: LCP nhanh hơn 870ms trên trang chủ và 1,2 trên trang tìm kiếm. Không chỉ kết xuất trang với CSS bình thường nhanh hơn nhiều, mà còn đòi hỏi ít tài nguyên hơn. Chặn thời gian và thời gian cần thiết để thực hiện tất cả các JS nhỏ hơn 300ms và tương ứng khoảng 1,3 giây.

Hiệu suất Hồ sơ #

Ngọn hải đăng có thể cung cấp cho bạn nhiều hiểu biết về hiệu suất. Nhưng để đi vào chi tiết, tab Hiệu suất trong Công cụ Dev là đặt cược tốt nhất. Trong trường hợp này, tab Hiệu suất xác nhận kết quả của Ngọn hải đăng. Bạn có thể thấy các chi tiết trên các biểu đồ dưới đây.

Thành phần kiểu dángLinariaMàn hình được xây dựng với thành phần kiểu dáng có nhiều nhiệm vụ chạy dài hơn. Những nhiệm vụ đó cũng mất nhiều thời gian hơn để hoàn thành, so với biến thể Linaria.
Để cung cấp cho bạn một cái nhìn khác về dữ liệu, đây là so sánh trực quan của các biểu đồ hiệu suất để tải trang chủ với thành phần kiểu dáng (trên cùng) và linaria (dưới cùng).2955 2392 So sánh tương tác người dùng #
Để so sánh tương tác của người dùng, không chỉ tải trang. Tôi đã đo hiệu suất của hoạt động kéo và thả được sử dụng để gán các mục thành các nhóm. Tóm tắt kết quả là dưới đây. Ngay cả trong trường hợp này, Linaria đã đánh bại CSS-in-JS thời gian chạy trong một số loại.3002 2525 Kéo và thả so sánh
Khác329 313 Kịch bản
-563ms1862.66 994.07 Kết xuất

Hướng dẫn css-in-js performance - hiệu suất css-in-js

-477ms

Bức tranh

-16ms

Tổng thời gian chặn