最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

關(guān)于vue-router路徑計算問題

 更新時間:2017年05月10日 11:10:30   作者:冰麟輕武  
這篇文章主要介紹了關(guān)于vue-router路徑計算問題,小編覺得挺不錯的,現(xiàn)在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧

昨天剛剛發(fā)表了一個前端跨域新方案嘗試,今天在開發(fā)中就遇到的了問題。

起因

前端使用的是vue-router組件的history模式,但是由于我們的整個頁面都是從static(靜態(tài)資源站)load過來的,所以其他頁面自然也需要跨域去拿,然而就在跨域的時候 vue-router 出了問題。

分析問題

我們的api站點在 api.com

而靜態(tài)資源在 static.com,頁面的base標(biāo)簽也指向static

<base  rel="external nofollow" />

然而,在訪問 test模板時卻跳到了http://api.com/http:/static.com/test

經(jīng)過一些簡單的斷點調(diào)試,鎖定了以下代碼

[source]: https://github.com/vuejs/vue-router/blob/dev/dist/vue-router.esm.js

 [vue-router.esm.js][source]

//1794行~1675行
function normalizeBase (base) {
 if (!base) {
  if (inBrowser) {
   // respect <base> tag
   var baseEl = document.querySelector('base');
   base = (baseEl && baseEl.getAttribute('href')) || '/';
  } else {
   base = '/';
  }
 }
 // make sure there's the starting slash
 if (base.charAt(0) !== '/') {
  base = '/' + base;
 }
 // remove trailing slash
 return base.replace(/\/$/, '')
}

這段代碼的作用是設(shè)置路由的base路徑,如果有興趣一路跟蹤的話會發(fā)現(xiàn)這個base參數(shù)是由實例化VueRouter時候傳入的options.base;

再看代碼,他會判斷如果base是空的,那么就會給一個默認(rèn)值:

如果實在瀏覽器(非服務(wù)器環(huán)境)下執(zhí)行,那么會調(diào)用document.querySelector('base')來嘗試獲取<base href='' />標(biāo)簽中href屬性的值;

在我們實際的場景中,這里得到一個跨域的絕對地址,然后緊接著

 if (base.charAt(0) !== '/') {
  base = '/' + base;
 }

當(dāng)url第一個字符不是/的時候加上/,這里非常明顯是一個BUG

我的是絕對地址http://static.com第一個字符當(dāng)然不是/,所以才會由之前的http://api.com/http:/static.com/test這樣的網(wǎng)址

修改

if(/^([a-z]+:)?\/\//i.test(base)){

}else if (base.charAt(0) !== '/') {
 base = '/' + base;
}

為了盡量少破壞源碼,這里加了一個空的if,當(dāng)url是由協(xié)議開始時,認(rèn)為是絕對路徑。

* 絕對路徑還有一種形式是 //static.com

測試

經(jīng)過第一次修改,再次訪問頁面依然有問題,訪問的頁面依然是http://api.com/http:/static.com/test

繼續(xù)分析

再次跟蹤源碼后發(fā)現(xiàn)

[vue-router.esm.js][source]

//2006行~2016行
 HTML5History.prototype.push = function push (location, onComplete, onAbort) {
  var this$1 = this;

  var ref = this;
  var fromRoute = ref.current;
  this.transitionTo(location, function (route) {
   pushState(cleanPath(this$1.base + route.fullPath));
   handleScroll(this$1.router, route, fromRoute, false);
   onComplete && onComplete(route);
  }, onAbort);
 };
//561行~563行
function cleanPath (path) {
 return path.replace(/\/\//g, '/')
}

在發(fā)生pushState之前,他還會對url再次進(jìn)行處理cleanPath

而這里的處理更簡單,更粗暴,問題也更大。

他直接將2個斜杠//替換為1個斜杠/,話說如果連續(xù)3個斜杠怎么辦?

所以在處理http://static.com/test地址的時候,其實會被處理成http:/static.com/test 又變成相對路徑了...

繼續(xù)修改

function cleanPath (path) {
  var ishttp = /^([a-z]+:)?\/\//i.exec(path);
  var http = Array.isArray(ishttp) ? ishttp[0] : '';
  return http + path.substr(http.length).replace(/\/{2,}/g, '/');
}

如果是協(xié)議開始,則排除協(xié)議內(nèi)容之后,將2個或2個以上連續(xù)在一起的斜杠替換為1個斜杠。

** 完成提交pull

https://github.com/vuejs/vue-router/pull/1353/files

話說vue-router的url處理比起Url.js來說真的是太粗暴了...

以上就是本文的全部內(nèi)容,希望對大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。

相關(guān)文章

  • Vue3基礎(chǔ)篇之常用的循環(huán)示例詳解

    Vue3基礎(chǔ)篇之常用的循環(huán)示例詳解

    filter?方法會創(chuàng)建一個新的數(shù)組,其中包含滿足指定條件的所有元素,這個方法非常適合循環(huán)遍歷數(shù)組并根據(jù)特定條件過濾元素的情況,這篇文章主要介紹了Vue3基礎(chǔ)[常用的循環(huán)],需要的朋友可以參考下
    2024-01-01
  • vue中tinymce的使用實例詳解

    vue中tinymce的使用實例詳解

    TinyMCE Vue是TinyMCE官方發(fā)布的Vue組件,可以更輕松地在Vue應(yīng)用程序中使用TinyMCE,這篇文章主要介紹了vue中tinymce的使用,需要的朋友可以參考下
    2022-11-11
  • vue-cli打包后本地運行dist文件中的index.html操作

    vue-cli打包后本地運行dist文件中的index.html操作

    這篇文章主要介紹了vue-cli打包后本地運行dist文件中的index.html操作,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2020-08-08
  • vite打包優(yōu)化CDN壓縮的分析實現(xiàn)

    vite打包優(yōu)化CDN壓縮的分析實現(xiàn)

    我們在日常的工作中肯定會遇到項目打包優(yōu)化等問題,本文主要介紹了vite打包優(yōu)化CDN壓縮的分析實現(xiàn),具有一定的參加價值,感興趣的可以了解一下
    2024-07-07
  • Vue實現(xiàn)星級評價效果實例詳解

    Vue實現(xiàn)星級評價效果實例詳解

    這篇文章主要介紹了Vue實現(xiàn)星級評價效果的實例代碼,代碼簡單易懂,非常不錯,具有一定的參考借鑒價值,需要的朋友可以參考下
    2019-12-12
  • Vue數(shù)據(jù)驅(qū)動模擬實現(xiàn)4

    Vue數(shù)據(jù)驅(qū)動模擬實現(xiàn)4

    這篇文章主要介紹了Vue數(shù)據(jù)驅(qū)動模擬實現(xiàn)的相關(guān)資料,介紹了Array的變異方法,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2017-01-01
  • 解決Electron?store的commit和dispatch不好用問題

    解決Electron?store的commit和dispatch不好用問題

    這篇文章主要介紹了解決Electron?store的commit和dispatch不好用問題,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2023-01-01
  • vue中通過iframe方式加載本地的vue頁面的解決方法

    vue中通過iframe方式加載本地的vue頁面的解決方法

    這篇文章主要給大家介紹了在vue中如何通過iframe方式加載本地的vue頁面的解決方法,文中有詳細(xì)的解決流程,需要的朋友可以參考下
    2023-06-06
  • el-form表單el-form-item驗證規(guī)則里prop一次驗證兩個或多個值問題

    el-form表單el-form-item驗證規(guī)則里prop一次驗證兩個或多個值問題

    這篇文章主要介紹了el-form表單el-form-item驗證規(guī)則里prop一次驗證兩個或多個值問題,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2023-05-05
  • VUE配置history路由模式配置詳細(xì)舉例

    VUE配置history路由模式配置詳細(xì)舉例

    這篇文章主要給大家介紹了關(guān)于VUE配置history路由模式配置的相關(guān)資料,History模式是Vue路由的另一種模式,在History模式下URL中的路徑不再使用#符號,而是直接使用正常的路徑形式,需要的朋友可以參考下
    2023-12-12

最新評論

福安市| 抚宁县| 益阳市| 平湖市| 潢川县| 广宁县| 莎车县| 西吉县| 图们市| 孝义市| 镇坪县| 灵台县| 长葛市| 富民县| 灌云县| 屏边| 车致| 固镇县| 苏尼特左旗| 松原市| 临潭县| 孟津县| 乐亭县| 海丰县| 女性| 万盛区| 丹江口市| 乳山市| 永胜县| 夏邑县| 赫章县| 卢氏县| 荥经县| 民丰县| 温州市| 社旗县| 安仁县| 荔波县| 海淀区| 中阳县| 河北省|