nuxt3使用记录五:启动压缩构建并自定义静态资源代理(不仅限于nuxt3)

我们构建项目时,为了节约带宽资源,加速网页的加载,一个有效的配置是启用压缩,现在浏览器通常支持三种压缩格式:Accept-Encoding:gzip, deflate, br
nuxt3也同样自带压缩功能,默认支持两种格式gzip,br

// nuxt.config.ts
    nitro: {
        compressPublicAssets: true,        // 启动压缩
    }

然后构建完的静态资源会同时存在三种格式:1. 源文件 2.源文件被压缩成gzip格式 3.源文件被压缩成br格式

对比可以发现,压缩后大小减少很多,其中br格式压缩率最高

nuxt3通过SSG构建完静态资源,它会提醒你直接执行命令npx serve .output/public即可代理运行,并且会根据请求头判断客户端是否支持压缩格式,支持的话优先返回压缩后的文件。不得不说nuxt3在细节方面还是做得不错的。

第一种代理方式

一般情况下,传统的vue3项目,构建完网上的资料大多介绍使用nginx进行代理,确实是很成熟的方案,包括启用了压缩资源的代理方式,网上很多资料,我也没采用这种方式,就不说了,nuxt3构建的自然也可以使用nginx来进行代理

第二种代理方式

服务器安装好node环境,然后使用npx serve .output/public 一键代理,并且也支持指定端口,这个也不难,我就不细说了

PS:这种代理优先返回gzip格式,而不是压缩率更高的br格式,并且没找到设置的方法

第三种代理方式

重点当然是实现自定义代理,如果不考虑压缩格式,其实众多后端框架都已经自带静态资源的代理能力,也很容易实现。

然而,需要代理具有压缩格式的静态资源的自定义代理实现,网上居然找不到现成的方案,于是我就自己摸索了一下,发现也不难实现,以下是我使用golang-gin框架实现的自定义代理。

PS:静态资源代理的本质就是返回对应的文件,成熟的http框架都带有返回文件的接口

核心就是判断请求头是否支持压缩格式,支持的话,就返回对应压缩格式的文件,不支持的话就返回源文件,而返回文件就是用框架自带的File()接口,一个成熟的http框架肯定有该接口的,和我们后端返回文件的是同一个接口

  1. 首先处理未明确指定文件的请求,如根目录的请求,这种请求都指向对应的index.html,所以手工指定成index.html即可
  2. 判断文件类型,设置"Content-Type"请求头,这一步得根据源文件的格式来手工设置
  3. 判断请求的文件是否存在,不存在返回404.html(非必要)
  4. 依次判断是否存在br,gzip等压缩格式的文件,如果有,则返回压缩后的文件,否则返回源文件
func ProxyStatic(c *gin.Context) {
	var file string
	urlPath := c.Request.URL.Path
	// 路径以/结尾,或者直接以一个目录结尾的,默认其请求的是index.html
	if strings.HasSuffix(urlPath, "/") || !strings.Contains(urlPath, ".") {
		file = path.Join("./web", urlPath, "index.html")
		c.Header("Content-Type", `text/html; charset=utf-8`) // 因为后续可能返回它的压缩文件,必须得手工设置类型,否则c.File获取的是压缩文件的类型
	} else { // 其他则是带具体文件名的请求,当前我的文件类型里只有.js和.css,如果还有其他,需在此补充
		file = path.Join("./web", urlPath)
		if strings.HasSuffix(urlPath, ".js") {
			c.Header("Content-Type", `application/javascript; charset=utf-8`) // 因为后续可能返回它的压缩文件,必须得手工设置类型,否则c.File获取的是压缩文件的类型
		} else if strings.HasSuffix(urlPath, ".css") {
			c.Header("Content-Type", `text/css; charset=utf-8`) // 因为后续可能返回它的压缩文件,必须得手工设置类型,否则c.File获取的是压缩文件的类型
		}
	}
	// 判断文件是否存在,如果不存在则返回404.html
	if !fileExists(file) {
		file = path.Join("./web", "404.html")
	}
	// 下面是判断请求是否支持压缩,如果支持,先判断是否有对应的压缩文件,有则返回压缩文件,无则返回原文件
	acceptEncoding := c.Request.Header.Get("Accept-Encoding")
	if strings.Contains(acceptEncoding, "br") && fileExists(file+".br") {
		c.Header("Content-Encoding", "br") // 告诉客户端,返回的压缩文件是br格式
		c.File(file + ".br")
	} else if strings.Contains(acceptEncoding, "gzip") && fileExists(file+".gz") {
		c.Header("Content-Encoding", "gzip") // 告诉客户端,返回的压缩文件是gzip格式
		c.File(file + ".gz")
	} else {
		c.File(file)
	}
}

代码也很简单,根据自己实际情况略作修改即可,终点是要根据源文件的类型,手动设置"Content-Type",不能等c.File(file)自动设置,因为它返回压缩文件时识别的类型是压缩格式,不是源文件的,会导致前端解析失败

路由就如下方式设置:

	// 这些资源没对应压缩格式,直接使用自带的静态资源接口就可以
	router.StaticFile("/", "./web")
	router.Static("/images/", "./web/images")

	// 自定义静态资源代理
	router.GET("/dist/*name", app.ProxyStatic)

这样我整个项目都可以使用自己的代理程序,更自由了。服务器也不需要安装node,golang的性能还是强过node的,

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

深度剖析扫雷游戏的各个知识点(2)

小伙伴们,大家好。这次继续上次的剖析扫雷游戏的知识点。 那么本次咱们主要是讲扫雷中的宏定义,也就是#define这些 首先#define是用来定义一个宏,后面就是类似于和变量一样的常量名,以及最后的数字就是它的值。 定义规则 #def…

数据结构——树和二叉树

目录 前言 一、树概念及结构 1.1树的概念 1.2 树的相关概念 ​编辑 1.3 树的表示 1.4 树的应用 2.二叉树概念及结构 2.1 二叉树概念 2.2 现实中的二叉树 2.3 特殊的二叉树 2.4 二叉树的性质 2.5 二叉树的存储结构 总结 前言 之前我们学习到的数据结构都是线性的…

Linux Makefile

1.开发背景 linux 下编译程序需要用到对应的 Makefile,用于编译应用程序。 2.开发需求 编写 Makefile 编译应用程序 1)支持多个源文件 2)支持多个头文件 3)支持只编译修改的文件,包括源文件和头文件 4)支持…

【Android Studio报错】:* What went wrong:Out of memory. Java heap space

项目场景: 今天,刚打开自己的安卓项目发现报错: 报错: * What went wrong: Out of memory. Java heap space Possible solution: - Check the JVM memory arguments defined for the gradle process in: gradle.properties in…

STM32G030F6P6TR ST意法

STM32G030F6P6TR是ST(意法半导体)一款基于高性能ArmCortex-M032位RISC内核,工作频率高达64MHz的32位MCU微控制器。代理销售ST(意法半导体)全系列IC电子元器件-中芯巨能为您提供STM32G030F6P6TR(ST 32位MCU)引脚图及中文参数介绍等内容。 STM32G030F6P6TR的中文参数 …

Python多态

1.多态 多态定义:多态(polymorphism)是指同一个方法调用由于对象不同可能会产生不同的行为 注意以下2点: 1.多态是方法的多态,属性没有多态。 2.多态的存在有2个必要条件:继承、方法重写 class Animal:de…

RabbitMQ入门实战

文章目录 RabbitMQ入门实战基本概念安装快速入门单向发送多消费者 RabbitMQ入门实战 官方:https://www.rabbitmq.com 基本概念 AMQP协议:https://www.rabbitmq.com/tutorials/amqp-concepts.html 定义:高级信息队列协议(Advanc…

ORA-600 ktsiseginfo1故障---惜分飞

oracle 9i的库在运行途中突然报ORA-600 kcbnew_3错误 Sun Mar 31 14:25:11 2024 Undo Segment 69 Onlined Sun Mar 31 14:25:11 2024 Created Undo Segment _SYSSMU69$ Sun Mar 31 14:25:11 2024 Created Undo Segment _SYSSMU70$ Undo Segment 70 Onlined Sun Mar 31 14:28:41…

开启Three.js之旅(会持续完善)

文章目录 Three.js必备构建项目场景Scene相机CameraPerspectiveCamera 渲染器WebGLRendererCSS3DRenderer 灯光LightAmbientLightDirectionalLight 平行光PointLight 加载器CacheFileLoaderLoaderGLTFLoaderRGBELoaderTextureLoader 材质MetarialMeshBasicMaterialMeshLambertM…

【C++程序员的自我修炼】拷贝构造函数

心存希冀 追光而遇目有繁星 沐光而行 目录 拷贝构造函数概念 拷贝构造的特征 无穷递归的解释 浅拷贝 总结: 深拷贝 拷贝构造函数典型调用场景 总结 契子✨ 在生活中总有很多琐事,不做不行做了又怕麻烦,有时候想要是有个和自己一模一样的人就…

机器学习和深度学习-- 李宏毅(笔记于个人理解)Day 21

Day 21 Self- Attention 选修部分 ​ 学完自适应 再回来看看 Sequence Labling 假如我们现在有一个需要读完全部句子才能解的问题, 那么red window 就需要变得是最大的(最长的句子); 其实这里大家有没有想过,这个玩意…

【机器学习】数据变换---小波变换特征提取及应用案列介绍

引言 在机器学习领域,数据变换是一种常见且重要的预处理步骤。通过对原始数据进行变换,我们可以提取出更有意义的特征,提高模型的性能。在众多数据变换方法中,小波变换是一种非常有效的方法,尤其适用于处理非平稳信号和…

maridb双数据源联查解决方案:联合存储引擎(Federated Storage Engine)

本地MySQL数据库要访问远程MySQL数据库的表中的数据, 必须通过FEDERATED存储引擎来实现. 有点类似Oracle中的数据库链接(DBLINK)。使用FEDERATED存储引擎的表,本地只存储表的结构信息,数据都存放在远程数据库上,查询时通过建表时指定的连接符去获取远程库的数据返回到本地。操作…

爬虫机试题-爬取新闻网站

之前投简历时遇到了这样的一个笔试。本以为会是数据结构算法之类的没想到直接发了一个word直接提需求,感觉挺有意思就写了这篇文章,感兴趣的朋友可以看看。 拿到urllist 通过分析页面结构我们得以知道,这个页面本身没有新闻信息,是…

计算机软考流程介绍

笔者来介绍一下软考流程 1、考试简介 计算机技术与软件专业技术资格(水平)考试:简称 计算机软考 认证: 国家人力资源和社会保障部 国家工业和信息化部 目的: 科学、公正地对全国计算机与软件专业技术人员进行职业资格…

Hotcoin 热门资产上新速报:以太坊互操作性基础设施Omni Network(OMNI)

Hotcoin持续为全球600万用户发掘优质潜力资产,热门币种交易上热币。一文快速了解今日上新资产:Omni Network(OMNI) 推荐指数 8.4 交易对 OMNI/USDT 交易时间 4月17日 GMT8 20:30 资产赛道 Layer1 项目简介 Omni 是以太坊…

安防视频监控/视频集中存储/云存储/磁盘阵列EasyCVR平台级联时,下级平台未发流是什么原因?

安防视频监控/视频集中存储/云存储/磁盘阵列EasyCVR平台可拓展性强、视频能力灵活、部署轻快,可支持的主流标准协议有国标GB28181、RTSP/Onvif、RTMP等,以及支持厂家私有协议与SDK接入,包括海康Ehome、海大宇等设备的SDK等。平台既具备传统安…

黑洞路由、 DDoS 攻击 、 环路

黑洞路由 DDoS 攻击 DDoS 攻击是一种针对服务器、服务或网络的恶意行为。DDoS 攻击通过向目标发送大量流量,使其不堪重负,导致资源和带宽被耗尽。因此,目标可能会变慢或崩溃,无法正常处理合法的流量。DDoS 攻击通常是由僵尸网络…

Jmeter 性能-内存溢出问题定位分析

1、堆内存溢出 ①稳定性压测一段时间后,Jmeter报错,日志报: java.lang.OutOfMemoryError.Java heap space ②用jmap -histo pid命令dump堆内存使用情况,查看堆内存排名前20个对象。 看是否有自己应用程序的方法,从…

CentOS7下安装mysql8或者mysql5.7

mysql8 1、下载 访问mysql官网下载mysql8软件包 https://dev.mysql.com/downloads/mysql/ 选择相应的版本如:RPM Bundle mysql-8.0.33-1.el7.x86_64.rpm-bundle.tar RPM Bundle 8.0.33 下载地址:https://dev.mysql.com/get/Downloads/MySQL-8.0/mysql-8.…