android webview與JavaScript井號(#)函數名兼容性問題及解決方案
JavaScript代碼規范建議函數名使用字母、數字、下劃線和美元符號,且首字符不能為數字。然而,一些第三方庫(例如pdfJS-dist)可能包含不符合此規范的函數名,例如以井號(#)開頭的函數名,這會導致Android WebView出現兼容性問題。
問題: 使用npm安裝pdfjs-dist (版本2.14)后,在chrome瀏覽器中運行正常,但在Android WebView中卻報錯”unexpected Token”,原因是pdf.js文件中存在以井號(#)開頭的函數名。 雖然有人認為井號開頭表示私有方法,但缺乏確鑿證據。 直接修改node_modules中的文件并非最佳實踐。
解決方案: 無需直接修改第三方庫源碼,通過以下配置即可解決:
-
.browserslistrc 配置: 該文件指定目標瀏覽器版本,確保兼容性。 需要特別注意Android WebView版本與Chrome Android版本的差異。
立即學習“Java免費學習筆記(深入)”;
android >= 4 chromeandroid >= 83 last 2 versions
-
vue.config.js (或類似配置文件) 配置: Babel默認不處理node_modules中的代碼。 需要在vue.config.js (或其他構建工具的配置文件)中配置transpileDependencies 屬性,強制Babel處理pdfjs-dist。 具體配置方法取決于你的前端框架和構建工具。
-
babel.config.js (可選) 配置: 更精細的控制,明確指定Babel處理的目錄。
module.exports = { presets: ['@vue/cli-plugin-babel/preset'], include: [ path.resolve(__dirname, 'src'), path.resolve(__dirname, 'node_modules/pdfjs-dist') ] };
通過以上配置,Babel將正確處理pdfjs-dist中的代碼,解決井號函數名導致的兼容性問題。 然而,即使解決了這個問題,仍然可能在Android WebView中遇到其他問題,例如PDF顯示錯位,需要進一步調試。