【Nuxtjs】431- 简述Nuxt.js

2024-01-10 04:10
文章标签 js 简述 nuxt nuxtjs 431

本文主要是介绍【Nuxtjs】431- 简述Nuxt.js,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

作者 | 孔令涛

Nuxt.js 是一个基于 Vue.js 的通用应用框架,一个用于Vue.js 开发SSR应用的一站式解决方案。它的优点是将原来几个配置文件要完成的内容,都整合在了一个nuxt.config.js,封装与扩展性完美的契合。

简单说nuxtjs项目,它其实就是一个vue的项目融合一个node.js server项目,这里node服务有两个作用,第一点是代替浏览器的工作,笼统理解就是在created时的请求数据和页面渲染,第二点是当作静态文件服务器,把渲染好的页面返回给用户。

ssr服务做缓存的意义

在上图中,我们可以看到一个简单的ssr服务渲染流程,在这里笔者把与前端渲染不同之处标红,一个是初始化的数据。第二个是获取数据后服务器对于页面的渲染。

图中如果未使用缓存,就会导致每一个用户的对页面的请求,都使用服务去渲染一次,这对于服务器简直是灾难。特别是渲染所依赖的node.js服务,不论是express还是koa又或者是像nuxt的封装,都绕不开渲染时对于服务器cpu产生压力。反之,使用缓存,用内存空间换取cpu的使用率这是划算的,且属于node.js的长项。

缓存的使用思路

nuxt缓存有三种,从小到大就是接口缓存、组件缓存、页面缓存,下面我们找具体的场景来聊一下。

1.接口缓存,我们来看下下面这张图。

 这转转有书的首页,你所能看到的都是从接口获取的数据渲染的,往往首页的数据的在一段时间内是不会变动的,也许是1小时、也许是几天,我们每次都去服务端取数据,完全没必要,所有接口做缓存,在这种场景非常有必要。即便是页面数据经常变动,通过一次请求,使用缓存,代替用户的n次请求对于api服务器来说会有很不错的收益。

2.组件缓存

没找到特别贴合的页面,这里就画图了,如上图,你的组件会在多个服务端渲染的页面中出现,使用组件缓存是非常不错的选择。

再说一个极端都例子,例如一个页面中是如上图中的A、B组件的结构,A组件是长时间不会怎么变且大量使用,B组件需要展示用户头像和用户的名字,每个B组件渲染出来都不一样,且这个页面还要放在服务端渲染,那么这样的场景使用组件渲染是合适的。

上面这个极端的例子,千万不要被误导,因为B组件没有可复用的地方,完全可以放在客户端去渲染。

3.页面缓存 页面缓存的场景就是一个页面长的一样的部分,大量被用户请求,那么就可以做页面缓存,例如上面的首页,在一段时间内,用户看到的内容是不会变的。

这三种缓存是包含关系,也就触发了大级别的缓存,就不会触发小级别的缓存,简单来说就是一个请求找到页面缓存,肯定不需要再去请求接口了。

最后笔者选定是接口缓存与页面缓存搭配使用,理由是我可以把那些类似于根据用户不同而不同的推荐组件放到客户端去获取数据并渲染,也就是公共部分用服务端渲染,差异部分用客户端渲染。这是对于我们现在的业务是最好的选择。

缓存的实践

笔者在里并没有使用常规的lru-cache这个包做缓存,而是把接口与页面的缓存都做在里redis里。先说怎么做,下面的思考部分我们再来聊笔者的理由。

下面是实现,先来说说接口缓存:1.如何接口获取的数据存入redis 在nuxt.config.js中,我们在modules配置中加入@nuxtjs/axios,这是nuxtjs自带的,然后编写一个叫axios.server.js的文件,加入plugins配置中,这里的重点是文件命中一定要加server的标示,这样nuxt在加载这个插件的时候只会把它加载到服务端去。

代码如上图,比较好理解就是onResponse监听一下接口返回的数据存入redis,这是存缓存的部分。

axios获取缓存的代码如下。

注意点:这个一定要加上服务端的判断,虽然打包的时候asyncData里的代码不会被打包到客户端,但是在打包和开发的时候不加上服务端的判断,会报一些无法引包的错误。这里可以对axios进行封装,但一定要注意服务端和客户端。

2.页面缓存存入redis 这里就比较简单了,在nuxt.config.js中,serverMiddleware配置里加入一个中间件,代码如下。

在上面的中间件中你需要自己处理下哪些是你需要缓存的,包括html、js、css。

问题

聊聊笔者为什么想用redis代替lru-catch的方案,理由是使用redis,使我会担心内存膨胀太快带来的问题,而且多台负载的ssr服务可以共同使用一个缓存,我们甚至可以通过操作redis主动的去管理缓存,对于很多页面、接口需要做缓存来说,这样做是很不错的。

这样一来,我们的ssr服务通过做缓存解决里cpu使用率的问题,然后又通过使用redis解决了本地内存膨胀的问题,ssr服务变的更专心于io。

还有个问题就是缓存的生存时间,例如我们设置了一个很长的缓存的生存时间,接口的数据都变了,可是我们还在使用缓存,当然你可以选择一个合适长短的过去时间,可以从redis里面把缓存删掉,这也是我们用redis存储缓存的好处。

还有就是要注意缓存级别的问题,大级别的缓存会覆盖小级别的缓存,例如客户端一直在走页面的缓存,那么接口缓存怎么刷新也没用,这就需要我们做一些缓存的关联管理。思路如下图。

原创系列推荐

1. JavaScript 重温系列(22篇全)

2. ECMAScript 重温系列(10篇全)

3. JavaScript设计模式 重温系列(9篇全)

4. 正则 / 框架 / 算法等 重温系列(16篇全)

5. Webpack4 入门(上)|| Webpack4 入门(下)

6. MobX 入门(上) ||  MobX 入门(下)

7. 59篇原创系列汇总

回复“加群”与大佬们一起交流学习~

点这,与大家一起分享本文吧~

这篇关于【Nuxtjs】431- 简述Nuxt.js的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/589509

相关文章

JS常用组件收集

收集了一些平时遇到的前端比较优秀的组件,方便以后开发的时候查找!!! 函数工具: Lodash 页面固定: stickUp、jQuery.Pin 轮播: unslider、swiper 开关: switch 复选框: icheck 气泡: grumble 隐藏元素: Headroom

在JS中的设计模式的单例模式、策略模式、代理模式、原型模式浅讲

1. 单例模式(Singleton Pattern) 确保一个类只有一个实例,并提供一个全局访问点。 示例代码: class Singleton {constructor() {if (Singleton.instance) {return Singleton.instance;}Singleton.instance = this;this.data = [];}addData(value)

Node.js学习记录(二)

目录 一、express 1、初识express 2、安装express 3、创建并启动web服务器 4、监听 GET&POST 请求、响应内容给客户端 5、获取URL中携带的查询参数 6、获取URL中动态参数 7、静态资源托管 二、工具nodemon 三、express路由 1、express中路由 2、路由的匹配 3、路由模块化 4、路由模块添加前缀 四、中间件

EasyPlayer.js网页H5 Web js播放器能力合集

最近遇到一个需求,要求做一款播放器,发现能力上跟EasyPlayer.js基本一致,满足要求: 需求 功性能 分类 需求描述 功能 预览 分屏模式 单分屏(单屏/全屏) 多分屏(2*2) 多分屏(3*3) 多分屏(4*4) 播放控制 播放(单个或全部) 暂停(暂停时展示最后一帧画面) 停止(单个或全部) 声音控制(开关/音量调节) 主辅码流切换 辅助功能 屏

使用JS/Jquery获得父窗口的几个方法(笔记)

<pre name="code" class="javascript">取父窗口的元素方法:$(selector, window.parent.document);那么你取父窗口的父窗口的元素就可以用:$(selector, window.parent.parent.document);如题: $(selector, window.top.document);//获得顶级窗口里面的元素 $(

js异步提交form表单的解决方案

1.定义异步提交表单的方法 (通用方法) /*** 异步提交form表单* @param options {form:form表单元素,success:执行成功后处理函数}* <span style="color:#ff0000;"><strong>@注意 后台接收参数要解码否则中文会导致乱码 如:URLDecoder.decode(param,"UTF-8")</strong></span>

js react 笔记 2

起因, 目的: 记录一些 js, react, css 1. 生成一个随机的 uuid // 需要先安装 crypto 模块const { randomUUID } = require('crypto');const uuid = randomUUID();console.log(uuid); // 输出类似 '9b1deb4d-3b7d-4bad-9bdd-2b0d7b3dcb6d'

学习记录:js算法(二十八):删除排序链表中的重复元素、删除排序链表中的重复元素II

文章目录 删除排序链表中的重复元素我的思路解法一:循环解法二:递归 网上思路 删除排序链表中的重复元素 II我的思路网上思路 总结 删除排序链表中的重复元素 给定一个已排序的链表的头 head , 删除所有重复的元素,使每个元素只出现一次 。返回 已排序的链表 。 图一 图二 示例 1:(图一)输入:head = [1,1,2]输出:[1,2]示例 2:(图

uuid.js 使用

相关代码 import { NIL } from "uuid";/** 验证UUID* 为空 则返回 false* @param uuid* @returns {boolean}*/export function MyUUIDValidate(uuid: any): boolean {if (typeof uuid === "string" && uuid !== NIL) { //uuid

js定位navigator.geolocation

一、简介   html5为window.navigator提供了geolocation属性,用于获取基于浏览器的当前用户地理位置。   window.navigator.geolocation提供了3个方法分别是: void getCurrentPosition(onSuccess,onError,options);//获取用户当前位置int watchCurrentPosition(