Time to First Byte (TTFB) là một chỉ số căn bản để đo lường thời gian kết nối và phản hồi của máy chủ trong thử nghiệm và thực nghiệm, giúp xác định việc một máy chủ phản hồi các request quá chậm. Trong trường hợp điều hướng các request, nghĩa là các request cho các tài liệu HTML, nó đứng trước tất cả các chỉ số loading time
khác.
TTFB là chỉ số đo lường thời gian từ khi request tài nguyên tới khi nhận được byte response đầu tiên trả về.
TTFB là tổng của các pha
dưới đây:
Giảm độ trễ khi thiết lập kết nối khi khởi tạo backend sẽ góp phần làm giảm TTFB.
Vì TTFB là chỉ số đứng trước các chỉ số quan trọng của người dùng như First Contentful Paint (FCP) và Largest Contentful Paint (LCP), nên máy chủ của bạn phải phản hồi đủ nhanh để 75% người dùng đạt ngưỡng FCP tốt. Theo các nghiên cứu sơ bộ, đa số các trang web nên cố gắng có TTFB dưới 0.8 giây.
TTFB không phải là một chỉ số Core Web Vitals. Do đó các trang web không nhất thiết
phải đạt được một giá trị TTFB tốt
, miễn là nó không làm ảnh hưởng tới các chỉ số quan trọng của trang web.
TTFB có thể được đo lường trong thử nghiệm hoặc trong thực nghiệm theo các cách sau
Những trình duyệt hỗ trợ (nguồn):
Bạn có thể đo TTFB của các request điều hướng
trên trình duyệt với Navigation Timing API.
Ví dụ sau cho thấy cách tạo PerformanceObserver
để lắng nghe một entry điều hướng
và logs nó ra console:
new PerformanceObserver((entryList) => {
const [pageNav] = entryList.getEntriesByType('navigation');
console.log(`TTFB: ${pageNav.responseStart}`);
}).observe({
type: 'navigation',
buffered: true
});
Không phải tất cả các trình duyệt đều hỗ trợ PerformanceObserver
hoặc có cờ buffered
.
Để hỗ trợ nhiều trình duyệt nhất có thể, xem xét sử dụng web-vitals
, thư viện được nhắc đến ở bên dưới.
web-vitals
là một thư viện JavaScript có thể đo TTFB trên trình duyệt một các đơn giản:
import {onTTFB} from 'web-vitals';
// Đo và log TTFB khi có thể.
onTTFB(console.log);
TTFB áp dụng cho tất cả các request, không chỉ riêng với request điều hướng. Đặc biệt, các tài nguyên trên các
máy chủ khác (cross-origin) có thể trễ hơn do cần phải thiết lập kết nối tới các máy chủ đó.
Để đo TTFB cho các tài nguyên trong thử nghiệm, sử dụng
Resource Timing API với PerformanceObserver
:
new PerformanceObserver((entryList) => {
const entries = entryList.getEntries();
for (const entry of entries) {
// Một vài tài nguyên có thể có responseStart bằng 0, do
// tài nguyên đó được cache hoặc một tài nguyên cross-origin
// được tải về mà không có header Timing-Allow-Origin
if (entry.responseStart > 0) {
console.log(`TTFB: ${entry.responseStart}`, entry.name);
}
}
}).observe({
type: 'resource',
buffered: true
});
Đoạn code ở trên khá giống để đo TTFB cho 1 request điều hướng, ngoại trừ thay vì lấy navigation
entry thì bạn lấy resource
entry. Nó cũng giải thích vì sao một số tài nguyên primary origin có thể trả về giá
trị 0 do kết nối đã được mở hoặc một tài nguyên được truy xuất trực tiếp từ cache.
Gotchas
TTFB của các cross-origin sẽ không thể đo trong thử nghiệm nếu cross-origin server không thiết lập một
header Timing-Allow-Origin
header.
Việc cải thiện TTFB phần lớn phụ thuộc vào nhà cung cấp dịch vụ lưu trữ và stack backend của bạn. Giá trị TTFB cao có thể do một trong các vấn đề sau:
Tối thiểu hoá TTFB thường được thực hiện bằng cách chọn một nhà cung cấp dịch vụ với hạ tầng đảm bảo thời gian hoạt động và khả năng đáp ứng cao. Điều này kết hợp với một CDN có thể hữu ích.
Sử dụng Server-Timing API để thu thập thêm thêm các dữ liệu về hiệu năng của các backend service. Điều này có thể giúp xác định các khả năng có thể cải thiện mà không được chú ý đến.
Các khả năng khác để cải thiện TTFB cao và độ trẽ trải nghiệm bao gồm:
Nguồn: https://web.dev/ttfb