基于vue.js&vue-router的動態(tài)更新TDK(SEO優(yōu)化)

本文基于工作項目開發(fā),做的整理筆記
前幾天幫朋友解決這個問題滓侍,順帶學習了一下,做個筆記Mark下牲芋。

前提條件:
你已經(jīng)了解并使用vue撩笆,能夠搭建應用站點捺球。

編碼環(huán)境:
system:OS X EI Capitan 10.13.3
npm:5.5.1
node:v8.9.3
vue-cli:@lastest

相關(guān)技術(shù)棧:
vue2 + vue-router

相關(guān)地址:
參考閱讀:https://alligator.io/vuejs/vue-router-modify-head/

基于vue.js&vue-router的動態(tài)更新TDK.jpg

1.router部分

直接看代碼,主要包含一個配置變量mapping夕冲,也可以抽出去放到單獨的配置文件中氮兵,這里就簡化放進來了,容易看耘擂。在路由配置中胆剧,給了一個meta字段用于存放對應的TDK信息絮姆。

注意:這里我們發(fā)現(xiàn)NewsDetail暫存的TDK信息和News一樣醉冤,沒關(guān)系,因為它和ID有關(guān)篙悯,在app.js那邊我們還要具體處理蚁阳。

/**********************************************/
/* src/router/index.js                                */
/**********************************************/
import Vue from 'vue'
import Router from 'vue-router'
import Layout from '@/components/layout'
import Home from '@/components/home'
import News from '@/components/hot-news'
import Detail from '@/components/hot-news/detail'
import About from '@/components/info/about'
import ContactUs from '@/components/info/contact-us'
import JoinUs from '@/components/info/join-us'
import Terms from '@/components/info/terms'
import Error404 from '@/components/404'

Vue.use(Router)
const mapping = {
  home: {
    title: 'xxxxxxxxxxxxxxxx-【官網(wǎng)名稱】',
    metaTags: [
      {
        name: 'keywords',
        content: 'xxx, xx, xxxxx, xxx, xxx'
      },
      {
        name: 'description',
        content: '官網(wǎng)頁面的一段描述'
      },
    ],
  },
  news: {
    title: '【新聞熱點】_xxxxxxx-官網(wǎng)名稱',
    metaTags: [
      {
        name: 'keywords',
        content: 'xxx, xx, xxxxx, xxx, xxx'
      },
      {
        name: 'description',
        content: '新聞熱點頁面的一段描述'
      },
    ],
  },
}

export default new Router({
  mode: 'history',
  routes: [
    {
      path: '/',
      component: Layout,
      // redirect: '/home',
      hidden: true,
      children: [
        { 
          path: '',
          component: Home,
          meta: mapping.home,
        },
        {
          path: 'home',
          redirect: '/',
          component: Home,
          meta: mapping.home,
        },
        {
          path: 'news', 
          component: News, 
          meta: mapping.news,
        },
        {
          path: 'news/:id', 
          component: NewsDetail, 
          meta: mapping.news,
        },
        {
          path: 'about', 
          component: About, 
          meta: mapping.home,
        },
        {
          path: 'contact-us', 
          component: ContactUs, 
          meta: mapping.home,
        },
        {
          path: 'join-us', 
          component: JoinUs, 
          meta: mapping.home,
        },
        {
          path: 'terms', 
          component: Terms, 
          meta: mapping.home,
        },
        {
          path: '404', 
          component: Error404, 
          meta: mapping.home,
        },
      ]
    },
  ]
})

2. 看看app.js這邊如何使用

這段代碼中,也有一個配置變量mappingFull鸽照,它主要服務于那種帶查詢條件的螺捐,帶id的具體路由的TDK。另外注意的就是方法

/**********************************************/
/* src/app.js                                             */
/**********************************************/

// The Vue build version to load with the `import` command
// (runtime-only or standalone) has been set in webpack.base.conf with an alias.
import Vue from 'vue'
import App from './App'
import store from './store';
import router from './router'
import ElementUI from 'element-ui';
import 'element-ui/lib/theme-chalk/index.css';
import '@/style/base.scss'

Vue.use(ElementUI);
Vue.config.productionTip = false

const mappingFull = {
   '/news?categary=xxxxx': {
    title: '【新聞熱點】_xxxxx-官網(wǎng)名稱',
    metaTags: [
      {
        name: 'keywords',
        content: 'xxx, xx, xxxx, xxx, xxx'
      },
      {
        name: 'description',
        content: '這一搜索條件的相關(guān)描述'
      },
    ],
  },
   '/news/1': {
    title: '【xxxxx_新聞熱點】_xxxxxx-官網(wǎng)名稱',
    metaTags: [
      {
        name: 'keywords',
        content: 'xxx, xx, xxxx, xxx, xxx'
      },
      {
        name: 'description',
        content: '新聞熱點1的相關(guān)描述'
      },
    ],
  },
   '/news/2': {
    title: '【xxxxx_新聞熱點】_xxxxxx-官網(wǎng)名稱',
    metaTags: [
      {
        name: 'keywords',
        content: 'xxx, xx, xxxx, xxx, xxx'
      },
      {
        name: 'description',
        content: '新聞熱點2的相關(guān)描述'
      },
    ],
  },
  '/hot-news/3': {
    title: '【xxxxx_新聞熱點】_xxxxxx-官網(wǎng)名稱',
    metaTags: [
      {
        name: 'keywords',
        content: 'xxx, xx, xxxx, xxx, xxx'
      },
      {
        name: 'description',
        content: '新聞熱點3的相關(guān)描述'
      },
    ],
  },
}

router.beforeEach((to, from, next) => {
  const matchPath = to.matched.slice().reverse();
  const meta = mappingFull[to.fullPath];
  // console.log(to.fullPath);   // 可以打印輸出看看
  // console.log(meta);
  let nearestWithTitle = undefined;
  let nearestWithMeta = undefined;
  if (meta) {
    nearestWithTitle = { meta };
    nearestWithMeta = { meta };
  } else {
    nearestWithTitle = matchPath.find(r => r.meta && r.meta.title);
    nearestWithMeta = matchPath.find(r => r.meta && r.meta.metaTags);
  }

  if(nearestWithTitle) document.title = nearestWithTitle.meta.title;
  Array.from(document.querySelectorAll('[data-vue-router-controlled]')).map(el => el.parentNode.removeChild(el));
  if(!nearestWithMeta) return next();
  nearestWithMeta.meta.metaTags.map(tagDef => {
    const tag = document.createElement('meta');
    Object.keys(tagDef).forEach(key => {
      tag.setAttribute(key, tagDef[key]);
    });
    tag.setAttribute('data-vue-router-controlled', '');
    return tag;
  })
  .forEach(tag => document.head.appendChild(tag));

  if (to.need && to.need.requireAuth) {
    if (store.getters.token) { 
      next();
    }
    else {
      next('/home');
      // next({
      //   path: '/login',
      //   query: {redirect: to.fullPath}  // 將跳轉(zhuǎn)的路由path作為參數(shù)矮燎,登錄成功后跳轉(zhuǎn)到該路由
      // });
    }
  }
  else {
    next();
  }
});

router.afterEach((to,from,next) => {
    window.scrollTo(0,0);
})

new Vue({
  store,
  router,
  render: h => h(App)
}).$mount('#app');

3. 疑問

我們大多都知道SEO優(yōu)化有很多方式定血,更可行的可能是SSR后端渲染,但是畢竟有時候我們就是前端渲染實現(xiàn)某個官網(wǎng)诞外,只能找找其他簡單可行辦法澜沟。文中這種做法實際上只有真是訪問的時候才可以拿到真正準確的TDK,各搜索引擎的爬蟲拿到的是靜態(tài)文件index.html的代碼view-source峡谊,那個時候TDK還沒有被替換茫虽,不知道這種做法是否真的有利于SEO。有待驗證既们。

歡迎留言提出此類問題的優(yōu)化濒析,互相學習。


學習是一條漫漫長路啥纸,每天不求一大步号杏,進步一點點就是好的。

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末斯棒,一起剝皮案震驚了整個濱河市盾致,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌名船,老刑警劉巖绰上,帶你破解...
    沈念sama閱讀 206,126評論 6 481
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異渠驼,居然都是意外死亡蜈块,警方通過查閱死者的電腦和手機,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,254評論 2 382
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來百揭,“玉大人爽哎,你說我怎么就攤上這事∑饕唬” “怎么了课锌?”我有些...
    開封第一講書人閱讀 152,445評論 0 341
  • 文/不壞的土叔 我叫張陵,是天一觀的道長祈秕。 經(jīng)常有香客問我渺贤,道長,這世上最難降的妖魔是什么请毛? 我笑而不...
    開封第一講書人閱讀 55,185評論 1 278
  • 正文 為了忘掉前任志鞍,我火速辦了婚禮,結(jié)果婚禮上方仿,老公的妹妹穿的比我還像新娘固棚。我一直安慰自己,他們只是感情好仙蚜,可當我...
    茶點故事閱讀 64,178評論 5 371
  • 文/花漫 我一把揭開白布此洲。 她就那樣靜靜地躺著,像睡著了一般委粉。 火紅的嫁衣襯著肌膚如雪呜师。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 48,970評論 1 284
  • 那天艳丛,我揣著相機與錄音匣掸,去河邊找鬼。 笑死氮双,一個胖子當著我的面吹牛碰酝,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播戴差,決...
    沈念sama閱讀 38,276評論 3 399
  • 文/蒼蘭香墨 我猛地睜開眼送爸,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了暖释?” 一聲冷哼從身側(cè)響起袭厂,我...
    開封第一講書人閱讀 36,927評論 0 259
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎球匕,沒想到半個月后纹磺,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 43,400評論 1 300
  • 正文 獨居荒郊野嶺守林人離奇死亡亮曹,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 35,883評論 2 323
  • 正文 我和宋清朗相戀三年橄杨,在試婚紗的時候發(fā)現(xiàn)自己被綠了秘症。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 37,997評論 1 333
  • 序言:一個原本活蹦亂跳的男人離奇死亡式矫,死狀恐怖乡摹,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情采转,我是刑警寧澤聪廉,帶...
    沈念sama閱讀 33,646評論 4 322
  • 正文 年R本政府宣布,位于F島的核電站故慈,受9級特大地震影響板熊,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜惯悠,卻給世界環(huán)境...
    茶點故事閱讀 39,213評論 3 307
  • 文/蒙蒙 一邻邮、第九天 我趴在偏房一處隱蔽的房頂上張望竣况。 院中可真熱鬧克婶,春花似錦、人聲如沸丹泉。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,204評論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽摹恨。三九已至筋岛,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間晒哄,已是汗流浹背睁宰。 一陣腳步聲響...
    開封第一講書人閱讀 31,423評論 1 260
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留寝凌,地道東北人柒傻。 一個月前我還...
    沈念sama閱讀 45,423評論 2 352
  • 正文 我出身青樓,卻偏偏與公主長得像较木,于是被迫代替她去往敵國和親红符。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 42,722評論 2 345

推薦閱讀更多精彩內(nèi)容