Liên kết tìm nạp trước hoạt động trên các tên miền phụ?


10

Tôi đã cố gắng sử dụng một cái gì đó như thế này để tăng hiệu suất khi nhấp từ trang đích đơn giản đến ứng dụng trang đơn hạng nặng:

<link rel="prefetch" href="https://example.com" as="document" />
<link rel="prefetch" href="https://example.com/app.js" as="script" />
<link rel="prefetch" href="https://example.com/app.css" as="style" />

Nó dường như không có hiệu suất tăng đáng chú ý khi trang đích của tôi nằm trên một tên miền phụ. Say, https://subdomain.example.com.

Khi tôi nhấp vào liên kết để truy cập https://example.com, tôi vẫn thấy một độ trễ dài trong tab mạng Chrome như app.jsapp.cssđược tải:

Tài nguyên được tải trước Thời gian tải tài nguyên với tìm nạp trước

Đây là tài nguyên tương tự với tính năng tìm nạp trước bị vô hiệu hóa:

Thời gian tải tài nguyên mà không cần tìm nạp trước

Nó mất khoảng cùng một lượng thời gian trong tổng số.


Yêu cầu các tiêu đề cho một trong những tài sản được tải với bộ đệm tìm nạp trước:

Chung:

Request URL: https://example.com/css/app.bffe365a.css
Request Method: GET
Status Code: 200  (from prefetch cache)
Remote Address: 13.226.219.19:443
Referrer Policy: no-referrer-when-downgrade

Phản ứng:

accept-ranges: bytes
cache-control: max-age=31536000
content-encoding: gzip
content-length: 39682
content-type: text/css
date: Mon, 06 Jan 2020 21:42:53 GMT
etag: "d6f5135674904979a2dfa9dab1d2c440"
last-modified: Mon, 06 Jan 2020 20:46:46 GMT
server: AmazonS3
status: 200
via: 1.1 example.cloudfront.net (CloudFront)
x-amz-cf-id: dO3yiCoPErExrE2BLYbUJaVye32FIJXXxMdI4neDGzGX9a6gcCDumg==
x-amz-cf-pop: LAX50-C1
x-amz-id-2: 1O0LmihxpHIywEaMQWX7G3FDAzxtH9tZq1T/jeVLMzifFSJSIIJSS6+175H61kKdAq6iEbwfs2I=
x-amz-request-id: AF35C178092B65D4
x-cache: Hit from cloudfront

Yêu cầu:

DNT: 1
Referer: https://example.com/auth/join
User-Agent: Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/79.0.3945.117 Safari/537.36

Câu hỏi của tôi là: Nếu Chrome chỉ ra rằng bộ đệm tìm nạp trước được sử dụng thì tại sao lại có thời gian tải xuống nội dung đáng kể?

Dường như Chrome có các loại bộ đệm khác nhau: bộ đệm tìm nạp trước, bộ đệm đĩa và bộ nhớ cache. Bộ nhớ cache trên đĩa và bộ nhớ cache rất nhanh (thời gian tải 5ms và 0ms). Tuy nhiên, bộ đệm tìm nạp trước khá vô dụng với thời gian tải xuống 300ms đôi khi. Tôi có thể có được một lời giải thích kỹ thuật về lý do tại sao điều này xảy ra? Đây có phải là một lỗi với Chrome không? Tôi đang sử dụng Chrome 79.0.3945.117.


Prefetch được sử dụng để tăng tốc độ điều hướng trong tương lai, xem phần giải thích ngắn gọn từ ( web.dev/link-prefetch )
Mohammad Yaseer

Có, prefetch sẽ tăng tốc độ điều hướng trong tương lai. Vậy thì tại sao nó không tăng tốc trong trường hợp của tôi? Xem biểu đồ thời gian.
Maros

Bạn có thể thử và đặt nội dung tên miền phụ trên một tên miền khác và kiểm tra xem điều đó cũng mất cùng thời gian để tải không? Bạn dường như đã rút ra rằng tên miền phụ có thể là một vấn đề mà không hiển thị nó bằng cách hiển thị trường hợp không phải tên miền phụ (tức là tên miền khác) hoạt động. Nếu tên miền phụ là một vấn đề thì bước tiếp theo sẽ là khám phá nếu có cài đặt cấu hình Chrome để điều chỉnh sẽ thực hiện việc này, hoặc
Martin

Hoặc thời gian tải giống nhau cho cả tên miền phụ và / hoặc tên miền độc lập xuất hiện trên các trình duyệt khác có bộ công cụ tương tự như Firefox Inspector hoặc Opera? Nếu cùng một vấn đề thời gian xảy ra trên các trình duyệt khác sử dụng các công cụ khác nhau (tôi không chắc là làm gì và không làm gì nữa) như bạn tham khảo, thì đó có thể là một lỗi - tôi hoàn toàn có thể tin rằng đó có thể là lỗi Chrome nếu các giá trị thời gian lưu ý này khác biệt đáng kể trên các trình duyệt khác.
Martin

Câu trả lời:


0

Thêm <link rel=prefetch>vào một trang web sẽ cho trình duyệt tải xuống toàn bộ trang hoặc một số tài nguyên (như tập lệnh hoặc tệp CSS) mà người dùng có thể cần trong tương lai. Điều này có thể cải thiện các số liệu như Sơn nội dung đầu tiên và Thời gian để tương tác và thường có thể làm cho các điều hướng tiếp theo xuất hiện để tải ngay lập tức.

nhập mô tả hình ảnh ở đây

Gợi ý tìm nạp trước tiêu tốn thêm byte cho các tài nguyên không cần ngay lập tức, vì vậy kỹ thuật này cần được áp dụng chu đáo; chỉ tìm nạp tài nguyên khi bạn tự tin rằng người dùng sẽ cần chúng. Xem xét không tìm nạp trước khi người dùng đang kết nối chậm. Bạn có thể phát hiện điều đó với API thông tin mạng.

Có nhiều cách khác nhau để xác định liên kết nào để tìm nạp trước. Cách đơn giản nhất là tìm nạp trước liên kết đầu tiên hoặc một vài liên kết đầu tiên trên trang hiện tại. Ngoài ra còn có các thư viện sử dụng các cách tiếp cận tinh vi hơn, được giải thích sau trong bài đăng này- https://web.dev/link-prefetch/ .


Tôi đang tìm kiếm một lời giải thích về lý do tại sao việc tìm nạp trước liên kết không làm tăng tốc mọi thứ trong trường hợp cụ thể của tôi. Có phải vì tên miền phụ, nhân viên phục vụ hay cái gì khác? Nếu bạn nhìn vào ảnh chụp màn hình của tôi, bạn có thể thấy rằng trình duyệt tải lại nội dung mặc dù đã tìm nạp trước.
Maros

0

Tôi chỉ có thể đoán. Câu trả lời tự tin có lẽ chỉ có thể được tìm thấy bởi bạn, thông qua thử nghiệm. Có quá nhiều biến số để giải thích. Nhưng ở đây một số ý tưởng:

  1. prefetchlà một gợi ý cho một trình duyệt. Trình duyệt có thể bỏ qua nó vì một số lý do tùy ý. Hơn thế nó có mức độ ưu tiên thấp nhất.
  2. Ví dụ, chỉ trong trường hợp, xin vui lòng, kiểm tra cài đặt trình duyệt của bạn:
    Menu/Settings/Advanced/Privacy and security/Preload pages for faster browsing and searching
    (hoặc một cái gì đó tương tự).
  3. Nếu có bất kỳ cơ hội nào bạn đang sử dụng internet di động thì đó cũng có thể là một vấn đề.
    https://www.technipages.com/google-chrom-prefetch
  4. Làm thế nào nhanh chóng bạn điều hướng từ trang đích của bạn đến example.com?
  5. Kiểm tra nhật ký máy chủ của bạn để xem nếu nó nhận được prefetchyêu cầu.
  6. Kiểm tra xem máy chủ của bạn có đặt một số tiêu đề lạ để đáp ứng prefetchyêu cầu không. Ví dụ Cache-Control: no-cache. Vâng, tôi thấy rằng bạn có cache-control: max-age=31536000, vì vậy sẽ rất lạ, nếu máy chủ sẽ gửi các tiêu đề khác nhau cho cùng một yêu cầu (cũng ... gần như giống nhau , ít nhất là bạn đã không nói rằng chúng là như vậy, và ít nhất có thể được một số tiêu đề chỉ ra rằng đó là một prefetchyêu cầu), nhưng những điều kỳ lạ xảy ra.

  7. Bạn có lẽ nên cố gắng thêm crossoriginthuộc tính. Ví dụ

    <link rel="prefetch" href="https://example.com/app.css" as="style" crossorigin />

    Tại đây https://www.w3.org/TR/resource-hints/ bạn có thể tìm thấy ví dụ này

    <link rel="preconnect" href="//example.com">
    <link rel="preconnect" href="//cdn.example.com" crossorigin>

    khá liên quan đến trường hợp của bạn, nhưng thật không may, không có lời giải thích.

  8. Trong phiên bản gốc của câu hỏi của bạn, bạn đã đề cập đến nhân viên dịch vụ ... Nếu họ tải xuống một cái gì đó, hoặc thậm chí chính bạn tải xuống một cách thủ công, đó cũng có thể là vấn đề. Vì ưu tiên thấp nhất củaprefetch

    https://developer.mozilla.org/en-US/docs/Web/HTTP/Link_prefetching_FAQ#What_if_I.27m_doading_s Something_in_the_background.3F_Will_link_prefetching_compete_for_bandband.3

    Nếu bạn đang tải xuống một cái gì đó bằng Mozilla, việc tìm nạp trước liên kết sẽ bị trì hoãn cho đến khi mọi tải xuống nền hoàn tất

    Tôi nghĩ Chrome cũng vậy.

  9. Bạn đã cố gắng di chuyển trang đích của mình đến tên miền gốc chưa? Nếu, có, và prefetchhoạt động như mong đợi, thì có - tên miền phụ là nguyên nhân của vấn đề. Và tin nhắn GUI Status Code: 200 (from prefetch cache)có lẽ chỉ là một trục trặc. Bởi vì gần đây một số thứ bắt đầu thay đổi prefetchhành vi trong Chrome. Và tôi không biết nếu mọi thứ đã ổn định. Về cơ bản, vâng, có một xác suất nhất định rằng bạn prefetchchỉ có thể từ cùng một nguồn gốc.

    https://docs.google.com/document/d/1bKGDIePAuF6YXmmrwM33LeLvtuCsla3vTspsxsNp-f8/edit


Một số lưu ý ngẫu nhiên sau khi đọc câu trả lời của bạn: Tôi điều hướng rất chậm từ trang đích đến example.com, cho phép đủ thời gian để tất cả tài nguyên tải. Tôi đã thực hiện thử nghiệm ở trên với các nhân viên dịch vụ bị vô hiệu hóa trong Chrome. Tôi nghĩ rằng thuộc tính crossorigin là cho một cái gì đó khác. Tôi đã thử sử dụng nó và không có may mắn. Trường hợp xấu nhất, tôi sẽ thực hiện kiểm tra mà bạn đề xuất bằng cách di chuyển trang đích đến tên miền gốc. Tôi đã hy vọng một câu trả lời ở đây sẽ giúp tôi tiết kiệm công việc.
Maros

1
Bạn đã thử FF chưa? Từ liên kết MDN ở trên: "Mozilla có tìm nạp trước tài liệu từ một máy chủ khác không? Có. Không có hạn chế nguồn gốc tương tự đối với tìm nạp trước liên kết. Giới hạn tìm nạp trước chỉ các URL từ cùng một máy chủ sẽ không cung cấp bất kỳ bảo mật trình duyệt nào." Đoạn văn này có thể bị lỗi thời, nhưng vẫn còn. Sẽ rất tốt nếu biết họ có hành vi khác với Chrome hay không.
x00

Tôi đã thử nhưng tôi không thể vô hiệu hóa nhân viên dịch vụ dường như được ưu tiên hơn bộ đệm trước. Tôi có thể thử lại lần nữa.
Maros

@Maros, bằng cách nào đó bạn không sở hữu mã, hoặc có một số vấn đề kỹ thuật?
x00

-1

bạn nên thêm mã dưới đây trong trường hợp bạn không phải là tên miền phụ và bạn muốn tài nguyên từ tên miền

<link rel="preconnect" href="https://example.com">
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.