2010-11-18 68 views
7

如果以前有人問過這個問題,我很抱歉,但這是一個難以搜索的問題。這是我在網絡開發多年來第一次遇到這個問題,所以我非常好奇。什麼是「?」在html腳本標籤的src屬性中?

我正在編輯某個網站的一些HTML文件,並且我注意到在前一作者附加問號後跟數據的腳本標記的src屬性中。

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

我知道,這是在一些語言的價值傳遞的GET請求,如PHP中使用,但我就我所知道,這不是在JavaScript中完成 - 至少在調用一個JavaScript文件。有人知道這是什麼,如果有的話?

編輯:哇,很多的迴應。感謝所有人。而且由於很多人都在說類似的話,我會發布全球更新,而不是評論每個人。

在這種情況下,JavaScript文件是靜態的,因此我的好奇心。我也打開它們,並沒有看到任何嘗試訪問文件加載變量。我從來沒有想過緩存或純文本控制,在這種情況下更可能發生接縫。

+0

只是因爲URL以「.js」結尾並不意味着Web服務器返回靜態JavaScript文件。它可以將請求轉發給某些處理程序,該處理程序動態返回某些內容 – 2010-11-18 22:18:16

+0

它被傳遞給網絡服務器(整個網址)。網絡服務器可以通過URL完成任何想做的事情。 IIRC這種方法被Bing使用!地圖。 – 2010-11-18 22:24:00

+0

好神,這個問題很快得到了很多反應。幾乎所有事情都是一樣的。 #StackOverflowFlaws – 2010-11-18 22:24:01

回答

10

我相信作者正在確保如果他創建了腳本的3.3版本,他可以在腳本的url中更改version =以確保用戶下載新文件而不是從舊腳本運行緩存在瀏覽器中。

所以在這種情況下,它是緩存策略的一部分。

5

你必須記住的是,這個./js/somefile.js?version=3.2不一定是一個物理文件。它可以是一個即時創建文件的頁面。所以你可以在請求說「請給我這個js文件的第3版」,並且服務器端代碼創建它並將它寫入輸出流。

另一種選擇是強制瀏覽器不緩存文件,並在發出請求時下拉新文件。由於URI發生了變化,它會認爲該文件是全新的。

+0

謝謝,但在這種情況下,他們是靜態的JavaScript文件。我也打開它們,沒有看到甚至試圖訪問文件加載時傳遞的值的任何內容。 – 2010-11-18 22:56:07

1

在這種情況下,它可能被用來確保源文件不在版本之間緩存。

當然,它也可以用於服務器端生成的JavaScript文件,而不知道你在請求的另一端有什麼,這是很難明確的。

順便說一句,url的?...部分稱爲查詢字符串。

1

這用於保證瀏覽器在可用時下載新版本的腳本。每次部署新版本時,url中的版本號都會增加,以便瀏覽器將其視爲另一個文件。

1

僅因爲文件擴展名是.js並不表示該目標文件是實際的.js文件。他們可以設置他們的Web服務器以將所請求的URL傳遞給腳本(或者字面上有一個名爲somefile.js的腳本)並解釋文件名和版本。

6

我的猜測是,如果他發佈JavaScript文件的新版本,他可以將HTML文檔中的版本撞上。這在請求時不會執行任何服務器端操作,但會導致瀏覽器將其視爲不同的文件,從而有效地強制瀏覽器重新獲取腳本並繞過文件的本地緩存。

這樣,您可以設置非常高的緩存時間(如一個星期或一個月!),但不會犧牲在必要時頻繁更新腳本的能力。

2

一個(配置良好的)網絡服務器會發送一次JavaScript源代碼等靜態文件,並告訴網絡瀏覽器在某個時間段(可能是一天,一週,一個月或更長)。當瀏覽器看到對同一文件的另一個請求時,它只會使用該版本,而不是從服務器獲取新代碼。

如果URL更改 - 例如通過添加查詢字符串 - 則瀏覽器懷疑它的緩存版本不好,並獲得一個新的。因此,?幫助開發人員說:「糟糕,我更改了這個文件,確保瀏覽器獲得了新的副本。」

1

查詢字符串與javascript無關。一些服務器端代碼根據它出現的查詢字符串來託管一個不同的版本。

你不應該假設任何關於URL中的路徑。 URL中路徑的擴展名不會告訴你什麼。 URL可以是完全動態的,並由某些服務器端代碼提供服務,或者可以動態地在Web服務器中重寫。

現在,加載JavaScript文件以防止客戶端緩存時,通常會向網址添加查詢字符串。如果頁面更新並引用新版本的腳本,則該頁面可以通過並導致客戶端刷新其腳本。

相關問題