单页面应用(SPA)对于SEO不友好的问题可以通过预渲染(Prerender)和服务端渲染(SSR)技术解决
本文主要记录预渲染技术在vue cli构建的项目中的使用
用到插件prerender-spa-plugin
、vue-meta-info
示例基于
vue:“^2.6.11”
vue-cli:“~4.5.0”
⚠️:router
中路由模式一定要修改为 history
才能生效,hash
模式生成的页面都是一样的
npm i prerender-spa-plugin --save-dev
(prerender-spa-plugin
的主要原理是启动浏览器
,渲染完成后抓取HTML
,然后再替换掉原有HTML
)
vue-cli4.x项目默认没有vue.config.js
(3.x同样没有),请手动创建
配置如下:
基本不需要修改,除了routes
那里的配置,要改成你自己的路由
const PrerenderSPAPlugin = require('prerender-spa-plugin');
const Renderer = PrerenderSPAPlugin.PuppeteerRenderer;
const path = require('path');
module.exports = {
configureWebpack: () => {
return {
plugins: [
new PrerenderSPAPlugin({
// 输出预渲染文件的目录
staticDir: path.join(__dirname, 'dist'),
// 预渲染的路由,对应自己的路由文件
// ⚠️:这里配不了动态路由 要传参的也不行
routes: ['/home', '/project', '/develop','/develop/us','/develop/managers','/develop/activities','/develop/items'],
// 要使用的渲染器的配置
renderer: new Renderer({
// 触发渲染的时间,用于获取数据后再保存渲染结果
renderAfterTime: 5000,
// 等待渲染,直到文档上调度指定的事件
// 在 main.js 中 document.dispatchEvent(new Event('render-event')),两者的事件名称要对应上。
renderAfterDocumentEvent: 'render-event'
})
}),
],
};
}
};
更多配置访问
https://github.com/chrisvfritz/prerender-spa-plugin#about-prerender-spa-plugin
此方法名要跟上面的 vue.config.js
中配置的renderAfterDocumentEvent
一致
new Vue({
render: h => h(App),
mounted() {
document.dispatchEvent(new Event('render-event'));
}
}).$mount('#app')
这时候npm run build
,生成的文件是每个路由都会对应一个index.html
要使用到插件vue-meta-info
vue-meta-info 是一个基于vue 2.0的插件,它会让你更好的管理你的 app 里面的 meta 信息。你可以直接 在组件内设置 metaInfo 便可以自动挂载到你的页面中。当然,有时候我们也可能会遇到让人头疼的SEO问题,那么使用此插件配合 prerender-spa-plugin 也是再合适不过了
安装:
npm install vue-meta-info --save
引入:
// main.js
import MetaInfo from 'vue-meta-info';
Vue.use(MetaInfo);
组件内使用:
每个组件都可以设置不同的配置项
export default {
name: "Home",
metaInfo: {
meta: [
{
name: "keywords",
content:"...",
},
{
name: "description",
content:"...",
},
],
},
}
具体步骤已经结束了,下面简易记录一下
在打包结束并生成文件之后,会启动一个server模拟网站运行来访问指定的页面,得到相应的html结构并输出到指定目录里
由于是先生成内容再生成html文件,这样网络爬虫就能爬取到网站的内容
本文参考:
https://blog.csdn.net/weixin_30852391/article/details/111915355
https://blog.csdn.net/qq_40893035/article/details/111643676?utm_medium=distribute.pc_relevant.none-task-blog-2defaultbaidujs_title~default-0.no_search_link&spm=1001.2101.3001.4242.1&utm_relevant_index=3
https://blog.csdn.net/qq_37564189/article/details/106090414
https://blog.csdn.net/weixin_42899690/article/details/120556911