|
vue SEO解决方案什么是SEO
搜索引擎优化,提高网站搜索关键词排名和公司产品的曝光度。
搜索引擎的原理是从meta标签中读取内容,从HTML标签(h1-h6,,em等标签)中抓取并分析内容,读取a标签中的链接,然后跳转到其他通过a标签的链接进行链接。网站(深度优先:先跳回再爬行;广度优先:先爬行再按顺序跳转) SEO需要什么?多个页面需要动态改变网页的标题、描述、关键词网站内容。
注意:这里的关键点是网站内容的来源。如果页面的数据是通过请求来的,那么当页面加载时,首先会有一个DOM结构,然后才会有数据。也就是说,此时的网站内容无法被蜘蛛抓取,因此不会被百度收录。
为什么SEO对单页应用不友好? Vue通过js控制路由,然后渲染对应的页面。因此,所有的跳转或者隐藏在js中的数据都无法获取。蜘蛛爬行时不会执行JS,导致搜索引擎只能收录Index.html,但无法搜索到其相关子页面的内容。当浏览器加载页面时,它首先会渲染页面(dom生成、css构建、解析、布局、绘制)。当js解析完毕后,会触发vue的渲染,并将挂载到app的id上。 div,这样我们才能看到页面的内容。因此,被搜索引擎索引的索引页可能毫无价值,因为它们不包含任何数据。由此带来的问题是单页应用无法进行SEO,也无法动态更改网页的TDK(标题、描述、关键词)。每个页面的title和meta标签都是一样的,不利于蜘蛛爬行。 vue seo 解决方案
当然,为了良好的SEO性能,前后端一般是不分离的。优点是由于接口不需要暴露,所以对SEO非常有利,所以安全系数高。缺点是压力全部集中在服务器端,导致服务器负载过重。
预渲染-spa-服务端渲染:Nuxt.js解决方案1,-spa-
预渲染也称为客户端渲染,是指在页面加载之前将数据放入页面中。如果是vue文件,我们希望打包时生成多个页面。这时候我们就可以使用-spa-了。
现有问题:动态路由无法解决【如详情页】,不能动态改变title、、。
适用场景:比如公司官网只适合某些需要SEO的页面。
使用:
1.安装插件
<p style='margin-bottom:15px;color:#555555;font-size:15px;line-height:200%;text-indent:2em;'> <pre><code>cnpm install --save prerender-spa-plugin 解决打包多个页面
cnpm install --save vue-meta-info 设置title、描述、关键字,解决SEO的问题
</code></pre></p>
配置vue..js:
<p style='margin-bottom:15px;color:#555555;font-size:15px;line-height:200%;text-indent:2em;'> <pre><code class="prism language-js"><span class="token keyword">const</span> path <span class="token operator">=</span> <span class="token function">require</span><span class="token punctuation">(</span><span class="token string">'path'</span><span class="token punctuation">)</span><span class="token punctuation">;</span>
<span class="token keyword">const</span> PrerenderSPAPlugin <span class="token operator">=</span> <span class="token function">require</span><span class="token punctuation">(</span><span class="token string">'prerender-spa-plugin'</span><span class="token punctuation">)</span><span class="token punctuation">;</span>
module<span class="token punctuation">.</span>exports <span class="token operator">=</span> <span class="token punctuation">{</span>
publicPath<span class="token operator">:</span> <span class="token string">'./'</span><span class="token punctuation">,</span>
configureWebpack<span class="token operator">:</span> <span class="token punctuation">{</span>
plugins<span class="token operator">:</span> <span class="token punctuation">[</span>
<span class="token keyword">new</span> <span class="token class-name">PrerenderSPAPlugin</span><span class="token punctuation">(</span><span class="token punctuation">{</span>
staticDir<span class="token operator">:</span> path<span class="token punctuation">.</span><span class="token function">join</span><span class="token punctuation">(</span>__dirname<span class="token punctuation">,</span> <span class="token string">'dist'</span><span class="token punctuation">)</span><span class="token punctuation">,</span>
routes<span class="token operator">:</span> <span class="token punctuation">[</span> <span class="token comment">// 需要预渲染的路由地址(需要打包成几个页面就配置几个路由)</span>
<span class="token string">'/'</span><span class="token punctuation">,</span>
<span class="token string">'/about'</span><span class="token punctuation">,</span>
<span class="token string">'/contact'</span><span class="token punctuation">,</span>
<span class="token punctuation">]</span><span class="token punctuation">,</span>
<span class="token punctuation">}</span><span class="token punctuation">)</span><span class="token punctuation">,</span>
<span class="token punctuation">]</span><span class="token punctuation">,</span>
<span class="token punctuation">}</span><span class="token punctuation">,</span>
<span class="token punctuation">}</span><span class="token punctuation">;</span>
</code></pre></p>
在组件中使用 vue-meta-info:
<p style='margin-bottom:15px;color:#555555;font-size:15px;line-height:200%;text-indent:2em;'> <pre><code class="prism language-vue"><template>
<h2>Home Page</h2>
</template>
<script>
export default {
metaInfo: {
title: 'aaaaaaa商城', // set a title
meta: [{ // set meta
name: '关键字,web前端',
content: '描述。。。。。。。。。'
}]
link: [{ // set link
rel: 'asstes',
href: 'https://assets-cdn.github.com/'
}]
}
}
</script>
</code></pre></p>
注意:这里不能使用组件中的数据(API接口请求的动态数据)。必须是手写的。前端自检时需要将路由模式设置为hash。
方案二、服务端渲染:Nuxt.js 优点:纯静态文件,相比SSR访问速度更快,不涉及服务器负载问题 静态网页不易受到黑客攻击,安全性更高 问题:如果动态路由较多如果使用Nuxt.js进行静态打包,动态路由会被忽略,打开网站会很慢。压力全部压在服务器上,这和没有前后端分离几乎是一样的。
适用场景:整个网站SEO
用途:前端自检
<p style='margin-bottom:15px;color:#555555;font-size:15px;line-height:200%;text-indent:2em;'> <pre><code>npm run build
npm run generate
</code></pre></p>
注:仅用于前端自测试。此时打包的文件无法发送到后端。
项目打包并上线
1.运行打包命令
<p style='margin-bottom:15px;color:#555555;font-size:15px;line-height:200%;text-indent:2em;'> <pre><code>npm run build
</code></pre></p>
2. 移动文件
<p style='margin-bottom:15px;color:#555555;font-size:15px;line-height:200%;text-indent:2em;'> <pre><code>.nuxt、static、nuxt.config.js、package.json
</code></pre></p>
把上面的文件交给后端,让它放到服务器上(***)
3.后端安装:在服务器上安装Node.js环境后启动打包的项目。
<p style='margin-bottom:15px;color:#555555;font-size:15px;line-height:200%;text-indent:2em;'> <pre><code>npm run start
</code></pre></p>
注意:因为Nuxt.js的默认端口是::3000/,但是我们需要指向自己的域名,所以后端需要配置默认端口。 |
|