Vue项目预渲染
前言
Ajax 技术的出现,让我们的 Web 应用能够在不刷新的状态下显示不同页面的内容,这就是单页应用。在一个单页应用中,往往只有一个 html 文件,然后根据访问的 url 来匹配对应的路由脚本,动态地渲染页面内容。单页应用在优化了用户体验的同时,也给我们带来了许多问题,例如 SEO 不友好、首屏可见时间过长等。服务端渲染(SSR)和预渲染(Prerender)技术正是为解决这些问题而生的。
服务端渲染与预渲染区别
客户端渲染
用户访问 url,请求 html 文件,前端根据路由动态渲染页面内容。关键链路较长,有一定的白屏时间;
服务端渲染
用户访问 url,服务端根据访问路径请求所需数据,拼接成 html 字符串,返回给前端。前端接收到 html 时已有部分内容;
预渲染
构建阶段生成匹配预渲染路径的 html 文件(注意:每个需要预渲染的路由都有一个对应的 html)。构建出来的 html 文件已有部分内容
服务端渲染与预渲染共同点
针对单页应用,服务端渲染和预渲染共同解决的问题:
SEO
单页应用的网站内容是根据当前路径动态渲染的,html 文件中往往没有内容,网络爬虫不会等到页面脚本执行完再抓取;
弱网环境
当用户在一个弱环境中访问你的站点时,你会想要尽可能快的将内容呈现给他们。甚至是在 js 脚本被加载和解析前;
低版本浏览器
用户的浏览器可能不支持你使用的 js 特性,预渲染或服务端渲染能够让用户至少能够看到首屏的内容,而不是一个空白的网页。
预渲染能与服务端渲染一样提高 SEO 优化,但前者比后者需要更少的配置,实现成本低。弱网环境下,预渲染能更快地呈现页面内容,减少页面可见时间。
什么场景下不适合使用预渲染
个性化内容
对于路由是 /my-profile 的页面来说,预渲染就失效了。因为页面内容依据看它的人而显得不同;
经常变化的内容
如果你预渲染一个游戏排行榜,这个排行榜会随着新的玩家记录而更新,预渲染会让你的页面显示不正确直到脚本加载完成并替换成新的数据。这是一个不好的用户体验;
成千上万的路由
不建议预渲染非常多的路由,因为这会严重拖慢你的构建进程。
Prerender SPA Plugin
prerender-spa-plugin
是一个 webpack
插件用于在单页应用中预渲染静态 html
内容。因此,该插件限定了你的单页应用必须使用 webpack 构建
,且它与用什么框架无关,无论你是使用 React 或 Vue 甚至不使用框架,都能用来进行预渲染
。
prerender-spa-plugin 原理
那么 prerender-spa-plugin
是如何做到将运行时的 html
打包到文件中的呢?原理很简单,就是在 webpack 构建阶段
的最后,在本地启动一个 phantomjs
,访问配置了预渲染的路由,再将 phantomjs
中渲染的页面输出到 html
文件中,并建立路由对应的目录。
安装使用
yarn 或者 npm
yarn add prerender-spa-plugin -D
npm install prerender-spa-plugin --save-dev
前端配置,vue.config.js中增加
const PrerenderSPAPlugin = require('prerender-spa-plugin');
const Renderer = PrerenderSPAPlugin.PuppeteerRenderer;
const path = require('path');
module.exports = {configureWebpack: config => {if (process.env.NODE_ENV !== 'production') return;return {plugins: [new PrerenderSPAPlugin({// 生成文件的路径,也可以与webpakc打包的一致。// 下面这句话非常重要!!!// 这个目录只能有一级,如果目录层次大于一级,在生成的时候不会有任何错误提示,在预渲染的时候只会卡着不动。staticDir: path.join(__dirname, 'dist'),// 对应自己的路由文件,比如a有参数,就需要写成 /a/param1。routes: ['/', '/product', '/about'],// 这个很重要,如果没有配置这段,也不会进行预编译renderer: new Renderer({inject: {foo: 'bar'},headless: false,...})})]}}
}
在 main.js 中
new Vue({router,store,render: h => h(App),mounted() {document.dispatchEvent(new Event('render-event'))}
}).$mount('#app')
router.js 中设置mode: “history”
运行npm run build
,看一下生成的 dist
的目录里是不是有每个路由名称对应的文件夹。然后找个 目录里 的 index.html 用IDE打开,看文件内容里是否有该文件应该有的内容。有的话,就设置成功了
如果你想修改每个页面的meta
信息,这里推荐使用 vue-meta
相关文章:
![](https://www.ngui.cc/images/no-images.jpg)
Vue项目预渲染
前言 Ajax 技术的出现,让我们的 Web 应用能够在不刷新的状态下显示不同页面的内容,这就是单页应用。在一个单页应用中,往往只有一个 html 文件,然后根据访问的 url 来匹配对应的路由脚本,动态地渲染页面内容。单页应用…...
![](https://img-blog.csdnimg.cn/73f78117b887471b8faca4676b1d9396.jpeg)
可别再用BeanUtils了(性能拉胯),试试这款转换神器
老铁们是不是经常为写一些实体转换的原始代码感到头疼,尤其是实体字段特别多的时候。有的人会说,我直接使用get/set方法。没错,get/set方法的确可以解决,而且也是性能较高的处理方法,但是大家有没有想过,要…...
![](https://www.ngui.cc/images/no-images.jpg)
Transformer 杂记
Transformer输入的是token,来自语言序列的启发。卷积神经网络(CNN)是如何进行物种分类的.它实际是直接对特征进行识别,也就是卷积神经网络最基本的作用:提取图像的特征。例如:卷积神经网络判断一只狗的时候,…...
![](https://img-blog.csdnimg.cn/img_convert/51b309582bcf74f7079c27d438412cb2.png)
实现异步的8种方式
前言异步执行对于开发者来说并不陌生,在实际的开发过程中,很多场景多会使用到异步,相比同步执行,异步可以大大缩短请求链路耗时时间,比如:「发送短信、邮件、异步更新等」,这些都是典型的可以通…...
![](https://img-blog.csdnimg.cn/c6aacba6f52a41bb81ca5f9bbd7ada8f.png#pic_center)
Github隐藏功能显示自己的README,个人化你的Github主页
Github隐藏功能:显示自己的README 你可能还不知道,GitHub 悄悄上线了一个全新的个人页功能,显示一个自定义的 README.MD 在个人首页。要激活此功能,需要新建一个与自己 ID 同名的 Repository,新 Repo 里的README.MD将…...
![](https://img-blog.csdnimg.cn/28f16155a6bc4bb9b326a34b9dad5924.png)
单片机 | 51单片机原理
【金善愚】 单片机应用原理篇 笔记整理 课程视频 :https://space.bilibili.com/483942191/channel/collectiondetail?sid51090 文章目录一、引脚分布介绍1.分类2.电源引脚3.时钟引脚(2根)4.控制引脚(4根)5.端口引脚(32根)二、存储器结构及空间分布介绍1.存储器的划…...
![](https://img-blog.csdnimg.cn/7f92c4031d4d4db0bb01df2da0be4e7d.png)
(只需五步)注册谷歌账号详细步骤,解决“此电话号码无法验证”问题
目录 第一步:打开google浏览器 第二步:设置语言为英语(美国) 第三步:点击重新启动,重启浏览器 第四步:开始注册 第五步,成功登录google账号! 如果出现这样的原因&…...
![](https://img-blog.csdnimg.cn/ed693b35636242cb9cf3e1933b0493e8.png)
ChatGPT使用介绍、ChatGPT+编程、相关组件和插件记录
文章目录介绍认识ChatGPT是通过英汉互译来实现中文回答的吗同一个问题,为什么中英文回答不同ChatGPT的使用对话组OpenAI APIAI智能绘图DALLE 2ChatGPT for Google插件ChatGPT编程编写代码代码错误修正与功能解读代码评审与优化推荐技术方案编写和优化SQL语句在代码编…...
![](https://img-blog.csdnimg.cn/img_convert/9e8cf773fa72f3bcfe86278085c25121.png)
linux系统中复制粘贴和头文件问题解决方案
各位开发者大家好,好久不见,为了更好的服务大家,将平常所见所闻,以及遇到的问题和解决办法进行记录和总结。大家在学习过程中,有任何问题欢迎交流学习!!!。 第一:如何将w…...
![](https://img-blog.csdnimg.cn/5e027d9c222c44d088515002e4617e30.gif)
Vue项目实战 —— 后台管理系统( pc端 ) —— Pro最终版本
前期回顾 开源项目 —— 原生JS实现斗地主游戏 ——代码极少、功能都有、直接粘贴即用_js斗地主_0.活在风浪里的博客-CSDN博客JS 实现 斗地主网页游戏https://blog.csdn.net/m0_57904695/article/details/128982118?spm1001.2014.3001.5501 通用版后台管理系统,如果…...
![](https://img-blog.csdnimg.cn/img_convert/8dc7f491ba7593a3ed836c048a93d0f6.png)
Springboot+vue开发的图书借阅管理系统项目源码下载-P0029
前言图书借阅管理系统项目是基于SpringBootVue技术开发而来,功能相对比较简单,分为两个角色即管理员和学生用户,核心业务功能就是图书的发布、借阅与归还,相比于一些复杂的系统,该项目具备简单易入手,便于二…...
![](https://img-blog.csdnimg.cn/88043278c22c443e8639547c47ad23ff.png#pic_center)
学习 Python 之 Pygame 开发魂斗罗(十三)
学习 Python 之 Pygame 开发魂斗罗(十三)继续编写魂斗罗1. 创建敌人2类2. 编写敌人2类的draw()函数3. 编写敌人越界消失函数4. 编写敌人开火函数5. 把敌人2加入地图进行测试继续编写魂斗罗 在上次的博客学习 Python 之 Pygame 开发魂斗罗(十…...
![](https://img-blog.csdnimg.cn/fb8304eda2074cce8cd06be52d9b48f0.gif)
指针进阶(中)
提示: 上集内容小复习🥰🥰 int my_strlen(const char* str) {return 1; } int main() {//指针数组char* arr[10];//数组指针int arr2[5] { 0 };int(*p)[5] &arr2; //p是一个指向数组的指针变量//函数指针int (*pf)(const char*)&m…...
![](https://www.ngui.cc/images/no-images.jpg)
C/C++获取文件名的方法(__FILE__,__builtin_FILE(),__BASE_FILE__)
目录标题C/C获取文件名的方法__FILE__宏避免__FILE__宏的错误慎用$(subst $(dir $<),,$<)\"")来重定义__BASE_FILE__宏__builtin_FILE()函数Windows API函数GetModuleFileName()getenv()使用cmake中的变量重定义__FILE__宏的CMake示例C/C获取文件名的方法 使用…...
![](https://img-blog.csdnimg.cn/3c6e422b41d14866ae893dd2ed06dbe4.png)
线程池的讲解和实现
🚀🚀🚀🚀🚀🚀🚀大家好,今天为大家带来线程池相关知识的讲解,并且实现一个线程池 🌸🌸🌸🌸🌸🌸🌸🌸…...
![](https://www.ngui.cc/images/no-images.jpg)
linux编程──gcc和clang
实验链接 编译原理实验-GCC/Clang工具链在ARM架构上的使用 实验报告 第1关:理解程序的不同表示形式 ##问题1-1: 如果在命令行下执行 gcc -DNEG -E sample.c -o sample.i生成的sample.i 与之前的有何区别? 根据定义NEG,而选择了M定义为-4…...
![](https://img-blog.csdnimg.cn/ea48c1dc15804d2a965dcd5c0b0969c2.png)
字节跳动测试岗面试记:二面被按地上血虐,所幸Offer已到手...
在互联网做了几年之后,去大厂“镀镀金”是大部分人的首选。大厂不仅待遇高、福利好,更重要的是,它是对你专业能力的背书,大厂工作背景多少会给你的简历增加几分竞争力。 但说实话,想进大厂还真没那么容易。最近面试字…...
![](https://img-blog.csdnimg.cn/efa307fcdb6c4587badef2a4292e11a6.png)
5.多线程学习
作者:爱塔居 专栏:JavaEE 作者简介:大三学生,喜欢总结与分享~ 文章目录 目录 文章目录 章节回顾 一、wait 和notify 二、设计模式 2.1 单例模式 章节回顾 线程安全 1.一个线程不安全的案例(两个线程各自自增5w次&…...
![](https://img-blog.csdnimg.cn/5562aac243354a6b807ac853c04a5f9e.jpeg)
数据结构中的堆
一、树的重要知识点 节点的度:一个节点含有的子树的个数称为该节点的度(有几个孩子)叶节点或终端节点:度为0的节点称为叶节点;如上图:B、C、H、I...等节点为叶节点(0个孩子)非终端节点或分支节点…...
![](https://img-blog.csdnimg.cn/img_convert/d98aced98f3a440f93b3a6de652891d6.jpeg)
Linux内核设备信息集合
本文结合设备信息集合的详细讲解来认识一下设备和驱动是如何绑定的。所谓设备信息集合,就是根据不同的外设寻找各自的外设信息,我们知道一个完整的开发板有 CPU 和各种控制器(如 I2C 控制器、SPI 控制器、DMA 控制器等)࿰…...
![](https://img-blog.csdnimg.cn/b5f3eed322e1462b9cdccfa5da55f80b.png)
若依框架---权限管理设计
前言 若依权限管理包含两个部分:菜单权限 和 数据权限。菜单权限控制着我们可以执行哪些操作。数据权限控制着我们可以看到哪些数据。 菜单是一个概括性名称,可以细分为目录、菜单和按钮,以若依自身为例: 目录,就是页…...
![](https://www.ngui.cc/images/no-images.jpg)
Java设计模式(二)——工厂模式
当用户需要一个类的子类实例,且不希望与该类的子类形成耦合或者不知道该类有哪些子类可用时,可采用工厂模式;当用户需要系统提供多个对象,且希望和创建对象的类解耦时,可采用抽象工厂模式。 工厂模式一般分为简单工厂、…...
![](https://img-blog.csdnimg.cn/ca4a5d40857147cd864bc1bfcfa7dc71.png)
【Maven】
MavenMaven简介仓库坐标Maven项目构建依赖管理生命周期及插件插件模块拆分与开发聚合继承属性版本管理资源配置多环境开发配置跳过测试私服Maven简介 Maven的本质时一个项目管理工具,将项目开发和管理过程抽象成一个项目对象模型(POM) POM(Project Object Model)&a…...
![](https://img-blog.csdnimg.cn/9cacea44cacf4fb69df8797cbbc12ae9.png)
[JAVA]继承
目录 1.继承的概念 2.继承的语法 3.父类成员访问 3.1子类中访问父类成员变量 3.2子类中访问父类成员方法 4.super关键字 5.子类构造方法 6.继承方式 7.final关键字和类的关系 面向对象思想中提出了继承的概念,专门用来进行共性抽取,实现代码复…...
![](https://img-blog.csdnimg.cn/c5946b9b0ab54809918e9a2b4bdd2f2b.png)
Vue3 pinia持久化存储(组合式Api案例演示)
pinia-plugin-persist( pinia持久化插件) 本文采用的是 组合式Api的方式来做Pinia的持久化存储演示 如果对pinia的持久化还是不是很了解的👨🎓|👩🎓,可以看一下笔者的上一篇文章…...
![](https://www.ngui.cc/images/no-images.jpg)
8个你一看就觉得很棒的Vue开发技巧
1.路由参数解耦 通常在组件中使用路由参数,大多数人会做以下事情。 export default {methods: {getParamsId() {return this.$route.params.id}} }在组件中使用 $route 会导致与其相应路由的高度耦合,通过将其限制为某些 URL 来限制组件的灵活性。 正…...
![](https://img-blog.csdnimg.cn/f11db5c5bba349d18ef690b44b03fd41.png)
vue3+ts 开发效率提升
1、vite pnpm项目初始化 pnpm: 比npm或yarn快10倍 pnpm与其他包管理器(如npm和Yarn)的不同之处在于它使用一种称为“硬链接”的独特安装方法。当你使用PNPM安装一个包时,它并不会将包的文件复制到每个项目的node_modules目录中&a…...
![](https://img-blog.csdnimg.cn/6bb068d0fd2b4f06b770ac004cd3e064.png)
【数据结构与算法】队列和栈的相互实现以及循环队列
目录🌔一.用队列实现栈🌙1.题目描述🌙2.思路分析🌙3.代码实现⛈二.用栈实现队列☔1.题目描述☔2.思路分析☔3.代码实现🌈三.实现循环队列🌔一.用队列实现栈 🌙1.题目描述 我们先看一下题目链接…...
![](https://www.ngui.cc/images/no-images.jpg)
mysql连接不上问题解决
公司新搭内网测试环境,mysql远程登录问题解决 远程登录: 1 修改host, mysql> select user,host,plugin from user; ---------------------------------------------------- | user | host | plugin | ------------------------…...
![](https://img-blog.csdnimg.cn/8eb6a25e738049b199b8450834576c02.png#pic_center)
利用nginx实现动静分离的负载均衡集群实战
前言 大家好,我是沐风晓月,今天我们利用nginx来作为负载,实现两台apache服务器的动静分离集群实战; 本文收录于沐风晓月的专栏《linux基本功-系统服务实战》,更多内容可以关注我的博客: https://blog.csd…...
![](https://www.oschina.net/img/hot3.png)
拓者设计吧效果图/seo网上培训
2019独角兽企业重金招聘Python工程师标准>>> 安装 https ,重启ubuntu ,发现,https://ip,打不开。用 sudo service apache2 start 命令后,可以正常打开。 service apache2 start apache2ctl start 转载于:ht…...
![](https://images0.cnblogs.com/blog/311888/201302/02104010-f9a59912cc7d47bb9ada1085b3fe9245.jpg)
网站建设的公司上海/搜索引擎营销的简称
MVC4的Controller(控制器)!还是音乐商店的例子! 开始写我们的第一个Contrller! 我们第一个控制器主要负责一下几点: 首页列出了你的商店进行音乐流派点击一个流派,到目标网页浏览,该页列出所有的音乐专辑点…...
![](http://www.d1net.com/uploadfile/2016/0425/20160425025845711.jpg)
网站做收录/免费推广链接
9340万墨西哥选民个人信息的132GB数据库,上周六终于撤下线。被安全研究员克里斯维克利发现以来,该数据库已在网上挂了8天。但更糟的是,其实从2015年9月开始,这个数据库就赤裸裸地摆在众人眼皮底下。 维克利是推出MacKeeper的科技公…...
![](https://img-blog.csdnimg.cn/img_convert/4f369fa976dc3f4e9bfd4ab4c314d2ba.png)
医院网站备案流程/seo优化培训学校
线下展会向来是3A厂商沟通国内玩家最有效的窗口之一,6月29日举办的杉果π展会活动,育碧、万代、卡普空等众多知名游戏厂商携旗下招牌游戏齐聚现场,为玩家带来最新的游戏试玩体验。展会一天内需要接纳数百位玩家,会场网络本身就面临…...
![](/images/no-images.jpg)
太原市网站制作公司/网络推广的主要工作内容
下列软件包有未满足的依赖关系:sogoupinyin : 依赖: fcitx (> 1:4.2.8.3-3~) 但是它还没有被安装依赖: fcitx-frontend-gtk2 但是它还没有被安装依赖: fcitx-frontend-gtk3 但是它还没有被安装依赖: fcitx-frontend-qt4 但是它还没有被安装依赖: libfcitx-qt0 但…...
![](/images/no-images.jpg)
四川住房建设和城乡建设厅假网站/外链网盘下载
进入拨号盘,输入电话号码。2.menu->IP拨号。[SOLUTION]由于目前平台上对此功能还没加统一的compile option来控制,所以现在只能手动来删除相关code,具体如下:L 之前的版本:1.去掉 “menu->设置->语音电话->IP号码前缀…...