為甚麼用vue做的網頁在IE會一片空白?

Joe Chang
Coding Hot Pot
Published in
Feb 8, 2021
photo by @limpido

之前開發新專案時遇到一個問題,利用vue cli建置開發環境,發現用IE 11打開是白茫茫的一片,簡直是晴天霹靂!打開IE開發者工具也沒有任何報錯! 這下真的要靠通靈了,通常沒有線索的錯誤絕對是最難抓bug的...

找了老半天才發現打包出來的chunk-vendor.js裡面居然有let、const、class語法!?老叩叩的瀏覽器根本看不懂ES6語法,到底是甚麼原因會讓ES6沒被轉成ES5呢?

發揮神農氏嘗百草的精神試了多種方法, 試到懷疑人生,但幸好最後還是有找到解決方法,以下就把嘗試的幾種作法簡單的列出來

babel polyfill

讓bable來降轉語法,把ES6轉成ES5才能在多數瀏覽器正常運作

yarn add babel-polyfill

然後在main js引入

import '@babel/polyfill'

重新啟動之後,恩… 完全沒有用

transpileDependencies

babel-loader 會忽略node_module底下的文件 ,如果需要透過babel編譯的pluging就要在transpileDependencies的陣列底下列出

在vue.config.js裡面加上transpileDependencies

module.exports = {
transpileDependencies:[/node_modules/套件名稱]
}

換成第二種依然沒用

module.exports = {
transpileDependencies:[套件名稱]
}

.browserslistrc

.browserslistrc的設定原本是被列在package.json底下,新版cli的是在根目錄下獨立出一支檔案, 針對網頁相容性做設定

> 1%
last 2 versions
not ie < 11

但…依然無動於衷

mainFields

resolve.mainFields為webpack的其中一項設定

configureWebpack: {
resolve: {
mainFields: ["module","main"],
},

部分第三方的套件會在不同環境下提供兩種版本(ES5&ES6)的js,而module和main個別讀取不同的js,module使用ES6的語法 ,而main則是ES5,並且依照順序決定優先讀取哪一個

預設為module ,畢竟未來趨勢是以ES6為主流,為了支援比較舊的瀏覽器 ,對調順序後優先讀取main(ES5)版

將vue.config.js的設定調整為以下

mainFields: ["main', ‘module’],

失敗N次之後 ,終於成功了 🎉🎉🎉

雖然近期IE已經被微軟放生了,但就我所知某些低階的安卓手機自有的瀏覽器還是有這個問題 ,相容性問題永遠是前端的一大考驗阿...

參考資料

2021/03/30 更新 — vue cli 4如果發生一樣的問題

babel.config.js 需調整為

vue.config.js

transpileDependencies: ["@vue", "vue", "vue-router", "vuex"],

--

--

Joe Chang
Coding Hot Pot

前端工程師,唯有非常努力,才能看起來毫不費力