由于项目要做seo优化,而用vue写成的spa页面谷歌浏览器等是抓取不到数据的。介于ssr和预渲染来说,后者相对来说要简单许多。所以采用了预渲染方式。采用插件prerender-spa-plugin使用

第一步:修改配置文件webpack.prod.conf.js

在

const webpackConfig = merge(baseWebpackConfig, {
plugins: [
new webpack.DefinePlugin({

new PrerenderSpaPlugin(
// Required - The path to the webpack-outputted app to prerender.
path.join(__dirname, '../dist'),
// Required - Routes to render.
[ '/','/wap/Runescape-3.Gold','/wap/Runescape-2007.Gold','/wap/RS-07-Accounts.account','/wap/Runescape-2007.FireCape','/wap/customer/message.html' ],
{
//在一定时间后再捕获页面信息,使得页面数据信息加载完成
captureAfterTime: 10000,
//忽略打包错误
maxAttempts: 10,
}
)
打包发现一直报超时错误,后面发现我在index.html文件写了一段判断设备是移动端还是pc端的js代码,可能是判断不出来导致一直打包不了,删了就好了。

最后发现可以打包,但打开页面发现动态获取数据的部分展示不出来,最后网上查看发现了一个问题,一个很关键的问题,就是

要把app.vue文件的最外面容器的id要设置成和index.html一样

//index.html
<body>
<div id="app"></div>
</body>

// app.vue
<template>
<div id="app"></div>
</template>
改完后就ok了。

一定要加上延时渲染,captureAfterTime: 10000, 不然预渲染出来的页面是没有数据的。因为接口获取数据需要时间

打包上线后报错 webpackJsonp is not defined。这是因为公共文件必须在自己引用的js文件之前引用。

可以手动改文件引用,但是推荐以下解决办法:

找到build→webpack.prod.conf.js→找到HtmlWebpackPlugin插件,添加如下配置即可

chunks: ['manifest', 'vendor', 'app']
改了后发现依然报错,而查看渲染的页面发现位置没错

那为什么报错呢

经过仔细查看,发现那两个报错的js文件删了也没问题,后来查看没有预渲染的页面是没有这两个js文件的,也就是说这2个js文件是由上图3个js文件生成的,这2个js文件是用来动态生成dom页面的。然而我们预渲染把这2个文件生成出来了,而且是放在head标签里的,这时还没执行到上图3个js文件,所以肯定报错。目前比较笨的方法就是手动删除这2个js。

最后一个问题:每次打开页面和刷新页面,整个页面布局变得特别混乱。过了大概1s左右页面就正常了,起初以为是不是样式没有加载。后面调试发现样式正常加载的啊?那是什么鬼问题,按理说link加载样式在head标签,肯定是加载完再加载body啊。

看了半天没有看出个所以然来,后面偶然撇了一眼渲染后的页面

我去!!!,这个font-size:46.222px是什么鬼?这么大的字体能不造成页面混乱吗。这才恍然大悟,因为是移动端,加了段动态判定设备的浏览器可视区宽度来设定根字体大小的js。然后在预渲染时,根本没有浏览器窗口这个数据,估计是以电脑屏幕大小判定了。结果给了个惊人的字体大小。所以每次打开页面的第一时间是预渲染的页面。经过再次判定后调回正常,所以出现了短暂的布局混乱。目前没想到什么好的方法去改,只能手动修改字体大小。
---------------------
作者:二叶扁舟
来源:CSDN
原文:https://blog.csdn.net/u010276653/article/details/79933233
版权声明:本文为博主原创文章,转载请附上博文链接!

vue项目使用 prerender-spa-plugin 预渲染的更多相关文章

  1. 什么是服务端渲染、客户端渲染、SPA、预渲染,看完这一篇就够了

    服务端渲染(SSR) 简述:     又称为后端渲染,服务器端在返回html之前,在html特定的区域特定的符号里用数据填充,再给客户端,客户端只负责解析HTML.     鼠标右击点击查看源码时,页 ...

  2. 在Vue项目中 选择图片并预览

    最近开始使用vue做项目 在这个过程中,碰到了大多数做前端肯定经历的一个问题,就是文件上传预览 花了点时间解决,因此分享一下预览功能的解决方案 页面: <div class="sele ...

  3. vue项目echarts画布删除历史数据重新渲染数据

    vue用到echarts时,根据select多选下拉框进行echarts折线图渲染.发现折现只能增加不能减少,后来根据echarts API文档发现 调用方式: chart.setOption(opt ...

  4. vue项目中编写一个图片预览的公用组件

    今天产品提出了一个查看影像的功能需求. 在查看单据的列表中,有一列是影像字段,一开始根据单据号调用接口查看是否有图片附件,如果有则弹出一个全屏的弹出层,如果没有给出提示.而且,从列表进入详情之后,附件 ...

  5. Vue项目预渲染机制引入实践

    周末想顺便把已经做好静态页面的webApp项目做一下SEO优化,由于不想写蹩脚的SSR代码,所以准备采用预渲染,本来想着网上有这么多预渲染的文章,随便找个来跟着做不就完了嘛,结果年轻的我付出了整个周末 ...

  6. Prerender.io - 预渲染架构,提高AngularJS SEO

    近些年来,越来越多的JavaScript框架(即AngularJS,BackboneJS,ReactJS)变得越来越流行.许多公司和开发人员使用这些JavaScript框架开发应用程序.这些框架有很多 ...

  7. prerender-spa-plugin预渲染踩坑

    为什么要使用预渲染? 为了应付SEO(国内特别是百度)考虑在网站(vue技术栈系列)做一些优化.大概有几种方案可以考虑: 服务端做优化: 第一,ssr,vue官方文档给出的服务器渲染方案,这是一套完整 ...

  8. Vue项目预渲染机制

    我们知道SPA有很多优点,不过一个缺点就是对(不是Google的)愚蠢的搜索引擎的SEO不友好,为了照顾这些引擎,目前主要有两个方案:服务端渲染(Server Side Rendering).预渲染( ...

  9. 用prerender-spa-plugin插件Vue项目优化SEO做ssr服务端渲染及预渲染

    今天在做公交的时候没干,用手机看看文章,偶然发现了一个关于Vue优化seo的文章,我先是在Vue的官方文档看了一篇关于Vue做SEO优化的文章. 上面提到了nuxt.js这个框架,这个框架我做过一个小 ...

随机推荐

  1. linux模块驱动之led(ioremap)

    一:led内核驱动 (1)在编写led内核驱动时,我们首先要进行内核裁剪,因为友善之臂将LED灯的驱动默认加载到内核中,所以编写模块驱动程序前就要先把原先的LED灯驱动裁剪掉: led驱动在源码里面的 ...

  2. Intent传值的学习

    今天学习了Intent传值的过程,有点安卓编程经验的都知道,Intent可以实现页面的跳转,可以从一个activity跳转到另一个activity,这个名义上说是界面跳转,其实这句话现在觉得说的很不严 ...

  3. GO安全并发之无锁原子操作

    声明:本文是<Go并发编程实战>的样章,禁止以任何形式转载此文. 摘要: 我们已经知道,原子操作即是进行过程中不能被中断的操作.也就是说,针对某个值的原子操作在被进行的过程当中,CPU绝不 ...

  4. mvn -DskipTests和-Dmaven.test.skip=true区别

    在使用mvn package进行编译.打包时,Maven会执行src/test/java中的JUnit测试用例,有时为了跳过测试,会使用参数-DskipTests和-Dmaven.test.skip= ...

  5. 多线程统计次数问题:即count++

    场景:日志需要统计每天数据上传的次数和上传的数据量. 如果是单线程可以使用简单的int count = 0:count++,但很多情况都是多线程环境所以就不能单纯的使用count++了!!! 多线程环 ...

  6. 开机进入grub命令行之后。。。。

    最近由于经常整理自己电脑上的文件,难免都会遇到误删系统文件或者操作失误导致系统不能够正常进入的情况.这时就会出现grub错误的提示,只能输入命令才能进入系统.那么该输入什么命令呢?其实非常简单. gr ...

  7. laravel rbac的用户 角色 权限的crud

    user.php <?php /* |-------------------------------------------------------------------------- | W ...

  8. 全文检索选择-------- Elasticsearch与Solr

    Elasticsearch简介* Elasticsearch是一个实时的分布式搜索和分析引擎.它可以帮助你用前所未有的速度去处理大规模数据. 它可以用于全文搜索,结构化搜索以及分析,当然你也可以将这三 ...

  9. Laravel分页带参数的实现方法

    控制器: $data['type'] = 5;$data['member_list'] = Member::orderBy('id', 'desc')->paginate(10);return ...

  10. 通过jQuery和C#分别实现对.NET Core Web Api的访问以及文件上传

    准备工作: 建立.NET Core Web Api项目 新建一个用于Api请求的UserInfo类 public class UserInfo { public string name { get; ...