一、兼容ES6
Vue 的核心框架 vuejs 本身激况,以及官方核心插件(VueRouter虐杯、Vuex等)均可以在 ie9 上正常使用。但ie不兼容es6灯帮,所以需要安裝插件將“Promise”等高級語法轉(zhuǎn)換成ie可以識別的es5崖技。
報錯:ReferenceError: “Promise”未定義,頁面空白
報錯:app.js文件報錯頁面空白施流,可能是缺少配置文件.babelrc
一响疚、 babel-polyfill
npm install babel-polyfill --save
在main.js中的最前面引入import 'babel-polyfill'(注:必須引入在最前面,保證所有es6語法都會被解析)
下載完成后找到build文件夾下的webpack.base.conf.js下的一段代碼
module.exports = {
entry: {
app: './src/main.js'
},
// 替換為
module.exports = {
context: path.resolve(__dirname, '../'),
entry: {
app: ["babel-polyfill", "./src/main.js"],
}
二瞪醋、如果引入 babel-polyfill還有一些高級語法沒有被編譯忿晕,配置 .babelrc文件,官網(wǎng)如下: https://www.babeljs.cn/ 根據(jù)項目選擇引入什么插件银受,以及如何配置践盼,詳情查看官網(wǎng)。
檢查根目錄下是否有.babelrc文件宾巍,如沒有自行創(chuàng)建咕幻。
.babelrc是Babel的配置文件,放在項目根目錄下顶霞,使用Babel的第一步就是配置這個文件肄程,該文件主要是對預設(shè)(presets)和插件(plugins)進行配置
創(chuàng)建.babelrc文件的方法:
1.新建一個文件
2.右鍵-重新命名-輸入.babelrc. (開頭和結(jié)尾一共兩個點)
3.添加配置代碼,
{
"presets": [
["env", {
"modules": false,
"useBuiltIns": "entry"
}],
"stage-2"
]
}
配置代碼解讀:
(1) modules該參數(shù)的含義是:啟用將ES6模塊語法轉(zhuǎn)換為另一種模塊類型选浑。將該設(shè)置為false就不會轉(zhuǎn)換模塊蓝厌。默認為 ‘commonjs’.
這樣做的目的是:以前我們需要使用babel來將ES6的模塊語法轉(zhuǎn)換為AMD, CommonJS,UMD之類的模塊化標準語法古徒,但是現(xiàn)在webpack都幫我做了這件事了拓提,所以我們不需要babel來做,因此需要在babel配置項中設(shè)置modules為false隧膘,因為它默認值是commonjs, 否則的話代态,會產(chǎn)生沖突。
(2) useBuiltIns是指定哪些內(nèi)容需要被 polyfill(兼容) 的設(shè)置疹吃,有三個設(shè)置選項
false - 不做任何操作
entry - 根據(jù)瀏覽器版本的支持蹦疑,將 polyfill 需求拆分引入,僅引入有瀏覽器不支持的polyfill
usage - 檢測代碼中 ES6/7/8 等的使用情況互墓,僅僅加載代碼中用到的 polyfill
(3) stage-2官方預設(shè)(preset), 有兩種必尼,一個是按年份(babel-preset-es2017),一個是按階段(babel-preset-stage-0)。 這主要是根據(jù)TC39 委員會ECMASCRPIT 發(fā)布流程來制定的判莉。
因此到目前為止 有4個不同的階段預設(shè):stage-0,1,2,3以上每種預設(shè)都依賴于緊隨的后期階段預設(shè)豆挽,也就是說stage-0是包括stage-1的,以此類推券盅。
因此 stage-0包含stage-1/2/3的內(nèi)容帮哈。所以如果我們不知道需要哪個stage-x的話,直接引入stage-0就好了锰镀。
目前一般是使用stage2 (https://babeljs.io/docs/en/babel-preset-stage-2) 該特性規(guī)范己經(jīng)被起草娘侍,將會被納入標準里.
配置完以上兩項后,基本可以解決頁面空白的問題泳炉。
三憾筏、網(wǎng)上還有一些其他注意事項,比如安裝了新的功能性插件e-chart,地圖,或者static目錄下有其他js文件(有es6語法) 等花鹅,IE 會報錯氧腰。
這是由于這些第三方插件的底層也有es6代碼,沒有被編譯刨肃,個人實踐后認為是由于沒有將babel-polyfill引入在頁面最頂部導致的古拴。但如引入在頂部還報錯,請參考以下解決方案:
1.找到webpack.base.config.js
{
test: /\.js$/,
loader: 'babel-loader',
include: [
resolve('src'),
resolve('test'),
resolve('static'),
resolve('node_modules/webpack-dev-server/client')
resolve('node_modules/echarts')
]
}
二真友、兼容axios
一黄痪、如果只需要兼容axios的話,可以只用 es6-promise 盔然,不引用babel-polyfill桅打,安裝方法如下:
npm install es6-promise --save
import promise from 'es6-promise';
promise.polyfill();
二、IE瀏覽器緩存問題愈案,導致axios接口不重新請求油额,頁面內(nèi)容不刷新
解決方案: axios請求上加時間戳,使每次都是參數(shù)不同的新請求
1刻帚、找到項目中對axios進行封裝的文件
2.找到post和get方法,修改里面的參數(shù)涩嚣,以post請求為例崇众,原參數(shù)為data: ...param,改為如下第7行所示
//post請求
post(url, param) {
return new Promise((resolve, reject) => {
axios({
method: 'post',
url,
data: {
t: Date.parse(new Date()),
...param
},
cancelToken: new CancelToken(c => {
cancel = c
})
}).then(res => {
resolve(res)
}).catch((error) => {
reject(error);
})
})
}
3.問題分析:
這個頁面不刷新的問題,一開始以為是v-router的緩存機制導致的航厚,嘗試在每次跳轉(zhuǎn)路由時加時間戳顷歌,但并沒有解決問題,最后才發(fā)現(xiàn)是axios的問題幔睬。
由此反向推理眯漩,如果將axios加上時間戳,不能解決問題,請重新檢查是否有v-router的赦抖,或者請求方式為history舱卡,等緩存機制的影響。