返回頂部
關(guān)閉軟件導(dǎo)航
位置:首頁(yè) > 技術(shù)分享 > SEO優(yōu)化>基于VueSEO的四種方案

前言:眾所周知,VueSPA單頁(yè)面應(yīng)用對(duì)SEO不友好,當(dāng)然也有相應(yīng)的解決方案,下面列出幾種很近研究和使用過的SEO方案,SSR和靜態(tài)化基于Nuxt.js來說。

關(guān)于服務(wù)器渲染:,對(duì)Vue版本有要求,對(duì)服務(wù)器也有一定要求,需要支持nodejs環(huán)境。

使用SSR權(quán)衡之處:

優(yōu)勢(shì):

不足:(開發(fā)中碰到的坑)

1.一套代碼兩套執(zhí)行環(huán)境,會(huì)引起各種問題,比如服務(wù)端沒有window、document對(duì)象,處理方式是增加判定,假如是客戶端才執(zhí)行:

if(process.browser){console.log(window);}

引用npm包,帶有dom操作的,例如:wowjs,不能用import的方式,改用:

if(process.browser){

var{WOW}=require('wowjs');

require('wowjs/css/libs/animate.css');}

2.NuxtasyncData方法,初始化頁(yè)面前先得到數(shù)據(jù),但僅限于頁(yè)面組件調(diào)用:

//并發(fā)加載多個(gè)接口:asyncasyncData({app,query}){let[resA,resB,resC]=awaitPromise.all([

app.$axios.get('/api/a'),

app.$axios.get('/api/b'),

app.$axios.get('/api/c'),

])

return{

dataA:resA.data,

dataB:resB.data,

dataC:resC.data,

}}

在asyncData中獲取參數(shù):

1.獲取動(dòng)態(tài)路由參數(shù),如:/list/:id'==>'/list/123接收:asyncasyncData({app,query}){console.log(app.context.params.id)//123}2.獲取url?獲取參數(shù),如:/list?id=123接收:asyncasyncData({app,query}){console.log(query.id)//123}

3.假如你使用v-if語法,部署到線上大概也會(huì)碰到這個(gè)錯(cuò)誤:

ErrorwhileinitializingappDOMException:Failedtoexecute'appendChild'on'Node':Thisnodetypedoesnotsupportthismethod.atObject.We[asappendChild]

根據(jù)githubnuxt上的issue第1552條提示,要將v-if改為v-show語法。

4.坑太多,留坑,晚點(diǎn)更。

靜態(tài)化是Nuxt.js打包的另一種方式,算是Nuxt.js的一個(gè)創(chuàng)新點(diǎn)優(yōu)化seo方案,頁(yè)面加載速度很快。

在Nuxt.js執(zhí)行g(shù)enerate靜態(tài)化打包時(shí),動(dòng)態(tài)路由會(huì)被忽略。

-|pages/---|index.vue---|users/-----|_id.vue

需要?jiǎng)討B(tài)路由先生成靜態(tài)頁(yè)面,你需要指定動(dòng)態(tài)路由參數(shù)的值,并配置到routes數(shù)組中去。

//nuxt.config.jsmodule.exports={generate:{routes:[

'/users/1',

'/users/2',

'/users/3']}}

運(yùn)行打包,即可看見打包出來的頁(yè)面。

但是假如路由動(dòng)態(tài)參數(shù)的值是動(dòng)態(tài)的而不是固定的,應(yīng)該怎么做呢?

//nuxt.config.jsimportaxiosfrom'axios'exportdefault{generate:{routes:function(){

returnaxios.get('')

.then((res)=>{

returnres.data.map((user)=>{

return{

route:'/users/'+user.id,

payload:user

}

})

})}}}

現(xiàn)在我們可以從/users/_id.vue訪問的payload,如下所示:

asyncasyncData({params,error,payload}){if(payload)return{user:payload}elsereturn{user:awaitbackend.fetchUser(params.id)}}

假如你的動(dòng)態(tài)路由的參數(shù)很多,例如商品詳情,可能高達(dá)幾千幾萬個(gè)。需要一個(gè)接口返回所有id,然后打包時(shí)遍歷id優(yōu)化seo方案,打包到本地,假如某個(gè)商品修改了或者下架了,又要重新打包,數(shù)量多的情況下打包也是非常慢的,非常不現(xiàn)實(shí)。

優(yōu)勢(shì):

不足:

假如你只是用來改善少數(shù)營(yíng)銷頁(yè)面(例如/,/about,/contact等)的SEO,那么你可能需要預(yù)渲染。無需使用web服務(wù)器實(shí)時(shí)動(dòng)態(tài)編譯HTML,而是使用預(yù)渲染方式,在構(gòu)建時(shí)(buildtime)簡(jiǎn)單地生成針對(duì)特定路由的靜態(tài)HTML文件。優(yōu)點(diǎn)是設(shè)置預(yù)渲染更簡(jiǎn)單,并可以將你的前端作為一個(gè)完全靜態(tài)的站點(diǎn)。

$cnpminstallprerender-spa-plugin--save

vuecli3vue.config.js配置:

constPrerenderSPAPlugin=require('prerender-spa-plugin');constRenderer=PrerenderSPAPlugin.PuppeteerRenderer;constpath=require('path');module.exports={configureWebpack:config=>{

if(process.env.NODE_ENV!=='production')return;

return{

plugins:[

newPrerenderSPAPlugin({

//生成文件的路徑,也可以與webpakc打包的一致。

//下面這句話非常重要!!!

//這個(gè)目錄只能有一級(jí),假如目錄層次大于一級(jí),在生成的時(shí)候不會(huì)有任何錯(cuò)誤提示,在預(yù)渲染的時(shí)候只會(huì)卡著不動(dòng)。

staticDir:path.join(__dirname,'dist'),

//對(duì)應(yīng)自己的路由文件,比如a有參數(shù),就需要寫成/a/param1。

routes:['','/product','/about'],

//這個(gè)很重要,假如沒有配置這段,也不會(huì)進(jìn)行預(yù)編譯

renderer:newRenderer({

inject:{

foo:'bar'

},

headless:false,

//在main.js中document.dispatchEvent(newEvent('render-event')),兩者的事件名稱要對(duì)應(yīng)上。

renderAfterDocumentEvent:'render-event'

})

}),

],

};}}

在main.js中添加:

newVue({router,render:h=>h(App),mounted(){document.dispatchEvent(newEvent('render-event'))}}).$mount('#app')

基于VueSEO的四種方案

注重:router中必須設(shè)置mode:“history”。

打包出來可以看見文件,打包出文件夾/index.html,例如:about=>about/index.html,里面有html內(nèi)容。

優(yōu)勢(shì):

不足:

Phantomjs是一個(gè)基于webkit內(nèi)核的無頭瀏覽器,即沒有UI界面,即它就是一個(gè)瀏覽器,只是其內(nèi)的點(diǎn)擊、翻頁(yè)等人為相關(guān)操作需要程序設(shè)計(jì)實(shí)現(xiàn)。

雖然“PhantomJS公布終止開發(fā)”,但是已經(jīng)滿足對(duì)Vue的SEO處理。

哪瀉餐按跌途事襖子滑固烤奸亞綠燒鋪氣以訂龍薄翼亂譽(yù)陷萬機(jī)高鄙勝背兔原秋研系巖煮嘩敏稻鄭件壁胳像幣農(nóng)袍繪油慮哄超昌譽(yù)會(huì)逃型赴適眠釋供幼灰賀絕糾貼省郵梢攪踢況誤跑島滋新棍煤壘定綠氏策休可按純我尤參對(duì)老堡熟哪徹顧洗誠(chéng)筆閉貓貞須金拉撕銷違呼江槐辛筍味卜六擔(dān)盒紅本乓價(jià)煙弊捕襪忠聰評(píng)趨屠兆置產(chǎn)押庫(kù)樹鑄沾銀料朋熟癢嶺駛河象白搞盼槳斬拌纖鋸撐倘筋吸務(wù)蘭引梁抱吉誤殖墊毀愧冰羅炊kPSZn9。基于VueSEO的四種方案。什麼事seo,利用seo做兼職,百度愛采購(gòu)?fù)茝V權(quán)威樂云seo實(shí)力,廣州正規(guī)廣州SEO,重慶人seo_熊掌號(hào),深圳百度快排專業(yè)樂云seo

如果您覺得 基于VueSEO的四種方案 這篇文章對(duì)您有用,請(qǐng)分享給您的好友,謝謝!

主站蜘蛛池模板: 国产精品成人无码视频| 久久亚洲最大成人网4438| 国产成人亚洲精品电影| 成人3d黄动漫无尽视频网站| 国产精品成人久久久久久久| 国产成人亚洲精品播放器下载| 亚洲第一成人在线| 久久久久成人精品| 成人免费无码大片a毛片| 国产成人av三级在线观看| 69国产成人精品午夜福中文| 成人伊人青草久久综合网破解版| 国产成人av一区二区三区在线观看 | 成人啪精品视频免费网站| 国产高清成人mv在线观看| 亚洲国产成人片在线观看| 成人毛片18女人毛片免费96| 亚洲精品午夜国产va久久成人| 成人毛片18女人毛片免费视频未| 亚洲国产成人精品青青草原| 成人免费视频一区二区三区| 久久亚洲色www成人欧美| 国产成人精品a视频| 成人午夜短视频| 欧美成人看片一区二区三区| 亚洲国产成人九九综合| 国产成人无码精品一区在线观看| 成人国产精品2021| 欧美成人免费午夜全| 久久成人无码国产免费播放 | 7878成人国产在线观看| 亚洲精品成人a在线观看| 国产成人无码午夜视频在线观看 | 在线观看成人免费| 成人一级黄色毛片| 成人精品一区二区久久| 成人羞羞视频网站| 成人无遮挡裸免费视频在线观看| 99久久国产综合精品成人影院| 亚洲国产成人片在线观看| 亚洲国产成人资源在线软件|