vue预渲染之prerender-spa-plugin插件应用
栏目: JavaScript · 发布时间: 5年前
内容简介:前几天应需求做了一个网页测速小工具,经过考虑,进行了一些选型,由于在公司一直用react搬砖,所以这次决定提高全方面能力,接触并使用vue构建一个小型项目,vue用gizp压缩后仅有约33KB,加上axios和prerender-spa-plugin以及业务代码,压缩后仅不到50KB,用户体验比较良好。由于使用vue次数不多,所以各种查阅资料,但是感觉过程中非常不顺畅,从我的感受看,网上vue平均提供的资料远不如react提供的资料,踩过一些坑,特别是prerender-spa-plugin插件遇到了很多
前几天应需求做了一个网页测速小工具,经过考虑,进行了一些选型,由于在公司一直用react搬砖,所以这次决定提高全方面能力,接触并使用vue构建一个小型项目,vue用gizp压缩后仅有约33KB,加上axios和prerender-spa-plugin以及业务代码,压缩后仅不到50KB,用户体验比较良好。
由于使用vue次数不多,所以各种查阅资料,但是感觉过程中非常不顺畅,从我的感受看,网上vue平均提供的资料远不如react提供的资料,踩过一些坑,特别是prerender-spa-plugin插件遇到了很多网上没有提及的问题,于是把自己的收获分享出来,给vue贡献一份力量。
源起
先读了vue官方的指南,说的很清晰,如果图省事,而且是小型展示项目的话,用预渲染再好不过,可以解决SEO和用户加载体验两大痛点,听上去很棒,很符合我现在的需求,于是就开始动手吧!
安装
安装这个插件是第一个坑点,由于这个小项目是独立的,所以不需要考虑npm包的版本,直接上最新的vuecli3.0跑整个环境,但是说实话,vuecli3这个脚手架给我的体验很糟糕,原有的webpack配置被隐藏了,换成了vue.config.js,但是网上资料不多,配置多花了些时间 安装prerender-spa-plugin时用了nrm切到cnpm,但是总是卡在安装puppeteer这个地方,prerender-spa-plugin插件是需要依赖puppeteer的,这个插件会下载最新版的chromium---谷歌出品的无头(headless)浏览器内核(大约200M+),所以如果不能科学上网,下载的时候就报错了。我是用的lantern等了很长一段时间,才下载完,版本是72,所以说,经常翻墙很重要啊:sweat_smile:
原理
puppeteer是谷歌出品的一个插件,可以完成很多的操作,广泛使用在爬虫、测试自动化等浏览器自动化方向的应用,而prerender-spa-plugin这个插件正是依赖puppeteer操作chromium这个真正的浏览器内核对SPA跑了一遍,生成一个静态的HTML,里面是已经填好的dom节点和数据,就是这么简单粗暴,为了给用户直接返回有内容的xhtml文档,提前在一个浏览器里跑了一遍,生成了跑过js和css之后index.html(跟路由)和其他文档。这样的话有两个缺陷,第一个:无法展示用户自身的内容,第二个:不适合动态路由多的大型项目。理解了原理,就可以放心使用了
配置
如果开始使用,第一个要注意的点是要把引入的vue-router模式设置为history(平时我也是推荐用history模式,hash有#很丑,只是history多配置一下回到根目录),不过如果本身就是一个根路径,没有下级路由,那么不引入vue-router也是会给编译的。。。
在vuecli3.0中,所有的原webpack配置都被放到vue.config.js
里面。 如果时间富裕,建议从头读一下github的
官方MD 在
vue.config.js
里面先引入
const PrerenderSPAPlugin = require('prerender-spa-plugin'); const Renderer = PrerenderSPAPlugin.PuppeteerRenderer; 复制代码
然后module.exports
configureWebpack: { plugins: [ new PrerenderSPAPlugin({ staticDir: path.join(__dirname,'dist'), routes: ['/'], renderer: new Renderer({ inject: { foo: 'bar' }, headless: false, renderAfterDocumentEvent: 'render-event', //renderAfterTime: 5000, //renderAfterElementExists: 'my-app-element' }), }), .............. 复制代码
renderAfterDocumentEvent
mounted: function(){ document.dispatchEvent(new Event('render-event')); }, 复制代码
这样配置过后,每次打包build,插件就会自动调用chromium内核把路由中的html里面填上内容,想观察区别可以通过chrome的preview查看 没有经过预渲染(类似效果,百度做了很多处理):
经过预渲染之后
这样就大功告成了,水平所限,写的不够深刻,感谢大家阅读!
以上就是本文的全部内容,希望本文的内容对大家的学习或者工作能带来一定的帮助,也希望大家多多支持 码农网
猜你喜欢:- 预渲染插件prerender-spa-plugin使用总结
- Octane渲染入门-渲染设置图文版
- 通过分析 WPF 的渲染脏区优化渲染性能
- React 服务器端渲染和客户端渲染效果对比
- iOS渲染-将视频原始数据(RGB,YUV)渲染到屏幕上
- 通过共享内存优化 Flutter 外接纹理的渲染性能,实时渲染不是梦
本站部分资源来源于网络,本站转载出于传递更多信息之目的,版权归原作者或者来源机构所有,如转载稿涉及版权问题,请联系我们。