欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

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

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

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

起因

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

分析問題

我們的api站點(diǎn)在 api.com

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

<base  rel="external nofollow" />

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

經(jīng)過一些簡單的斷點(diǎn)調(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路徑,如果有興趣一路跟蹤的話會(huì)發(fā)現(xiàn)這個(gè)base參數(shù)是由實(shí)例化VueRouter時(shí)候傳入的options.base

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

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

在我們實(shí)際的場景中,這里得到一個(gè)跨域的絕對(duì)地址,然后緊接著

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

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

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

修改

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

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

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

* 絕對(duì)路徑還有一種形式是 //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之前,他還會(huì)對(duì)url再次進(jìn)行處理cleanPath

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

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

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

繼續(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個(gè)或2個(gè)以上連續(xù)在一起的斜杠替換為1個(gè)斜杠。

** 完成提交pull

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

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

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

相關(guān)文章

  • vue實(shí)現(xiàn)商城上貨組件簡易版

    vue實(shí)現(xiàn)商城上貨組件簡易版

    這篇文章主要為大家詳細(xì)介紹了vue實(shí)現(xiàn)商城上貨組件簡易版,50行js代碼實(shí)現(xiàn)效果,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2017-11-11
  • vue中的事件綁定舉例詳解

    vue中的事件綁定舉例詳解

    這篇文章主要給大家介紹了關(guān)于vue中事件綁定的相關(guān)資料,事件綁定在Web開發(fā)中非常常見,我們經(jīng)常需要在頁面中為某個(gè)DOM元素綁定事件,如點(diǎn)擊、鼠標(biāo)移動(dòng)、鍵盤敲擊等等,需要的朋友可以參考下
    2023-09-09
  • 使用elementUI table展開行內(nèi)嵌套table問題

    使用elementUI table展開行內(nèi)嵌套table問題

    這篇文章主要介紹了使用elementUI table展開行內(nèi)嵌套table問題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2023-04-04
  • Vue SSR 即時(shí)編譯技術(shù)的實(shí)現(xiàn)

    Vue SSR 即時(shí)編譯技術(shù)的實(shí)現(xiàn)

    這篇文章主要介紹了Vue SSR 即時(shí)編譯技術(shù)的實(shí)現(xiàn),文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2020-05-05
  • vue3 elementPlus 表格實(shí)現(xiàn)行列拖拽及列檢索功能(完整代碼)

    vue3 elementPlus 表格實(shí)現(xiàn)行列拖拽及列檢索功能(完整代碼)

    本文通過實(shí)例代碼給大家介紹vue3 elementPlus 表格實(shí)現(xiàn)行列拖拽及列檢索功能,代碼簡單易懂,對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友參考下吧
    2023-10-10
  • vue源碼學(xué)習(xí)之Object.defineProperty對(duì)象屬性監(jiān)聽

    vue源碼學(xué)習(xí)之Object.defineProperty對(duì)象屬性監(jiān)聽

    這篇文章主要介紹了vue源碼學(xué)習(xí)之Object.defineProperty對(duì)象屬性監(jiān)聽,小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過來看看吧
    2018-05-05
  • Vue渲染流程步驟詳解

    Vue渲染流程步驟詳解

    在Vue里渲染一塊內(nèi)容,會(huì)有四個(gè)流程步驟,那么該怎么理解這個(gè)流程呢,所以本文就給大家詳細(xì)講解一下Vue 渲染流程,文中有纖細(xì)的代碼示例供大家參考,需要的朋友可以參考下
    2023-07-07
  • vue實(shí)現(xiàn)簡單的星級(jí)評(píng)分組件源碼

    vue實(shí)現(xiàn)簡單的星級(jí)評(píng)分組件源碼

    這篇文章主要介紹了vue星級(jí)評(píng)分組件源碼,代碼簡單易懂非常不錯(cuò),具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2018-11-11
  • vue彈窗里面使用echarts不顯示的問題及解決

    vue彈窗里面使用echarts不顯示的問題及解決

    這篇文章主要介紹了vue彈窗里面使用echarts不顯示的問題及解決方案,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2023-01-01
  • Vue加載讀取本地txt/json等文件的實(shí)現(xiàn)方式

    Vue加載讀取本地txt/json等文件的實(shí)現(xiàn)方式

    這篇文章主要介紹了Vue加載讀取本地txt/json等文件的實(shí)現(xiàn)方式,具有很好的參考價(jià)值,希望對(duì)大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2023-10-10

最新評(píng)論