Thật pushState
tệ nếu bạn cần công cụ tìm kiếm để đọc nội dung của bạn?
Không, cuộc thảo luận pushState
xoay quanh việc hoàn thành cùng một quy trình chung cho hashbangs, nhưng với các URL đẹp hơn. Hãy nghĩ về những gì thực sự xảy ra khi bạn sử dụng hashbangs ...
Bạn nói:
Với hashbangs, Google biết cách truy cập URL Escape_fragment để lấy nội dung tĩnh của chúng.
Nói cách khác,
- Google thấy một liên kết đến
example.com/#!/blog
- Yêu cầu của Google
example.com/?_escaped_fragment_=/blog
- Bạn trả lại ảnh chụp nhanh của nội dung mà người dùng sẽ thấy
Như bạn có thể thấy, nó đã dựa vào máy chủ. Nếu bạn không cung cấp ảnh chụp nhanh nội dung từ máy chủ, thì trang web của bạn không được lập chỉ mục đúng cách.
Vậy làm thế nào Google sẽ thấy bất cứ điều gì với pushState?
Với pushState, google không thấy gì vì nó không thể sử dụng javascript để tải json và sau đó tạo mẫu.
Trên thực tế, Google sẽ xem bất cứ điều gì nó có thể yêu cầu site.com/blog
. Một URL vẫn trỏ đến một tài nguyên trên máy chủ và các máy khách vẫn tuân theo hợp đồng này. Tất nhiên, đối với các máy khách hiện đại, Javascript đã mở ra những khả năng mới để truy xuất và tương tác với nội dung mà không cần làm mới trang , nhưng các hợp đồng đều giống nhau.
Vì vậy, sự sang trọng dự kiến pushState
là nó phục vụ cùng một nội dung cho tất cả người dùng, cũ và mới, có khả năng JS và không, nhưng người dùng mới có được trải nghiệm nâng cao .
Bạn làm cách nào để Google xem nội dung của bạn?
Cách tiếp cận của Facebook - phân phát cùng một nội dung tại URL site.com/blog
mà ứng dụng khách của bạn sẽ chuyển đổi thành khi bạn chuyển sang /blog
trạng thái. (Facebook chưa sử dụng pushState
mà tôi biết, nhưng họ làm điều này với hashbangs)
Cách tiếp cận của Twitter - chuyển hướng tất cả các URL đến thành hashbang tương đương. Nói cách khác, một liên kết đến "/ blog" đẩy /blog
lên trạng thái. Nhưng nếu nó được yêu cầu trực tiếp, trình duyệt sẽ kết thúc tại #!/blog
. (Đối với Googlebot, điều này sau đó sẽ định tuyến đến _escaped_fragment_
như bạn muốn. Đối với các khách hàng khác, bạn có thể pushState
quay lại URL đẹp).
Vì vậy, bạn có mất _escaped_fragment_
khả năng với pushState
?
Trong một vài nhận xét khác nhau, bạn nói
phân mảnh thoát là hoàn toàn khác nhau. Bạn có thể cung cấp nội dung thuần túy không được kiểm soát, nội dung được lưu trong bộ nhớ cache và không bị đặt dưới tải như các trang bình thường.
Giải pháp lý tưởng là để Google thực hiện các trang web JavaScript hoặc triển khai một số cách để biết rằng có một URL phân đoạn thoát ngay cả đối với các trang web pushstate (robots.txt?).
Những lợi ích bạn đề cập không bị cô lập _escaped_fragment_
. Rằng nó thực hiện việc viết lại cho bạn và sử dụng một tham số được đặt tên đặc biệt GET
thực sự là một chi tiết triển khai. Nói cách khác, viết lại - không có gì thực sự đặc biệt về nó mà bạn không thể làm gì với URL giữa các ý kiến /blog
để /?content=/blog
trên bạn sử dụng riêng mod_rewrite hoặc của máy chủ của bạn tương đương.
Điều gì sẽ xảy ra nếu bạn không phân phát nội dung phía máy chủ?
Nếu bạn không thể viết lại URL và phân phát một số loại nội dung tại /blog
(hoặc bất kỳ trạng thái nào bạn đã đẩy vào trình duyệt), thì máy chủ của bạn thực sự không còn tuân thủ hợp đồng HTTP nữa.
Điều này quan trọng vì tải lại trang (vì bất kỳ lý do gì) sẽ kéo nội dung tại URL này. (Xem https://wiki.mozilla.org/Firefox_3.6/PushState_Security_Review - "view-source và reload đều sẽ tìm nạp nội dung tại URI mới nếu một URI được đẩy.")
Không phải việc vẽ giao diện người dùng một lần ở phía máy khách và tải nội dung qua JS API là một mục tiêu tồi, chỉ là nó không thực sự được tính đến với HTTP và URL và về cơ bản nó không tương thích ngược.
Hiện tại, đây là thứ chính xác mà các hashbang nhằm mục đích - đại diện cho các trạng thái trang riêng biệt được điều hướng trên máy khách chứ không phải trên máy chủ. Ví dụ: tải lại sẽ tải cùng một tài nguyên mà sau đó có thể đọc, phân tích cú pháp và xử lý giá trị đã băm.
Thật tình cờ là chúng cũng đã được sử dụng (đặc biệt là Facebook và Twitter) để thay đổi lịch sử thành vị trí phía máy chủ mà không cần làm mới trang. Đó là trong những trường hợp sử dụng mà mọi người khuyên nên bỏ hashbangs cho pushState.
Nếu bạn hiển thị tất cả nội dung ở phía máy khách, bạn nên pushState
coi đây là một phần của API lịch sử thuận tiện hơn, và không phải là một cách để sử dụng hashbangs.