欢迎旅行者到此一游
静态化服务端渲染项目构思。兼具访问速度与极致体验的结合。
ShiinaAiiko.NO.00004·2020年08月01日 · 文章

工作日写代码、休息日写文章。

可能这就是吾之日常也。


所需要解决的问题

1、首屏加载速度还未达到极致。

在一个基于现代化框架的Web服务里、尽管服务端渲染(以下简称SSR)首屏加载速度已经远超单页面程序了(以下简称SPA)、但相比直接访问静态化文件、还是有一定加载速度上的差距。

2、网页静态化无法实现动态路由

元古时期的网址一般都是通过拼接字符串获取query信息的方式来访问。这种地址很丑、很长、很简陋。已经跟不上当代前端的发展审美了。

而动态路由地址、则好看的多。

就比如以下对比:

query字符串地址:https://aiiko.club/user?username=shiinaaiiko

动态路由地址:https://aiiko.club/shiinaaiiko


所以、您觉得哪个更简单好看?


而静态化网页则无法实现动态路由。一旦有新的数据或者更新了老数据、则无法访问。需服务端渲染才可以完成。毕竟、静态化都是渲染好了存放起来的文件而已。

静态化与服务端渲染访问同一个网页的速度对比

(服务端渲染)

(静态化渲染)


很明显、静态化的访问速度比服务端渲染还要快很多。

而如果仅仅只是加载DOM、优势更大!


静态化服务端渲染是什么?

静态化的同时、也提供服务端渲染!

静态化服务端渲染、就是将上面2个问题可以同时解决的方案。

此方案适用于基于Vue的NUXT项目。

既可以满足静态化的首屏快速访问、又可以满足动态路由的数据实时性与优雅。完美!


哪些内容适合静态化、哪些不适合静态化?

适合静态化的内容:

文章页的标题正文、

视频页的标题正文、

等等


而其实用户打开页面最多的也就是这些了。(毕竟量大


不适合静态化的内容:

推荐列表(此需要实时更新)、

用户频道页(如果用户发了新内容岂不是看不见?)、

文章视频的阅读数、分享数、收藏数等(这些东西你静态化了岂不是就一直写死了吗)、

评论弹幕等交互信息(交互的内容是没法静态化的、同样是有一定动态性)。

等等


文章视频页面的静态化解决方案

一般情况下、文章视频都是通过api一次性获取到正文内容与收藏阅读点赞次数。

而我们则将此分开。

正文内容这些我们通过静态化获取、毕竟这些很少改动。改动了也就是重新获取而已。

而收藏阅读点赞等信息则在用户加载静态化HTML成功后通过API拉取。


您别看一个接口的东西分成2个接口好像是繁琐了。


实际上、正文内容静态化只有在渲染的时候才会获取一次。后续任何用户范围都不会再获取。除非更新或删除。

而仅仅只是通过api拉取点赞收藏等各个数字而已。。。各种数字传输起来还是比正文更快吧?


更新有解决方案了、那删除怎么办?

如果用户或管理员删除了一篇内容。

而用户依然可以通过静态文件访问。这岂非很费解之?删除还有何用?


所以建议是在nuxt项目里。我们会运行node程序的。

通过node定时监听有哪些数据被删除了。

如果这些数据属于我们静态化的内容、则通过node终端命令直接对static下的文件进行删除处理。

我想这个定时器可以设置到1分钟或者5分钟之间。不能太快。也不能太慢。


至于如何检测哪些内容删除。

我想我们可以通过对数据库的delete字段与updateTime字段判断。

删除也会更新updateTime。

只要delete为true、而updateTime又符合node定时任务之后的时间。

则此内容就是需要删除的!


而为了以防万一有漏网之鱼。

我们可以在深夜宁静之时、再次检索数据库。

将当日已删除的内容获取出来。并对静态文件再一次进行删除处理。有则删、无则跳过也。


静态化服务端渲染的实现构思与步骤想法

此方案是以Nuxt项目为例作为构思方案。

目前仅做了试验性实验、暂未部署到正式环境下。

不过我想问题应该不大

1、使用后端API接口返回一个需要静态化的网址数组

如、我们的动态路由地址是aiiko.club/article/:id

这就是一个以文章id作为动态参数的路由地址、如果我们有几十万甚至百万篇文章。可能还是后端一次性处理起来更方便呢。因为这意味着有几十万个地址。

nuxt官方项目采用的是直接在nuxt.config.js配置文件里获取远端api的数据然后map出数组。

且如果一次性返回的数据量太大。也会浪费nuxt静态化打包的时间


所以、我们采用通过API给nuxt配置文件返回一个数组即可。其他的交给Nodejs直接分析数据拼接

2、在nuxt.config.js配置文件里通过generate.routes里返回一个Promise对象。

此异步对象就是将api里的数据传给nuxt配置文件。

有哪些需要静态化的就传哪些。

然后开始nuxt generate!

3、将之前输出的静态化文件转移到nuxt根目录static文件夹下

静态化之后不仅仅有我们指定输出的动态路由网页。也包括了其他我们不需要静态化的地址。比如说推荐首页。

一般情况下推荐首页代表了信息的实时性。我们不建议对它进行静态化。

所以我们将静态化输出目录dist文件夹的所有内容通过node或者其他方式进行筛选、非我们指定地址全部进行删除处理。

最终得到的这些文件通过终端命令转移到static文件夹下即可。

4、最终完成

开启nuxt build && npm run start

这样我们就完成了。

只要static有对应的静态文件。那么nuxt就会优先加载静态文件。

而没有的则会以服务器端渲染的方式加载。


我们每天晚上在熟睡之际、让程序自动对当日新内容或新更新的内容定时静态化并转移到static下即可。


以此我们就实现了静态化服务端渲染!


是不是听着如此的美妙?

日本千叶县
喵星人制造机器
like
dislike
comment
1260
作者:ShiinaAiiko.NO.00004
时间:2020.08.01 02:14
comments0
ShiinaAiiko.NO.00004欢迎旅行者到此一游
推荐
从未发布过哦
ShiinaAiiko.NO.00004欢迎旅行者到此一游