STATUS IS UPWIKI TỐI ƯU HÓA WEBSITE
25Tăng tốc
Hiệu năng và phân phối / Tăng tốc

Hiệu năng JavaScript: Giảm công việc trên luồng chính

Tìm JavaScript khiến trang bị chậm, trì hoãn hoặc thực hiện công việc không cần thiết, và bảo vệ trải nghiệm tương tác.

Hiệu năng JavaScript: Giảm công việc trên luồng chính — HƯỚNG DẪN TRỰC QUAN
ĐỌC
8 phút
NGUỒN
5
TÁI XÁC NHẬN
2027-03-27
đã rà soát
Người đánh giá cao cấp về hiệu năng web
CÂU TRẢ LỜI NGẮN GỌN

Bắt đầu từ quyết định.

Giảm công việc trên luồng chính bằng cách đo lường một trang và tương tác thực tế, rồi sửa chi phí lặp lại lớn nhất. Luồng chính chạy hầu hết JavaScript và công việc giao diện của trang, một nhiệm vụ một lúc. Nhiệm vụ dài hơn 50 milliseconds được coi là long task, nên một thao tác chạm, nhấp, cuộn hoặc paint có thể phải chờ phía sau nó. Bắt đầu với thanh toán, tìm kiếm, điều hướng, biểu mẫu và những hành trình nhạy cảm khác.

Với mỗi chi phí, loại bỏ nó, trì hoãn đến khi cần, chia thành các lô nhỏ, hoặc chuyển tính toán có giới hạn sang Web Worker. Giữ phản hồi ngay lập tức trên luồng chính, nhưng hoãn analytics và các công việc theo sau không thiết yếu. Xem mỗi thẻ bên thứ ba như một phụ thuộc có chủ sở hữu. Kiểm tra lại trên CPU điện thoại bị giới hạn và giữ phương án rollback cho các luồng quan trọng.

HƯỚNG DẪN TRỰC QUAN

Nhìn công việc như một hệ thống.

Dùng sơ đồ này để nối các quyết định trong bài trước khi hành động theo từng thủ thuật.

SIUTăng tốc
01Lập hồ sơ một hành trình của khách hàng trước khi thay đổi mã
02Đọc trace như một hàng đợi công việc
03Gửi ít mã hơn vào thời điểm quan trọng
04Chia nhỏ công việc để trình duyệt có thể phản hồi
01

Lập hồ sơ một hành trình của khách hàng trước khi thay đổi mã

Chọn một luồng và tương tác quan trọng, chẳng hạn mở điều hướng, lọc kết quả, hoặc gửi biểu mẫu. Ghi lại trong bảng Performance của Chrome DevTools từ trạng thái trình duyệt sạch. Lặp lại hành động và chụp một lần chạy với CPU bị điều tốc cũng như một lần chạy trên máy phát triển; các trace trên desktop có thể che giấu công việc gây gián đoạn trên điện thoại có hiệu năng thấp hơn.

Dùng trace để kiểm tra một giả thuyết hẹp, không phải để đổ lỗi cho một thành phần từ báo cáo bundle. Trong biểu đồ ngọn lửa Main (Main flame chart), các thanh rộng hơn tốn thời gian hơn và các thanh chồng cho thấy stack gọi. Một tam giác đỏ trên một Task chỉ ra long task tiềm năng; chọn nó và theo liên kết mã khởi tạo. Lưu trace trước và sau để thấy thay đổi có ý nghĩa.

Ghi lại đúng khoảnh khắc

Bắt đầu ghi trước hành động và dừng sau khi kết quả hiển thị.

Dùng một trường hợp lặp lại được

Giữ nguyên route, trạng thái tài khoản và chuỗi hành động.

Đặt chủ sở hữu

Gán mỗi chi phí hàng đầu cho đội hoặc nhà cung cấp có thể thay đổi nó.

02

Đọc trace như một hàng đợi công việc

Long task là ngưỡng để điều tra, không phải chẩn đoán đầy đủ. Đặc tả Long Tasks của W3C báo các task kéo dài 50 milliseconds trở lên. Tìm sâu trong một task để thấy đánh giá JavaScript, bộ xử lý sự kiện, tính toán style, layout, hoặc paint. Call stack chỉ ra nơi bắt đầu; thời gian cho biết vấn đề là mã, rendering, hay một iframe bên thứ ba.

Ưu tiên chi phí lặp lại trong một tương tác có giá trị. Một handler ngắn vẫn có thể cảm thấy chậm khi nó kích hoạt layout hoặc phải chờ phía sau công việc trước đó. Trace là đo trong phòng thí nghiệm, nên xác nhận bản sửa trên các thiết bị đại diện và, nếu có thể, với dữ liệu đo lường thực tế tôn trọng quyền riêng tư.

Tách các khoảnh khắc

Việc phân tích mã khi khởi động cần cách khắc phục khác với trình xử lý chạy sau thao tác chạm.

Kiểm tra rendering

Tìm các mẫu ghi-style và đọc-layout lặp lại trước khi tái cấu trúc.

Giữ baseline

Đính kèm trace, kịch bản, và các chi phí hàng đầu vào công việc.

03

Gửi ít mã hơn vào thời điểm quan trọng

Lập danh mục các script theo route và mục đích. Xóa các package không dùng, trùng lặp, thí nghiệm đã kết thúc, và mã cho các tính năng không còn. Sau đó tách các tính năng theo route hoặc ít dùng để chúng tải khi cần thay vì trên đường dẫn ban đầu. Tải động có thể giảm công việc khởi động, nhưng nó có thể tạo độ trễ hiển thị khi người dùng cần tính năng ngay lập tức.

Hỏi liệu một component có cần toàn bộ framework phía client hay không, một tiện ích có lặp lại khả năng sẵn có hay không, và HTML tĩnh cộng với một phần cải tiến nhỏ có thể đủ không. Kiểm tra trạng thái fallback của module trì hoãn. Trang nên khéo léo hoãn một khả năng tùy chọn hơn là hiển thị điều khiển chết.

Xây ngân sách theo route

Ghi lại script nào được phép trên một route và vì sao.

Tải khi có ý định

Cân nhắc cho trình soạn thảo tùy chọn, bản đồ, trình phát, hoặc giao diện báo cáo.

Bảo vệ đường dẫn quan trọng

Kiểm tra xác thực, khả năng tiếp cận, thanh toán, và hoàn thành biểu mẫu; tìm đánh giá có trình độ khi điều khiển bị ảnh hưởng.

04

Chia nhỏ công việc để trình duyệt có thể phản hồi

Việc chia hàm thành những hàm nhỏ hơn không tạo ra các task trình duyệt riêng biệt nếu chúng vẫn chạy đồng bộ. Với một vòng lặp dài, hãy xử lý theo lô, cập nhật ngay trạng thái mà người dùng có thể thấy, rồi nhường quyền thực thi (yield) trước khi tiếp tục. Điều đó cho phép trình duyệt xử lý thao tác nhập và hiển thị giữa các lô.

Khi được hỗ trợ, scheduler.yield() nhường quyền thực thi để luồng chính xử lý công việc ưu tiên khác, rồi tiếp tục công việc; hãy phát hiện tính năng này và dùng phương án dự phòng cho các trình duyệt không hỗ trợ. Không nhường sau mỗi thao tác tí hon: nó có chi phí và có thể tăng tổng thời gian hoàn thành. Chọn ranh giới dựa trên đo lường, giữ khả năng hủy, và ngăn kết quả cũ ghi đè trạng thái mới.

Ưu tiên UI

Hiển thị xác nhận hoặc tiến trình trước các công việc theo sau không hiển thị.

Chia thành các lô theo thời gian đã trôi

Nhường trước khi công việc đo được trở nên dài, thay vì một lần cho mỗi mục.

Tránh các mẹo lỗi thời

Hướng dẫn hiện tại của web.dev không khuyến nghị chiến lược mới dựa trên isInputPending().

05

Chuyển tính toán, không phải giao diện, sang worker

Web Worker chạy một script trên luồng nền tách biệt khỏi luồng thực thi chính. Nó phù hợp cho phân tích nặng, biến đổi dữ liệu, lập chỉ mục tìm kiếm và các tính toán khác không cần truy cập trực tiếp giao diện. Gửi một đầu vào xác định, trả về một kết quả xác định, và giữ rendering cùng thay đổi trạng thái nhìn thấy trên luồng chính.

Workers không phải lúc nào cũng phù hợp. Chúng không thể thao tác DOM trực tiếp hoặc dùng Window, và cơ chế truyền tin chung sao chép dữ liệu. Việc tạo worker, di chuyển dữ liệu và điều phối lỗi có thể vượt chi phí một phép tính nhỏ. Đo toàn bộ tương tác, kết thúc worker không cần thiết, và thiết kế fallback nếu công việc worker thất bại.

Chọn công việc cô lập

Bắt đầu với phép tính mà đầu vào và đầu ra có thể tuần tự hóa và kiểm thử.

Phiên bản hóa thông điệp

Loại bỏ kết quả tạo cho bộ lọc, route, hoặc hành động cũ hơn.

Bảo toàn khả năng tiếp cận

Truyền đạt tiến trình có ý nghĩa qua giao diện chuẩn.

06

Quản trị JavaScript bên thứ ba như một phụ thuộc sản xuất

Analytics, quảng cáo, thí nghiệm, nhúng xã hội, trình phát video, và widget hỗ trợ có thể thêm request, đánh giá JavaScript, iframe và phụ thuộc. Một script nhà cung cấp có thể cần thiết, nhưng nó nằm ngoài quyền kiểm soát trực tiếp của đội ứng dụng và có thể ảnh hưởng hiệu năng, quyền riêng tư, bảo mật và liên tục. Lập danh mục mục đích, route, điều kiện tải, người phê duyệt, yêu cầu đồng ý và người chịu trách nhiệm gỡ bỏ.

Ở nơi điều kiện và hợp đồng cho phép, so sánh một trang đại diện có và không có một origin bên thứ ba. Công cụ hiệu năng có thể phơi bày đánh giá tốn kém, payload và attribution long-task. Giữ tích hợp nhẹ hoặc trì hoãn chỉ khi giá trị được ghi chép của nó biện minh cho chi phí đã đo. Xác nhận nội dung cốt lõi và công việc giao dịch chính khi một phụ thuộc tùy chọn chậm hoặc không có mặt.

Hạn chế phạm vi ảnh hưởng

Tải một tag chỉ trên route và điều kiện cần nó.

Xem xét kiểm soát thay đổi

Bao gồm thay đổi tag-manager trong đánh giá hiệu năng, quyền riêng tư, bảo mật và rollback.

Giữ công tắc gỡ bỏ

Ghi tài liệu và kiểm tra cách tắt một tích hợp không quan trọng.

07

Biến khả năng phản hồi thành rào chắn phát hành

Chuyển trace chiến thắng thành một kiểm tra hồi quy nhỏ cho hành trình quan trọng. Định nghĩa các tương tác được bao phủ, thiết bị hoặc giới hạn CPU, phản hồi mong đợi, và người đánh giá. Ghép nó với đánh giá bundle và danh mục bên thứ ba để một package hoặc tag mới không âm thầm tái giới thiệu công việc trên luồng chính.

Status Is UP sử dụng bằng chứng này cho tối ưu chủ động và khắc phục an toàn, không để thay thế giám sát sẵn có trực tiếp. Trước một thay đổi rủi ro cao, chuẩn bị rollback và xác minh luồng quan trọng sau khi phát hành. Kết quả thay đổi theo thiết bị, mạng, trình duyệt, nội dung và trạng thái tài khoản; coi ngưỡng là hàng rào bảo vệ, không phải đảm bảo.

Thiết lập rào chắn cho các thay đổi lớn

Yêu cầu trace trước và sau cho điều hướng chia sẻ, checkout, tìm kiếm, hoặc các bundle lớn.

Luyện tập rollback

Biết cờ tính năng (feature flag), cài đặt tag, hoặc phiên bản triển khai khôi phục hành vi đã biết tốt.

Xem lại định kỳ

Lập hồ sơ lại sau các phát hành lớn, thay đổi nhà cung cấp, hoặc sự dịch chuyển cơ cấu thiết bị.

HÀNH ĐỘNG / XÁC MINH

Hướng dẫn việc cần làm thiết thực.

  1. 01

    Chọn một tương tác quan trọng

    Ghi tên route, hành động, phản hồi mong đợi và tác động tới khách hàng.

    XÁC MINH: Ghi chú kiểm thử ghi nhận route, trạng thái tài khoản, hành động, trình duyệt, và cài đặt thiết bị hoặc CPU.
  2. 02

    Ghi baseline

    Ghi tương tác trong DevTools Performance từ trạng thái sạch.

    XÁC MINH: Đội có thể xem lại trace với biểu đồ ngọn lửa Main.
  3. 03

    Tìm công việc chặn

    Kiểm tra long tasks, call stacks, rendering, và hoạt động bên thứ ba.

    XÁC MINH: Mỗi chi phí hàng đầu có thời lượng, nguồn hoặc origin, route và chủ sở hữu.
  4. 04

    Loại bỏ script không cần thiết

    Xóa package không dùng, thí nghiệm đã nghỉ, trùng lặp, và mã route không cần.

    XÁC MINH: Build và hành trình quan trọng hoạt động sau khi gỡ.
  5. 05

    Trì hoãn tính năng tùy chọn

    Chỉ tải muộn một khả năng tùy chọn khi trạng thái trong lúc chờ tải vẫn sử dụng được.

    XÁC MINH: Một kiểm thử trang mới bao phủ tải, thất bại, hoặc fallback.
  6. 06

    Tách long task

    Xử lý theo lô và nhường sau phản hồi giao diện ngay lập tức.

    XÁC MINH: Trace mới loại bỏ long task tương đương trên đường dẫn tương tác và vẫn giữ kết quả đúng.
  7. 07

    Đánh giá worker

    Chỉ chuyển tính toán có giới hạn với thông điệp xác định.

    XÁC MINH: Kiểm thử end-to-end thời gian, lỗi, kết quả cũ, và dọn dẹp.
  8. 08

    Kiểm toán bên thứ ba

    Ghi mục đích, chủ sở hữu, điều kiện, đồng ý, chi phí và quy trình vô hiệu hóa.

    XÁC MINH: Mỗi tag trên route quan trọng có quyết định giữ, giới hạn, trì hoãn, hoặc gỡ.
  9. 09

    Kiểm thử điều kiện bị giới hạn

    Lặp lại trên CPU bị điều tốc và các trình duyệt hoặc thiết bị đại diện khi khả thi.

    XÁC MINH: So sánh dùng cùng kịch bản và ghi nhận khác biệt đáng kể.
  10. 10

    Phát hành kèm rollback

    Đính kèm trace, kiểm tra chấp nhận, và hướng dẫn đảo ngược vào phát hành.

    XÁC MINH: Một chủ sở hữu được đặt tên có thể khôi phục hành vi đã biết tốt mà không phải tìm kiếm không ghi chép.
CHỦ ĐỀ THẢO LUẬN

So sánh các đánh đổi, không chia sẻ dữ liệu riêng tư.

Dùng các câu hỏi này với nhóm hoặc cộng đồng chủ sở hữu website. Chia sẻ phương pháp và bài học, nhưng tuyệt đối không dán thông tin đăng nhập, hồ sơ khách hàng hay chi tiết hạ tầng không công khai.

  1. 01

    Tương tác nào trông chấp nhận được trong báo cáo tải nhưng lại chậm khi bạn lập hồ sơ một chạm hoặc nhấp thực tế?

  2. 02

    Bạn quyết định thế nào một tính năng bên thứ ba có biện minh cho chi phí trên luồng chính đã đo hay không?

  3. 03

    Cơ chế rollback nào giúp đảo ngược suy giảm hiệu năng dễ nhất mà không làm gián đoạn một hành trình quan trọng?

TÀI NGUYÊN PHỔ BIẾN / UY TÍN

Mở tài liệu nguồn.

web.devOptimize long tasks ↗

Giải thích long tasks, yielding, scheduler.yield(), fallback, và chi phí của việc yield.

Đã rà soát 2026-09-27
Chrome for DevelopersAnalyze runtime performance ↗

Hướng dẫn ghi, phân tích biểu đồ ngọn lửa, xác định long-task, và điều tra nguồn.

Đã rà soát 2026-09-27
MDN Web DocsWeb Workers API ↗

Định nghĩa workers, giao tiếp tin nhắn, và giới hạn không thể thao tác DOM trực tiếp.

Đã rà soát 2026-09-27
web.devLoad Third-Party JavaScript ↗

Cung cấp hướng dẫn kiểm toán và đo lường script bên thứ ba.

Đã rà soát 2026-09-27
W3CLong Tasks API ↗

Định nghĩa long tasks, ngưỡng, và attribution.

Đã rà soát 2026-09-27

Chính sách nguồn. Bài viết này sử dụng tài liệu chính thức của trình duyệt, tiêu chuẩn, và nền tảng web do nhóm biên tập đọc. Nó phân biệt đo lường và đảm bảo và loại trừ các tuyên bố không được hỗ trợ.

GIẢI ĐÁP NHANH

Các câu hỏi thường gặp.

Cái gì được tính là một long JavaScript task?

Đặc tả Long Tasks của W3C dùng ngưỡng 50 milliseconds trở lên để báo. Đó là tín hiệu để điều tra, không phải bằng chứng rằng các task ngắn hơn là vô hại. Xác nhận nguyên nhân trong trace.

Chia mã (code splitting) có luôn cải thiện hiệu năng JavaScript không?

Không. Chia có thể giảm công việc khởi động nhưng thêm độ trễ lần dùng đầu. Dùng cho mã theo route hoặc tùy chọn, rồi kiểm thử tính năng đó trong điều kiện bị giới hạn.

Có nên chạy mọi hàm tốn tài nguyên trong Web Worker không?

Không. Worker phù hợp cho các phép tính nặng, cô lập với thông điệp xác định. Chúng không thể thay đổi DOM trực tiếp, chi phí truyền dữ liệu tốn thời gian, và các tác vụ nhỏ có thể hoàn tất nhanh hơn trên luồng chính.

Status Is UP Editorial Team · Biên tập viên hỗ trợ duy trì thời gian hoạt động

Được rà soát bởi Người đánh giá cao cấp về hiệu năng web. Xuất bản 2026-09-27; cập nhật 2026-09-30.