<span id="mktg5"></span>

<i id="mktg5"><meter id="mktg5"></meter></i>

        <label id="mktg5"><meter id="mktg5"></meter></label>
        最新文章專題視頻專題問答1問答10問答100問答1000問答2000關鍵字專題1關鍵字專題50關鍵字專題500關鍵字專題1500TAG最新視頻文章推薦1 推薦3 推薦5 推薦7 推薦9 推薦11 推薦13 推薦15 推薦17 推薦19 推薦21 推薦23 推薦25 推薦27 推薦29 推薦31 推薦33 推薦35 推薦37視頻文章20視頻文章30視頻文章40視頻文章50視頻文章60 視頻文章70視頻文章80視頻文章90視頻文章100視頻文章120視頻文章140 視頻2關鍵字專題關鍵字專題tag2tag3文章專題文章專題2文章索引1文章索引2文章索引3文章索引4文章索引5123456789101112131415文章專題3
        問答文章1 問答文章501 問答文章1001 問答文章1501 問答文章2001 問答文章2501 問答文章3001 問答文章3501 問答文章4001 問答文章4501 問答文章5001 問答文章5501 問答文章6001 問答文章6501 問答文章7001 問答文章7501 問答文章8001 問答文章8501 問答文章9001 問答文章9501
        當前位置: 首頁 - 科技 - 知識百科 - 正文

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

        來源:懂視網 責編:小采 時間:2020-11-27 22:12:37
        文檔

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

        Vue兼容ie9的問題全面解決方案:前言 背景情況 vue - 2.5.11 vue-cli 使用模板 webpack-simple http請求:axios Vue 官方對于 ie 瀏覽器版本兼容情況的描述是 ie9+,即是 ie9 及更高的版本。經過測試,Vue 的核心框架 vuejs 本身,以及生態的官方核心插件(VueRouter、V
        推薦度:
        導讀Vue兼容ie9的問題全面解決方案:前言 背景情況 vue - 2.5.11 vue-cli 使用模板 webpack-simple http請求:axios Vue 官方對于 ie 瀏覽器版本兼容情況的描述是 ie9+,即是 ie9 及更高的版本。經過測試,Vue 的核心框架 vuejs 本身,以及生態的官方核心插件(VueRouter、V

        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 路徑,如此,生產環境下的數據請求問題也得以解決

        聲明:本網頁內容旨在傳播知識,若有侵權等問題請及時與本網聯系,我們將在第一時間刪除處理。TEL:177 7030 7066 E-MAIL:11247931@qq.com

        文檔

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

        Vue兼容ie9的問題全面解決方案:前言 背景情況 vue - 2.5.11 vue-cli 使用模板 webpack-simple http請求:axios Vue 官方對于 ie 瀏覽器版本兼容情況的描述是 ie9+,即是 ie9 及更高的版本。經過測試,Vue 的核心框架 vuejs 本身,以及生態的官方核心插件(VueRouter、V
        推薦度:
        標簽: VUE 解決 兼容
        • 熱門焦點

        最新推薦

        猜你喜歡

        熱門推薦

        專題
        Top
        主站蜘蛛池模板: 日本黄色动图免费在线观看| 国偷自产一区二区免费视频 | 国产精品黄页免费高清在线观看| 好吊妞788免费视频播放| 亚洲一级毛片免观看| 91嫩草国产在线观看免费| 亚洲AV无码专区在线亚| 无码中文在线二区免费| 亚洲国产成人久久精品大牛影视| 四虎影院免费在线播放| 色噜噜的亚洲男人的天堂| 亚洲精品成人网久久久久久| 一区二区视频免费观看| 亚洲成AV人片在| 国产成人精品免费视频网页大全| 亚洲国产片在线观看| 情侣视频精品免费的国产| 精品特级一级毛片免费观看| 中文字幕中韩乱码亚洲大片| 成在人线av无码免费高潮喷水| 亚洲AV日韩AV永久无码免下载| 美丽的姑娘免费观看在线播放| 亚洲久悠悠色悠在线播放| 亚洲成a人在线看天堂无码| 国产成人AV免费观看| 亚洲一级毛片在线观| 免费一级毛片正在播放| 怡红院免费的全部视频| 亚洲人成网站18禁止久久影院| 成人性生活免费视频| 男人免费视频一区二区在线观看| 亚洲一区二区三区AV无码| 亚洲免费在线观看视频| 另类图片亚洲校园小说区| 亚洲AV午夜福利精品一区二区| 久久笫一福利免费导航| h视频在线免费观看| 久久精品国产亚洲AV蜜臀色欲| 亚洲国产精品人人做人人爽| 亚洲三级在线免费观看| 深夜免费在线视频|