vue预加载动态生成runtime.js_预渲染 prerender-spa-plugin 避坑指南

48c248fffe286c47ed8b5697e560b802.png

预渲染原理

在webpack打包结束并生成文件后(after-emit hook),会启动一个server模拟网站的运行,用puppeteer(google官方的headless 无头浏览器浏览器)访问指定的页面route,得到相应的html结构,并将结果输出到指定目录,过程类似于爬虫。

预渲染应用场景:

  1. seo优化 对于一些动态数据利用enderAfterTime也可以进行预渲染出来。当动态数据渲染出来之后,客户端代码比如bundle.js会立马接管dom操作。对于spa优化可谓是非常方便。
对于meta头的seo优化会结合vue-meta-info插件来优化 https://mp.weixin.qq.com/s/lM808MxUu6tp8zU8SBu3sg
  1. 骨架屏。 两种思路:
  • 把骨架屏当做预渲染页面,当ajax获取到数据之后再把骨架屏替换掉
  • prerender-spa-plugin提供了postProcessHtml钩子
 postProcessHtml: function (context) {var titles = {'/': '首页','/about': '关于','/contact': '链接'}return context.html.replace(/<title>[^<]*</title>/i,'<title>' + titles[context.route] + '</title>')}

此钩子会返回转义之后的静态页面,配置好的路由都会走此回调,对于动态生成骨架屏,这也是一种思路,转义之后的字符处理起来比较麻烦(有待考究)

预渲染不适用经常变化的数据,比如说股票代码网站,天气预报网站。因为此时的数据是动态的,而预渲染时已经生成好了dom节点。如果要兼容seo可以使用SSR。 预渲染不适用大量的路由页面,比如成千上百个路由,此时打包后预渲染将会非常慢。 预渲染最好的应用场景是需要seo的活动页面,配合vue-meta-info插件优化meta标签,开箱即用。

如何把异步数据渲染成静态页面

三种方案

  1. plugin中设置renderAfterTime:5000 //触发渲染的时间,用于获取数据后再保存渲染结果
  2. plugin中设置
renderAfterDocumentEvent: 'render-event'

根组件中设置

new Vue({el: '#app',mounted () {setTimeout(() => {document.dispatchEvent(new Event('render-event'))}, 5000)}
})
注意 不是在根组件中设置此事件无效(比如你想在ajax获取之后再再派发事件,此时并不会触发预渲染)
  1. plugin中设置
renderAfterElementExists: 'my-app-element'

会等待dom节点class为my-app-element生成功之后再进行预渲染

生成的路由跳转新页面

   <router-link to="/about" target="_blank" >About</router-link>

如何处理某些节点是否需要预渲染

plugin中配置

  renderer: new Renderer({renderAfterTime: 5000,injectProperty: '__PRERENDER_INJECTED',inject: {foo: 'bar'}})

页面中使用

  setTimeout(() => {if (window['__PRERENDER_INJECTED']) {return}this.data = '我是异步渲染出来的数据'}, 3000)
}
预渲染会在5秒后完成 并且不会对data数据进行预渲染

prerender-spa-plugin的一些坑

路由生成对应的页面(.html)时某些数据没有被渲染出来

在根组件上添加data-server-rendered ='true'

  <div id="app" data-server-rendered="true"></>

直接访问某个为.html文件的后缀时只能渲染出静态页面,不会渲染到对应的路由。

style加载了2次 官方bug并未解决

刷新总是会闪一下首页

这个是服务端渲染后,样式文件没跟上导致的,css要提取成一个文件就好了,了解一下这个plugin ExtractTextPlugin

配置不生成文件夹,值生成html文件时

  postProcess (renderedRoute) {// 重点// Remove /index.html from the output path if the dir name ends with a .html file extension.// For example: /dist/dir/special.html/index.html -> /dist/dir/special.htmlif (renderedRoute.route.endsWith('.html')) {renderedRoute.outputPath = path.join(__dirname,'dist',renderedRoute.route)}return renderedRoute}

打包之后会报错 解决办法:去掉data-server-rendered="true" 但是此时又会出现路由对应的路由无法渲染的问题。无解。

未解决的问题

没有正确渲染对应.html后缀的文件 比如http://localhost:8096/about/index.html 此文件因为没有被路由/about所查到,所以,只能渲染静态的html文件。(可能需要服务端或ngix支持才能正确渲染。

最后

尽量不要生成不带文件夹的html页面,会出现一些怪异的问题。 尽量不要直接访问.html后缀的文件。因为.html后缀的文件内容是静态的,并且没有对应路由,也会造成渲染问题。

项目地址

https://github.com/wensiyuanseven/prerender-spa

参考文章

https://github.com/chrisvfritz/prerender-spa-plugin

https://juejin.im/post/6844903737031409677

https://github.com/cisen/blog/issues/570

https://www.cnblogs.com/chuaWeb/p/prerender-plugin.html

https://zhuanlan.zhihu.com/p/29148760

https://www.cnblogs.com/tugenhua0707/p/10725888.html

https://zhuanlan.zhihu.com/p/116102502

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/304110.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

使用 .NET CLI 构建项目脚手架

前言在微服务场景中&#xff0c;开发人员分配到不同的小组&#xff0c;系统会拆分为很多个微服务&#xff0c;有一点是&#xff0c;每个项目都需要单元测试&#xff0c;接口文档&#xff0c;WebAPI接口等&#xff0c;创建新项目这些都是重复的工作&#xff0c;而且还要保证各个…

.net 垃圾回收机制

尽管在.NET framework下我们并不需要担心内存管理和垃圾回收(Garbage Collection)&#xff0c;但是我们还是应该了解它们&#xff0c;以优化我们的应用程序。同时&#xff0c;还需要具备一些基础的内存管理工作机制的知识&#xff0c;这样能够有助于解释我们日常程序编写中的变…

《自然》杂志:中国人越来越沉迷于对着一个叫“区块链”的东西胡言乱语

起初&#xff0c;《自然》杂志以为在2018年春节前后中国发生了一场瘟疫&#xff0c;但很快就改变了这一看法。除了精神亢奋无法入睡&#xff0c;那里的人们身体还算健康。不过&#xff0c;他们越来越沉迷于对着一个叫“区块链”的东西胡言乱语&#xff0c;根本停不下来。因为教…

python if 跳出_Python保留字简单释义

作者&#xff1a;小小程序员链接&#xff1a;https://zhuanlan.zhihu.com/p/87393696来源&#xff1a;知乎著作权归作者所有。商业转载请联系作者获得授权&#xff0c;非商业转载请注明出处。Guido van Rossum在1991年正式对外发布Python版本&#xff0c;现在已成为最流行的语言…

敏捷个人:提供更多文档下载,并转载一篇敏捷个人读书笔记

这两周一直忙着OpenExpressApp的自动化测试支持了&#xff0c;对于敏捷个人最近在思考作为新手如何学习的问题&#xff0c;后期我会写篇blog与大家分享一下。在敏捷个人项目中我发布了敏捷个人&#xff0d;认识自我&#xff0c;管理自我.pdf&#xff0c;有很多朋友之前看过&…

大数据揭秘:低学历者发财的概率有多大?结果很吃惊

先看两幅图&#xff1a;Table 1: Mean Earnings by Highest Degree Earned, $: 2009 (SAUS, table 232)Table 2: Unemployment Rates by Educational Attainment图一是美国社会收入和最高学历的关系&#xff0c;图二是美国社会失业率和受教育程度的关系&#xff0c;数据来自SAU…

Win10 Terminal + WSL 2 安装配置指南

自从 Windows Terminal 正式发布后就再没有用过 Windows 系统自带的终端了。主要是 Terminal 简洁且灵活&#xff0c;更重要的是支持特殊字体&#xff0c;通过一些简单的配置可以使得终端看起来更舒适养眼。自从 Win 10 有了 Linux 子系统&#xff08;WSL&#xff09;&#xff…

如何快速解剖数据背后隐藏的信息

1946年2月16日&#xff0c;是一个值得纪念的日子。在这一天&#xff0c;人类历史上真正意义上的第一台电子计算机诞生了&#xff0c;此后计算机便随着科技的发展以强大的生命力飞速发展着。而作为用来定义计算机程序的形式语言——编程语言也紧跟计算机其后蓬勃发展&#xff0c…

来,Consul 服务发现入个门(一看就会的那种)

前言在微服务架构中&#xff0c;对于一个系统&#xff0c;会划分出多个微服务&#xff0c;而且都是独立开发、独立部署&#xff0c;最后聚合在一起形成一个系统提供服务。当服务数量增多时&#xff0c;这些小服务怎么管理&#xff1f;调用方又怎么能确定服务的IP和端口&#xf…

mysql数据库的安装和配置文件_MySQL 数据库安装与配置详解

目录一、概述MySQL 版本&#xff1a;5.7.17客户端工具&#xff1a;NavicatforMySQL** 二、MySQL 安装**安装条件&#xff1a;如果 Windows Server 2003 在安装.net framework4.0 安装过程中报错&#xff1a; net framework 4.0 安装时提示产生阻滞问题:运行安装程序前&#xff…

Magicodes.IE Excel合并行数据导入教程

说明Magicodes.IE.Excel目前已支持合并行单元格导入&#xff0c;如本篇教程所示。安装包Magicodes.IE.ExcelInstall-PackageMagicodes.IE.Excel添加Dto参考示例代码如下所示&#xff1a;public class MergeRowsImportDto {[ImporterHeader(Name "学号")]public long…

D轮融资1亿美金,6亿美金估值,3位计算机学霸如何带领海归团队创造业内神话?!

顺为资本在创始合伙人雷军及许达来的带领下成功领投了51Talk、丁香园、爱奇艺、一起作业等超级公司有近20家公司估值超过10亿美元如今顺为资本为何愿意投资这家公司&#xff1f;酷家乐6年破6亿美金的公司估值17年全年营收超3亿有着设计师300万这家以家居云设计为核心的创业公司…

Navicat

作为Oracle, MySQL, Sqlite, PostgreSQL的统一客户端&#xff0c;Navicat无疑是最方便简洁的&#xff0c;而且界面非常友好。导入导出支持的格式也很全。 在连Oracle的时候&#xff0c;会报错说字符集不支持。只要手工指定OCI就好&#xff0c;方法如下&#xff1a; 在OCI libra…

分布式链路追踪框架的基本实现原理

目录分布式追踪分布式系统分布式追踪分布式追踪有什么用呢什么是分布式追踪Dapper分布式追踪系统的实现跟踪树和 spanJaeger 和 OpenTracingOpenTracing 数据模型Span 格式TraceOpenTracingJaeger 结构SpanOpenTracing API分布式追踪什么是分布式追踪分布式系统当我们使用 Goog…

mysql外键约束创建及删除_MySQL中的外键的创建,约束和删除

一、外键的创建语法一&#xff1a;后续添加方法alter table 表名 add constraint 约束名 foreign key(当前表中约束的字段) references 主表表名(要约束的字段名);alter table student add constraint fk_class_student foreign key(cls_id) class(cls_id) on update cascade o…

不爱读书怎么办?用这个新奇的方法,熟知137亿年来的地球通史

今天&#xff0c;小木为模友们挑选的小荐货&#xff1a;《地球通史墙书》第一次接触《地球通史》墙书的时候&#xff0c;虽然“地球通史”的概念非常吸引我&#xff0c;但“墙书”的叫法怎么听都像是一个噱头&#xff0c;所以小木一直有些莫名的排斥&#xff0c;直到在小天把试…

测试驱动开发简介

本文节选自《测试驱动的面向对象软件开发》 第1章第4节“测试驱动开发简介” TDD核心的循环是&#xff1a;写一个测试&#xff1b;写一些代码让测试通过&#xff1b;重构代码&#xff0c;使被测试特征的实现尽可能简单。重复这个过程&#xff0c;如图1-1所示。 图1-1基本TDD循环…

在 .NET 中使用 Flurl 高效处理Http请求

简介官方介绍&#xff0c;Flurl是一个现代的&#xff0c;流利的&#xff0c;支持异步的&#xff0c;可测试的&#xff0c;可移植的&#xff0c;URL增强和Http客户端组件。Url构建现在有一个登录的接口&#xff0c;地址如下&#xff1a;https://www.some-api.com/login?nameLee…

图像还可以这样玩!如何用波的算法处理图像

我对图像处理一直很感兴趣&#xff0c;曾经写过好几篇博客。前几天读到一篇文章&#xff0c;它提到图像其实是一种波&#xff0c;可以用波的算法处理图像。我顿时有一种醍醐灌顶的感觉&#xff0c;从没想到这两个领域是相关的&#xff0c;图像还可以这样玩&#xff01;下面我就…