我們知道打開網頁時瀏覽器會加載需要的資源,比如圖片、音頻、js文件、css文件等。並且會把這些資源作為緩存保存下來,再次打開網頁時緩存好的資源就不需要再次加載了。但是,這樣有一個問題,就是當程序猿更新了網頁內容后,因為瀏覽器緩存的存在,可能沒有辦法顯示出更新后的內容。
今天我就遇到了這樣的問題,做了一個小游戲的網頁,用到了大量的圖片和音頻,測試時更新的js不能立刻反饋,總是需要清除緩存后刷新才能看到更新。但是大量的圖片和音頻,每次都需要清除緩存也太麻煩了,我就百度了一下有沒有好的解決方法。
百度找到的解決方案就是給js添加版本號,這樣每次更新版本號,瀏覽器就會重新加載js文件,如下:
document.write('<script src="js/main.js?v='+Math.random()+'"><\/script>');
通過隨機數來自動添加版本號,不需要自己手動去添加,實在是省時省力!
不過,考慮到隨機數有重復的可能性,即便兩次隨機數正好一樣的可能性及其微小,也不為0,而且隨機數也不夠直觀,不如直接使用時間戳,如下:
document.write('<script src="js/main.js?t='+new Date().getTime()+'"><\/script>');
永遠不會停止流動的時間不可能重復,更何況還精確到了毫秒,而且時間戳也總比隨機數更加明了,可以明確知道js版本的先后。
使用上述方式改了我的程序后,成功避免了緩存問題,不過打開控制台后,發現了新的問題......
谷歌瀏覽器對document.write()發出了警告,查看了谷歌瀏覽器的警告頁,了解到了使用document.write()方式鏈接js文件會導致加載變慢,對網速不好的用戶體驗會變差,不過谷歌舉的例子是使用2g的用戶。
???
現在還有使用2g的史前人類嗎?本來想無視這個警告,不過往下看后發現...谷歌瀏覽器在55版本之后,對於網速不好的用戶,會禁止document.write()方式鏈接的js文件,范圍擴大到了3g和狀況不好的wifi...
這已經是不能忽視的情況了。
想到的解決方法如下:
<script type="text/javascript" src="js/1.js"></script> <script type="text/javascript" src="js/2.js"></script> <script type="text/javascript" src="js/3.js"></script> <script type="text/javascript" src="js/4.js"></script> <script type="text/javascript" src="js/5.js"></script> <script> var scripts = document.getElementsByTagName("script"); for(var i = 0;i < scripts.length;i ++){ if(scripts[i].src){ scripts[i].src = scripts[i].src+"?t="+new Date().getTime(); } } </script>
添加一段代碼,動態添加時間戳。但是這樣做有個弊端,可能會使瀏覽器加載兩次js文件。
暫時沒有想到更好的辦法,先這樣,有更好的辦法再補充。