19 07 2019

最近公司用vue做前端网站,用到了seo相关知识,可是发现Vue不适合seo优化,怎么办?

经过了反反复复百度、谷歌的查询最终确定了用nuxt.js  vue的应用框架并适合seo。它主要是用 SSR服务端渲染模式来应对爬虫抓取

前期主要是应用了  pages页面的asyncData 方法  :asyncData方法会在组件(限于页面组件)每次加载之前被调用。它可以在服务端或路由更新之前被调用。在这个方法被调用的时候,第一个参数被设定为当前页面的上下文对象,你可以利用 asyncData方法来获取数据并返回给当前组件。

网上找了很多例子都是抄的文档并不清楚其中asyncData方法中先ajax获取数据,然后把数据返回data没错 它返回的数据就是绑定data里的预加载字段(重点)

上代码:


//预渲染seo
asyncData({app, query}) {
let navid = app.context.params.navId
  return app.$axios.$get('?method=pmd.web.detail.nav&nav_id='+navid).then(res => {

return {title: res.retValue.nav.name+'-'+res.retValue.nav.company
}
  })

},


到这我以为结束了,很开心的过了一个月。直到一天领导找到了我。。。。。。。。。。。为啥内页没有源代码。。。。。。。内心奔溃中。宝宝也不知道怎么回事。

好吧继续谷歌,因为我发现百度全是抄的同一篇文章 也不知道是不是只有这一篇文章才能被优化上去。

直到我发现了渲染生命周期一开始的服务器端  vuex的store  nuxtServerInit() 方法


它是什么呢? 它会触发(dispatch)一个action, action 随后会执行(commit)一个mutation, mutation 立即会改变state, state 改变以后,我们的页面会state 获取数据,页面发生了变化。 Store 对象,包含了我们谈到的所有内容,action, state, mutation,所以是核心了(我也看不懂反正就用nuxtServerInit() 方法就对了)

上代码吧就是获取数据然后放到state里面 由于隐私原因上了个官方文档自己写吧很简单

第二个参数我加了个 app 这个官方没有写但是有说  如果想获取路由的id 用下面的方法 params即id




			

import Vuex from 'vuex'

let store = () => new Vuex.store({

state: { token: '' }, mutations: { setToken (state, token) { state.token = token } }, actions: {

nuxtServerInit({ commit}, { req ,app}) {

           

let params = app.context.params


let cookie = req,headers.cookie commit('setToken ', cookie.token) } }

})

完成了一大半了

在页面上就可以直接获取store.state的数据提前在服务器渲染了。


你以为这样就完了 然后发现任何时候都要小心异步获取如果要等待数据 就必须用

async await

最后一个绝招 必须告诉你们了 页面seo的时候底部会出现

就会发现源代码里面有一串这样的代码window.__NUXT__=(function(a,b,c,d,e,f,g,h,i,j,k,l,m,n,o,p,q,r,s,t,u,v,w,x,y,z,A,B,C,D,E,F,G,H,I,J,K,L,M,N,O,P,Q,R,S,T,U,V,W,X,Y,Z,_,$,aa, 等等代码

怎么隐藏呢 我不知道 我最后用了简单粗暴方法

找到这个文件 直接搜最后文件就能找到 \node_modules\nuxt\node_modules@nuxt\core\node_modules@nuxt\vue-renderer\dist\vue-renderer.js


// 注释代码下面三行代码 APP += `<script>${serializedSession}</script>`;   hash.update(serializedSession); cspScriptSrcHashes.push(`'${csp.hashAlgorithm}-${hash.digest('base64')}'`);

重新编译 完毕! 希望领导能通过我的修改。




发表评论