背景:項目是用react + antd開發的, 前天測試大哥說灰度環境下某個詳情頁面打不開了,但測試環境沒有問題。然后上灰度環境看了下,js報錯:TypeError: Super expression must either be null or a function。
分析:
1.代碼是同一套,只是打包的一些配置不一樣而已,但這些配置並不會影響到某個頁面。
2.本地調試沒有報錯,測試環境打包也沒有報錯。灰度打包打開該詳情頁面一直報TypeError: Super expression must either be null or a function。
3.看代碼。對比了下有問題和沒問題的詳情頁面。發現報錯的詳情頁面都引用了一個二次封裝的antd組件。
排查:
1.直接注釋掉有問題組件,打包。發現頁面能正常打開。那就定位到該二次封裝的組件上了。但有點納悶。測試環境和本地調試都是沒有問題的,為啥灰度打包的就會出錯了呢?
2.我們項目是Jenkins打包的,查看打包腳本。發現灰度打包的時候會把原文件夾內容先全部清空再pull 代碼再安裝依賴,打包構建。而測試環境是直接pull代碼,安裝依賴打包構建。那是不是存在某個依賴更新了導致的呢?
3.帶着以為繼續看代碼。出問題的組件是使用了react-resizable對antd的Table組件進行的二次封裝。問題肯定不是出在antd上。如果antd版本有問題那不應該只有那個詳情頁面報錯。那問題就出在react-resizable上了。
4.上github 翻issue。果不其然,https://github.com/STRML/react-resizable/issues/128。是因為react-resizable依賴的react-draggable升級了導致的。
解決辦法:
找到問題源頭就好解決了。
第一個解決辦法:可以手動把react-resizable依賴的react-draggable改到4.3版本以前。
第二個解決辦法:本地和測試為啥沒問題,是因為本地被測試環境有yarn.lock文件,依賴已經鎖版本號了,所以沒出問題。把本地的lock文件也推上代碼倉,灰度打包驗證, ojbk。