2010-11-18 76 views
7

Nếu điều này đã được yêu cầu trước đó, tôi xin lỗi nhưng đây là một câu hỏi khó tìm kiếm. Đây là lần đầu tiên tôi trải qua điều này trong tất cả các năm phát triển web của tôi, vì vậy tôi khá tò mò."?" Là gì? cho thuộc tính src của thẻ html script?

Tôi đang chỉnh sửa một số tệp HTML cho một trang web và tôi đã nhận thấy rằng trong thuộc tính src của thẻ tập lệnh mà tác giả trước đã thêm dấu chấm hỏi theo sau là dữ liệu.

Ex: <script src="./js/somefile.js?version=3.2"></script>

Tôi biết rằng điều này được sử dụng trong một số ngôn ngữ cho đi qua giá trị trong yêu cầu GET, ví dụ như PHP, nhưng như tôi đã xa như tôi từng biết, điều này đã không được thực hiện trong javascript - ít nhất trong việc gọi một tập tin javascript. Có ai biết điều này làm gì không, nếu có gì?

EDIT: Wow, rất nhiều câu trả lời. Cảm ơn một và tất cả. Và vì rất nhiều người đang nói những điều tương tự, tôi sẽ đăng một bản cập nhật toàn cầu thay vì bình luận tất cả mọi người.

Trong trường hợp này, tệp javascript là tĩnh, do đó sự tò mò của tôi. Tôi cũng đã mở chúng ra và không thấy bất cứ điều gì cố gắng truy cập các biến trên tải tệp. Tôi đã không bao giờ nghĩ về bộ nhớ đệm hoặc kiểm soát phiên bản đơn giản, cả hai đường may có nhiều khả năng trong trường hợp này.

+0

Chỉ vì URL kết thúc bằng ".js" không có nghĩa là máy chủ web trả lại tệp JavaScript tĩnh. Nó có thể chuyển tiếp yêu cầu tới một trình xử lý nào đó trả về một cái gì đó tự động. –

+0

Nó được chuyển đến máy chủ web (toàn bộ URL). Web-server có thể làm bất cứ điều gì nó muốn với URL. IIRC cách tiếp cận này được sử dụng bởi Bing! Bản đồ. –

+0

Chúa ơi, câu hỏi này có rất nhiều phản hồi nhanh. Khá nhiều điều tương tự trên bảng. #StackOverflowFlaws –

Trả lời

10

Tôi tin những gì tác giả đang làm là đảm bảo rằng nếu anh ta tạo phiên bản 3.3 của tập lệnh, anh ấy có thể thay đổi phiên bản = trong url của tập lệnh để đảm bảo rằng người dùng tải xuống tệp mới thay vì chạy khỏi tập lệnh cũ được lưu trong bộ nhớ cache trong trình duyệt của họ.

Vì vậy, trong trường hợp này, nó là một phần của chiến lược lưu trong bộ nhớ cache.

5

Điều bạn cần nhớ là ./js/somefile.js?version=3.2 không phải là tệp thực. Nó có thể là một trang mà tạo ra các tập tin trên bay. Vì vậy, bạn có thể có nó, nơi yêu cầu nói, "Hey cho tôi phiên bản 3 của tập tin js này," và mã phía máy chủ tạo ra nó và viết nó vào dòng đầu ra.

Tùy chọn khác là buộc trình duyệt không lưu vào bộ nhớ cache và kéo xuống tệp mới khi thực hiện yêu cầu. Kể từ khi URI thay đổi, nó sẽ nghĩ rằng tập tin là hoàn toàn mới.

+0

Cảm ơn, nhưng trong trường hợp này chúng là các tệp Javascript tĩnh. Tôi cũng đã mở chúng ra và không thấy bất cứ điều gì mà thậm chí cố gắng truy cập vào một giá trị được truyền trên tải tệp. –

1

Trong trường hợp này, nó có thể được sử dụng để đảm bảo tệp nguồn không được lưu trong bộ nhớ cache giữa các phiên bản.

Tất nhiên, nó cũng có thể được sử dụng phía máy chủ để tạo tệp javascript, mà không biết bạn có gì ở đầu kia của yêu cầu, rất khó để xác định.

BTW, phần ?... của url được gọi là chuỗi truy vấn.

1

điều này được sử dụng để đảm bảo rằng trình duyệt tải xuống phiên bản mới của tập lệnh khi khả dụng. Số phiên bản trong url được tăng lên mỗi khi phiên bản mới được triển khai để trình duyệt xem nó như một tệp khác.

1

Chỉ vì tiện ích mở rộng tệp là .js không có nghĩa là mục tiêu là tệp .js thực tế. Họ có thể thiết lập máy chủ web của họ để chuyển URL được yêu cầu đến một tập lệnh (hoặc theo nghĩa đen có một tập lệnh có tên là somefile.js) và giải thích tên tệp và phiên bản.

6

Tôi đoán là vậy nếu anh ấy xuất bản phiên bản mới của tệp JavaScript, anh ấy có thể chạm vào phiên bản trong tài liệu HTML.Điều này sẽ không làm bất cứ điều gì phía máy chủ khi được yêu cầu, nhưng nó khiến cho trình duyệt coi nó như một tệp khác, buộc trình duyệt tìm nạp lại tập lệnh và bỏ qua bộ nhớ cache cục bộ của tệp.

Bằng cách này, bạn có thể đặt thời gian bộ nhớ cache thực sự cao (như một tuần hoặc một tháng!) Nhưng không hy sinh khả năng cập nhật tập lệnh thường xuyên nếu cần.

2

Máy chủ web (được cấu hình tốt) sẽ gửi các tệp tĩnh như mã nguồn JavaScript một lần và yêu cầu trình duyệt web lưu trữ tệp đó cục bộ trong một khoảng thời gian nhất định (có thể là ngày, tuần, tháng hoặc lâu hơn). Khi trình duyệt thấy một yêu cầu khác cho cùng một tệp, nó sẽ chỉ sử dụng phiên bản đó thay vì nhận mã mới từ máy chủ.

Nếu URL thay đổi - ví dụ bằng cách thêm chuỗi truy vấn - thì trình duyệt nghi ngờ rằng phiên bản được lưu trong bộ nhớ cache của nó không tốt và nhận được phiên bản mới. Như vậy, ? giúp nhà phát triển nói "Rất tiếc, tôi đã thay đổi tệp này, đảm bảo trình duyệt nhận được bản sao mới".

1

Chuỗi truy vấn không liên quan gì đến javascript. Một số mã phía máy chủ đang lưu trữ một phiên bản khác tùy thuộc vào chuỗi truy vấn mà nó xuất hiện.

Bạn không bao giờ nên giả định bất kỳ điều gì về đường dẫn trong URL. Tiện ích trên đường dẫn trong URL không thực sự cho bạn biết bất kỳ điều gì. Các URL có thể hoàn toàn động và được phục vụ bởi một số mã phía máy chủ hoặc có thể được viết lại trong máy chủ web một cách linh hoạt.

Bây giờ, việc thêm chuỗi truy vấn vào url khi tải tệp javascript để ngăn chặn bộ đệm ẩn phía máy khách là điều bình thường. Nếu trang cập nhật và tham chiếu phiên bản mới của tập lệnh thì trang có thể bị phá vỡ và khiến khách hàng làm mới tập lệnh của nó.

Các vấn đề liên quan