中文字幕日韩精品一区二区免费_精品一区二区三区国产精品无卡在_国精品无码专区一区二区三区_国产αv三级中文在线

vue-router路徑計算的示例分析

這篇文章給大家分享的是有關(guān)vue-router路徑計算的示例分析的內(nèi)容。小編覺得挺實用的,因此分享給大家做個參考,一起跟隨小編過來看看吧。

創(chuàng)新互聯(lián)-專業(yè)網(wǎng)站定制、快速模板網(wǎng)站建設(shè)、高性價比措勤網(wǎng)站開發(fā)、企業(yè)建站全套包干低至880元,成熟完善的模板庫,直接使用。一站式措勤網(wǎng)站制作公司更省心,省錢,快速模板網(wǎng)站建設(shè)找我們,業(yè)務(wù)覆蓋措勤地區(qū)。費用合理售后完善,十年實體公司更值得信賴。

起因

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

分析問題

我們的api站點在 api.com

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

<base href="http://static.com" 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是空的,那么就會給一個默認值:

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

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

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

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

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

修改

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

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

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

* 絕對路徑還有一種形式是 //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再次進行處理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

感謝各位的閱讀!關(guān)于“vue-router路徑計算的示例分析”這篇文章就分享到這里了,希望以上內(nèi)容可以對大家有一定的幫助,讓大家可以學到更多知識,如果覺得文章不錯,可以把它分享出去讓更多的人看到吧!

網(wǎng)站標題:vue-router路徑計算的示例分析
標題URL:http://www.rwnh.cn/article28/jdcsjp.html

成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供電子商務(wù)、關(guān)鍵詞優(yōu)化、營銷型網(wǎng)站建設(shè)靜態(tài)網(wǎng)站、網(wǎng)站收錄全網(wǎng)營銷推廣

廣告

聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請盡快告知,我們將會在第一時間刪除。文章觀點不代表本網(wǎng)站立場,如需處理請聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時需注明來源: 創(chuàng)新互聯(lián)

網(wǎng)站優(yōu)化排名
昭觉县| 突泉县| 濉溪县| 伽师县| 库伦旗| 蓬莱市| 阜阳市| 秦安县| 扬州市| 咸丰县| 日土县| 交口县| 昔阳县| 巨鹿县| 徐州市| 鹰潭市| 利辛县| 南宁市| 屯留县| 武义县| 谢通门县| 衡阳市| 龙南县| 马尔康县| 治多县| 沈阳市| 苏尼特左旗| 柯坪县| 平利县| 牡丹江市| 健康| 平塘县| 大足县| 朝阳县| 新密市| 涟水县| 江陵县| 石楼县| 延津县| 濮阳县| 闽清县|