亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb

首頁 > 編程 > JavaScript > 正文

Vue兼容ie9的問題全面解決方案

2019-11-19 13:38:11
字體:
來源:轉載
供稿:網友

前言

背景情況

  1. vue - 2.5.11
  2. vue-cli 使用模板 webpack-simple
  3. http請求:axios

Vue 官方對于 ie 瀏覽器版本兼容情況的描述是 ie9+,即是 ie9 及更高的版本。經過測試,Vue 的核心框架 vuejs 本身,以及生態的官方核心插件(VueRouter、Vuex等)均可以在 ie9 上正常使用。

Vue 的作者尤雨溪對于Vue 的學習建議 中有提及為了將項目更好的生態化/工程化,要盡可能學習及使用新的 ECMAScript 規范。目前 ES6/ES2015 是可用度和穩定度較高的規范,文檔齊全,國內還有 阮一峰 《ECMAScript 6 入門》 做了大量的文檔翻譯,開發環境可謂完善。然而版本較舊的瀏覽器并不支持 es6 規范,尤其是 ie 瀏覽器,即使是最高的 ie11 版本,對于 es6 規范也支持得并不全。如此則需要對所有原生不支持 ES6 特性的瀏覽器做兼容性處理。

本文將針對使用 Vue 生態開發完成的網站,以 ie9 版本為基礎兼容目標,實現全功能正常使用的全面兼容解決方案。

ES6兼容

在 ie9 的環境上,es6 的部分新對象、表達式,并不支持,解決方案是使用 babel-polyfill 組件,它可以將 es6 的代碼翻譯成低版本瀏覽器可以識別的 es5 代碼

npm i babel-polyfill --save-dev

安裝完成后,在項目的主入口文件 main.js 的首行就可以直接引用

import 'babel-polyfill';

在項目使用 vue-cli 生成的代碼中,根目錄有一個 .babelrc 文件,這是項目使用 babel 的配置文件。在默認生成的模板內容中,增加 "useBuiltIns": "entry" 的設置內容,這是一個指定哪些內容需要被 polyfill(兼容) 的設置

useBuiltIns 有三個設置選項

  1. false - 不做任何操作
  2. entry - 根據瀏覽器版本的支持,將 polyfill 需求拆分引入,僅引入有瀏覽器不支持的polyfill
  3. usage - 檢測代碼中 ES6/7/8 等的使用情況,僅僅加載代碼中用到的 polyfill

這里推薦設置為 entry ,完整的 .babelrc 內容如下:

{ "presets": [ [  "env",  {  "modules": false,  "useBuiltIns": "entry"  } ], "stage-3" ]}

加入這些代碼后,工程里的大部分內容已可兼容到 ie9 版本

Number對象

即使在使用 babel-polyfill 做代碼翻譯后,發現還是有一些 es6 的新特性并沒有解決,比如說 Number 對象的 parseIntparseFloat 方法

es6 將全局方法 parseInt() parseFloat() ,移植到 Number 對象上面,行為完全保持不變。這樣做的目的,是逐步減少全局性方法,使得語言逐步模塊化。

解決這個問題不需要引入包來解決,同樣在項目主入口文件 main.js 加入以下代碼(代碼盡可能靠前,最好是在引用 babel-polyfill 之后 )

if (Number.parseInt === undefined) Number.parseInt = window.parseInt;if (Number.parseFloat === undefined) Number.parseFloat = window.parseFloat;

requestAnimationFrame方法

window.requestAnimationFrame 是瀏覽器用于定時循環操作的一個接口,類似于 setTimeout,主要用途是按幀對網頁進行重繪。

requestAnimationFrame 的優勢,在于充分利用顯示器的刷新機制,比較節省系統資源。顯示器有固定的刷新頻率(60Hz或75Hz),也就是說,每秒最多只能重繪60次或75次,requestAnimationFrame 的基本思想就是與這個刷新頻率保持同步,利用這個刷新頻率進行頁面重繪。此外,使用這個API,一旦頁面不處于瀏覽器的當前標簽,就會自動停止刷新。這就節省了CPU、GPU和電力。

不過有一點需要注意,requestAnimationFrame 是在主線程上完成。這意味著,如果主線程非常繁忙,requestAnimationFrame 的動畫效果會大打折扣。

window.requestAnimationFrame() 方法告訴瀏覽器您希望執行動畫并請求瀏覽器在下一次重繪之前調用指定的函數來更新動畫。該方法使用一個回調函數作為參數,這個回調函數會在瀏覽器重繪之前調用。

有部分第三方組件就使用了這個方法,例如部分文件上傳、圖片處理類的組件;那么在這類型的組件在 ie9 下使用時,會報出

SCRIPT5007: Expected object.

window.requestAnimationFrame() 的最低兼容 ie 版本為 10,那么在 ie9 上做兼容就需要制作 requestAnimationFrame polyfill

(function() {  var lastTime = 0;  var vendors = ['ms', 'moz', 'webkit', 'o'];  for(var x = 0; x < vendors.length && !window.requestAnimationFrame; ++x) {    window.requestAnimationFrame = window[vendors[x]+'RequestAnimationFrame'];    window.cancelAnimationFrame = window[vendors[x]+'CancelAnimationFrame']                   || window[vendors[x]+'CancelRequestAnimationFrame'];  }   if (!window.requestAnimationFrame)    window.requestAnimationFrame = function(callback, element) {      var currTime = new Date().getTime();      var timeToCall = Math.max(0, 16 - (currTime - lastTime));      var id = window.setTimeout(function() { callback(currTime + timeToCall); },        timeToCall);      lastTime = currTime + timeToCall;      return id;    };   if (!window.cancelAnimationFrame)    window.cancelAnimationFrame = function(id) {      clearTimeout(id);    };}());

Gist:requestAnimationFrame polyfill

這部分代碼同樣是盡可能在網站入口處就執行

http網絡請求(跨域)

在大多數的 Web 項目中(以 JavaWeb 為例),網站的頁面和服務(至少是 controller 層)在同一個工程進行開發和部署,在大前端的新型模式下,我們建議盡可能對網站的前端和后端進行完全分離,前后端分離的好處和意義這里不再贅述。

既然是前后端分離,那么部署也必然是各自獨立部署,不同的訪問路徑,就會產生跨域訪問的問題(同一站點,不同端口號也是跨域)

在此設定背景情況:

  1. 服務端已完整開啟 CROS 跨域支持
  2. http 組件使用 axios
  3. axios 設置 withCredentials 為 true 開啟跨域訪問時攜帶 cookie 數據

高版本瀏覽器(ie10+ 或 chrome, ff)僅需要完成背景情況中的功能,即可支持跨域數據請求功能

axios 進行數據請求時,默認使用 XMLHttpRequest 對象,在檢測到當前請求是跨域訪問時,axios 會測試瀏覽器是否支持 XDomainRequest 對象,若支持則優先使用。

ie8 / ie9 的 XMLHttpRequest 對象,不支持跨域訪問,該對象在 ie10 后才原生支持跨域訪問。微軟的解決方案是在 ie8 / ie9 中提供了XDomainRequest(XDR) 對象來進行解決跨域問題,雖然使用該對象可以跨域訪問成功,并返回數據,但它卻依然是一個功能不完整的半成品,它的使用有諸多限制:

  1. XDR 僅支持 GET 與 POST 兩種請求方式
  2. XDR 不支持自定義的請求頭,若服務端使用 header 的自定義參數進行做身份驗證,則不可用
  3. 請求頭的 Content-Type 只允許設置為 text/plain
  4. XDR 不允許跨協議的請求,如果網頁在 HTTP 協議下,就只能請求 HTTP 協議下的接口,不能訪問 HTTPS 接口
  5. XDR 只接受HTTP/HTTPS 的請求
  6. 發起請求的時候,不會攜帶 authentication 或 cookies

微軟雖然提供了解決方案,但卻是不折不扣的雞肋,根本無法勝任系統中各種場景的數據請求需求,至此,axios 對 ie9 的跨域數據請求已無能為力。

完美解決方案:代理(proxy)

雖然 axios 對 ie9 跨域已無能為力,但前端項目打包的解決方案 webpack 提供了一個優雅而徹底解決問題的方式:代理

devServer.proxy

webpack 的 devServer.proxy 的功能是由http-proxy-middleware 項目來實現的

實現原理是將目標位置的請求代理為前端服務本地的請求,既然是代理成為本地的請求,就不存在跨域的問題,axios 就會用回 XMLHttpRequest 對象進行數據請求,一切都恢復正常了,header、cookies、content-type、authentication 等內容都被正確傳遞到服務端。

項目中 webpack.config.js 的配置

devServer: {  historyApiFallback: true,  noInfo: true,  overlay: true,  proxy: {    '/api': {      target: 'http://localhost:8081/myserver',      pathRewrite: {        '^/api': ''      }    }  }}

配置中指定了將 http://localhost:8081/myserver 服務的位置代理為本地前端服務的 http://localhost:8080/api。例如需要讀取用戶信息的原請求是 http://localhost:8081/myserver/user/zhangsan,代理后,就變為 http://localhost:8080/api/user/zhangsan。

即是 /api 的前綴代表了服務端,所以在使用 axios 時,需要對每個服務端請求都增加上 /api 的前綴;通常在項目開發中,需要對數據請求組件 axios 進行二次封裝,以達到統一設置默認參數,統一數據請求入口等目的,那么此時就只需要在二次封裝的文件里統一調整請求前綴即可。

不過,webpack 的 devServer.proxy 僅在開發模式下可用,生產模式下無法使用。開發模式下,調試服務可以讀取 webpack.config.js 中的配置內容進行實時代理,而項目在部署到生產環境前,需要將工程進行編譯轉換成靜態的 js 文件,沒有調試服務的支撐自然是無法進行請求代理的。

nginx 配置

雖然 devServer.proxy 的功能僅能工作于開發模式,那么在生產模式下,自然也是有解決方案的;通常 Vue 的項目在編譯成最終的 js 文件后,僅需要靜態服務器即可,這其中又以 nginx 為最優選擇方案,輕量、高性能、高并發、反向代理服務等均為其優點,這里需要做的數據請求代理的功能就使用到了 nginx 的 反向代理 功能

conf/nginx.conf 文件配置增加以下內容

location /api/ {  proxy_pass http://localhost:8081/myserver/;}

該配置同樣是將 http://localhost:8081/myserver/ 的目標服務端位置代理為本地服務的 /api 路徑,如此,生產環境下的數據請求問題也得以解決

以上就是本文的全部內容,希望對大家的學習有所幫助,也希望大家多多支持武林網。

發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
亚洲精品国产欧美| 国产精品444| 日韩第一页在线| 第一福利永久视频精品| 欧美日本亚洲视频| 中文字幕国产亚洲| 国产精品av免费在线观看| 亚洲人成在线观看| 国产欧美一区二区三区在线| 久久国产天堂福利天堂| 亚洲最新av网址| 欧美亚洲另类激情另类| 91亚洲永久免费精品| 欧美中文字幕第一页| 久久亚洲欧美日韩精品专区| 欧美成人精品xxx| 日韩av大片在线| 精品一区二区三区电影| 神马久久久久久| 少妇精69xxtheporn| 欧美性猛交xxxxx免费看| 欧美裸体xxxxx| 97色伦亚洲国产| 国产一区二区三区毛片| 精品成人国产在线观看男人呻吟| 久久影视电视剧免费网站| 成人激情在线播放| 日韩av在线不卡| 成人av在线天堂| 日韩综合中文字幕| 日韩av影视在线| 91精品国产乱码久久久久久久久| 国产精品嫩草影院一区二区| 91色琪琪电影亚洲精品久久| 欧美日韩午夜激情| 国产精品96久久久久久| 亚洲一级免费视频| 亚洲成av人片在线观看香蕉| 国产精品日韩欧美大师| 亚洲福利视频在线| 性日韩欧美在线视频| 国产精品第1页| 日韩精品免费一线在线观看| 久久国产精品久久久久久久久久| 亚洲欧美日韩中文在线| www.日韩视频| 色偷偷噜噜噜亚洲男人的天堂| 国内伊人久久久久久网站视频| 8090成年在线看片午夜| 正在播放欧美视频| 成人性教育视频在线观看| 一区二区亚洲精品国产| 亚洲一区免费网站| 亚洲第一天堂无码专区| 亚洲一区二区三区乱码aⅴ| 亚洲视频在线观看视频| 精品色蜜蜜精品视频在线观看| 亚洲欧美日韩一区在线| 韩国三级日本三级少妇99| 91久久久久久久久久| 蜜臀久久99精品久久久无需会员| 欧美性色19p| 亚洲无限av看| 日韩一区二区久久久| 麻豆国产va免费精品高清在线| 亚洲视频777| 亚洲成人a**站| 日韩中文娱乐网| 日韩免费在线免费观看| 久久综合伊人77777蜜臀| 成人xxxxx| 92国产精品久久久久首页| 国产精品一区二区av影院萌芽| 日韩精品高清视频| 亚洲精品国产精品自产a区红杏吧| 国产亚洲精品久久| 欧美精品在线网站| 国产在线精品自拍| 亚洲图片欧美日产| 久久精品99久久久香蕉| 欧美精品久久久久久久| 91探花福利精品国产自产在线| 久久影视免费观看| 日韩视频永久免费观看| 国产亚洲综合久久| 在线日韩日本国产亚洲| 欧美精品电影在线| 国产精品偷伦一区二区| 国产精品视频久久久久| 国产成人在线播放| 亚洲人成人99网站| 国产精品福利观看| 亚洲新中文字幕| 国产精品视频最多的网站| 久久久精品在线| 日韩欧美在线免费| 国产成人av网址| 欧美激情在线播放| 久久99国产精品自在自在app| 欧美成人性生活| 午夜精品久久久久久久99热浪潮| 亚洲精品一区在线观看香蕉| 欧美视频在线观看 亚洲欧| 欧美成人合集magnet| 久久精品91久久久久久再现| 久久久亚洲福利精品午夜| 欧美激情亚洲国产| 国产精品日韩精品| 成人在线视频网| 45www国产精品网站| 91免费版网站入口| 亚洲激情 国产| 日韩av高清不卡| 国产99在线|中文| 日日骚久久av| 久久久久久久香蕉网| 国产精品www色诱视频| 日韩欧美高清在线视频| 亚洲国产精品久久久| 黑人巨大精品欧美一区免费视频| 久久亚洲私人国产精品va| 国产精品美女在线观看| 三级精品视频久久久久| 欧美理论电影网| 亚洲人成亚洲人成在线观看| 日韩性生活视频| 国产日韩av在线播放| 中文国产亚洲喷潮| 日本aⅴ大伊香蕉精品视频| 亚洲精品自拍视频| 国产视频久久网| 91精品国产91久久久久久吃药| 亚洲已满18点击进入在线看片| 91精品国产777在线观看| 一本色道久久88综合亚洲精品ⅰ| 69av成年福利视频| 成人av在线天堂| 欧美激情欧美激情在线五月| 日韩精品高清在线观看| 欧美美女18p| 日韩网站免费观看高清| 国产精品久久久av久久久| 98午夜经典影视| 777精品视频| 欧美成人精品不卡视频在线观看| 日韩欧美精品在线观看| 欧美日本黄视频| 日韩高清人体午夜| 欧美性猛交视频| 亚洲图片欧洲图片av| 久久久精品国产一区二区| 秋霞av国产精品一区| 91在线网站视频| 亚洲精品国产精品乱码不99按摩| 中文国产成人精品久久一| 国产97人人超碰caoprom| 欧美黑人巨大精品一区二区| 国产精品视频色| 欧美国产日韩精品| 7777kkkk成人观看| 国产精品久久久久免费a∨| 中文字幕亚洲综合久久| 91精品国产沙发| 亚洲欧美在线免费|