前言:
公司现有一个新需求需要在原有的vue2项目上面进行预渲染,进行SEO的优化,在网上进行了一系列的搜索,发现两种简单易上手的方案(1.使用prerender-spa-plugin+vue-meta-info进行打包构建;2.使用nuxt.js在开发过程中就渲染呈现出来)
因是在原有项目基础上进行,所以采用第一种方案进行构建渲染,话不多说,直接上代码!!!
一、prerender-spa-plugin插件使用
1.安装
//npm npm install prerender-spa-plugin --save //yarn yarn add prerender-spa-plugin --dev
2.找到build文件下webpack.prod.conf.js 在页面中添加代码
// 预渲染 const PrerenderSPAPlugin = require('prerender-spa-plugin') const Renderer = PrerenderSPAPlugin.PuppeteerRenderer plugins: [ // 预渲染 new PrerenderSPAPlugin({ // 生成文件的路径,也可以与webpakc打包的一致。 // 下面这句话非常重要!!! // 这个目录只能有一级,如果目录层次大于一级,在生成的时候不会有任何错误提示,在预渲染的时候只会卡着不动。 staticDir: path.join(__dirname, '../dist'), // 对应自己的路由文件,比如a有参数,就需要写成 /a/param1。 routes: ['/', '/index'], // 这个很重要,如果没有配置这段,也不会进行预编译 renderer: new Renderer({ inject: { foo: 'bar' }, // headless: false, // renderAfterDocumentEvent: 'render-event', // 在 main.js 中 document.dispatchEvent(new Event('render-event')),两者的事件名称要对应上。 // args: ['--no-sandbox', '--disable-setuid-sandbox'] navigateOptions:{ timeout: 0, } }) ]
3.在main.js里面添加mounted newEvent(‘document’) document名字必须与第二步中的名字对呀
// 添加mounted,不然不会执行预编译 mounted () { document.dispatchEvent(new Event('render-event')) }
4.router.js中一定要设置history模式
5.npm run build
打包之后可以看到配置好的路由生成了相应的html页面
二、vue-meta-info使用
1.插件安装
npm install vue-meta-info --save
2.main.js引用
import MetaInfo from 'vue-meta-info' // 注册 Vue.use(MetaInfo)
3.页面上使用
3.1-直接在页面上使用
//单个页面配置 <template> <div>首页</div> </template> export default { name:'首页' metaInfo:{ title:'首页', meta:[ { name: 'keyWords', content:'关键字' }, { name:'description', content:'描述' } ] } } //多页面配置 <template> <div>首页</div> </template> export default { name:'index' metaInfo():{ return{ meta:this.metaData } }, data(){ return{ metaData:'' } }, watch:{ $route(to,form){ //通过跳转页面配置每个页面的关键字和描述,这只是个例子 //注意如果通过to.path去判断 需要进行兼容判断 因为渲染后的访问路径会在末尾自动添加/ 例如 loclhost:3000/index/,这个时候就需要 to.path === '/index' || to.path==='/index/' if(to.name === 'index'){ this.metaData=[ { name: 'keyWords', content:'关键字' }, { name:'description', content:'描述' } ] } //当然也可以封装一个方法去返回每个页面的文案 //this.metaData = metaSetFuc(to.name) } } }
3.2-新建一个js文件里面
export default { index: { title: 'title', meta: [ { name: 'keywords', content: '' }, { name: 'description', content: '' } ] }, }
然后再页面上面去引用
//导入存放的文件路径 import VueMetaInfo from '../assets/vue-meta-info.js' export default { metaInfo: VueMetaInfo.index, }
三、在使用中遇到的问题
1.[prerender-spa-plugin] Unable to prerender all routes! 错误
在node_modules -> @prerender -> renderer-puppeteer -> es6 -> renderer.js(113行)
await page.goto(`${baseURL}${route}`, navigationOptions); //修改为 await page.goto(`${baseURL}${route}`, {...navigationOptions, timeout: 0});
1.本站内容仅供参考,不作为任何法律依据。用户在使用本站内容时,应自行判断其真实性、准确性和完整性,并承担相应风险。
2.本站部分内容来源于互联网,仅用于交流学习研究知识,若侵犯了您的合法权益,请及时邮件或站内私信与本站联系,我们将尽快予以处理。
3.本文采用知识共享 署名4.0国际许可协议 [BY-NC-SA] 进行授权
4.根据《计算机软件保护条例》第十七条规定“为了学习和研究软件内含的设计思想和原理,通过安装、显示、传输或者存储软件等方式使用软件的,可以不经软件著作权人许可,不向其支付报酬。”您需知晓本站所有内容资源均来源于网络,仅供用户交流学习与研究使用,版权归属原版权方所有,版权争议与本站无关,用户本人下载后不能用作商业或非法用途,需在24个小时之内从您的电脑中彻底删除上述内容,否则后果均由用户承担责任;如果您访问和下载此文件,表示您同意只将此文件用于参考、学习而非其他用途,否则一切后果请您自行承担,如果您喜欢该程序,请支持正版软件,购买注册,得到更好的正版服务。
5.本站是非经营性个人站点,所有软件信息均来自网络,所有资源仅供学习参考研究目的,并不贩卖软件,不存在任何商业目的及用途
暂无评论内容