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

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

// nuxt.config.tsnitro: {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 stringurlPath := c.Request.URL.Path// 路径以/结尾,或者直接以一个目录结尾的,默认其请求的是index.htmlif 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.htmlif !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.mzph.cn/web/689.shtml

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

相关文章

油烟净化器智能电控系统:如何实现高效净化与智能控制?

我最近分析了餐饮市场的油烟净化器等产品报告,解决了餐饮业厨房油腻的难题,更加方便了在餐饮业和商业场所有需求的小伙伴们。 在现代餐饮环境中,油烟净化器已成为保障空气清新的必备设备。然而,如何实现高效净化与智能控制成为了…

墨子web3时事周报

蚂蚁集团Web3研发进展与布局 国内Web3赛道的领军企业——蚂蚁集团,凭借其在前沿科技领域的深耕不辍,已在Web3技术研发疆域缔造了卓越战绩。特别是在引领行业革新的关键时刻,集团于今年四月末震撼推出了颠覆性的Web3全套解决方案&#xff0c…

【例6.4】拦截导弹问题(Noip1999)

这个问题可以使用动态规划来解决。我们需要找到最小的系统数量,以拦截所有导弹。每一套系统都需要满足条件:第一发炮弹能够到达任意的高度,但之后每一发炮弹的高度都不能超过前一发。 我们可以使用两个数组:dp1 和 dp2。dp1[i] 表…

在 Ubuntu 12.10 安装 wxPython

安装 wxPython 可以使用 pip 工具,但在 Ubuntu 12.10 上需要首先安装 wxPython 的依赖项。请注意,Ubuntu 12.10 已于2013年终止支持,建议升级到更高版本的 Ubuntu。以下是在 Ubuntu 12.10 上安装 wxPython 的一般步骤: 一、问题背…

vue3+vite+superMap(超图)实现通视分析

<template><div><el-dialog draggable destroy-on-close v-if"changeVisibilityState" :modal"false" v-model"changeVisibilityState"close-icon"" title"通视分析" width"20%" :before-close&qu…

考研日常记录

由于实在太无聊了 &#xff0c; 所以记录以下考研备考日常 &#xff0c; 增加一点成就感 &#xff0c; 获得一点前进动力。 2024.4.18 周四 课程情况&#xff1a; 无课 时间规划&#xff1a; 上午&#xff1a;休息 下午&#xff1a; 事项耗时进度备注写作业1h复习英语单词…

深入浅出学习切片LOD——ArcGIS server模拟缓存切片(影像快显)

一、第一次实践 原理 免切片实现影像服务的模拟切片&#xff0c;主要原理是接收前端传过来的xyz(行列层级)以及切片方案&#xff0c;计算出该请求的切片的四至经纬度信息&#xff0c;通过mapserver的exportImage接口&#xff0c;传入每个模拟切片的四至经纬度信息得到图片返回…

Spark01

Spark01 一. Spark概述二. Spark环境部署 - Local三. Spark环境部署 - Standalone1. Standalone集群概述2. Standalone环境部署3. 测试环境 四. Spark环境部署 - Standalone-HA1. 安装部署Zookeeper1. 下载2. zookeeper安装3. 配置StandAlone-HA集群 五. Spark On YARN -- 重点…

ESP32S3在VScode中使用USB口调试

ESP32S3在VScode中使用USB口调试 安装USB驱动修改工程的配置文件launch.jsonsettings.json 启动GDB Server 安装USB驱动 在powershell中输入下面指令&#xff1a; Invoke-WebRequest https://dl.espressif.com/dl/idf-env/idf-env.exe -OutFile .\idf-env.exe; .\idf-env.exe…

js实现抽奖效果

<!DOCTYPE html> <html lang"en"> <head><meta charset"UTF-8"><meta name"viewport" content"widthdevice-width, initial-scale1.0"><title>随机抽奖</title> </head> <body>…

锂电池寿命预测 | Matlab基于GRU门控循环单元的锂电池寿命预测

目录 预测效果基本介绍程序设计参考资料 预测效果 基本介绍 锂电池寿命预测 | Matlab基于GRU门控循环单元的锂电池寿命预测 Matlab基于GRU的锂电池剩余寿命预测 基于GRU的锂电池剩余寿命预测&#xff08;单变量&#xff09; 运行环境Matlab2020及以上 锂电池的剩余寿命预测是…

W11安装WSL2 ubuntu 攻略

W11安装WSL2 ubuntu 攻略 最近换了新电脑重新安装一遍wsl2&#xff0c;记录一下方便以后使用。 打开控制面板&#xff0c;选择程序 —— 启用或关闭Windows功能&#xff0c;勾选 适用于Linux的Windows子系统还有虚拟机平台选项&#xff0c;修改后需要重启 wsl2版本 wsl --se…

Rust腐蚀服务器清档多教程

Rust腐蚀服务器清档多教程 大家好我是艾西&#xff0c;一个做服务器租用的网络架构师。上期教了大家怎么搭建服务器以及安装插件等那么随着大家自己架设服或是玩耍的时间肯定会有小伙伴想要去新增开区数量或是把原本的服务器进行一些调整等&#xff0c;那么今天主要聊的就是怎…

Linux常用命令详解:提升你的系统运维能力

在Linux系统运维工作中&#xff0c;熟练掌握常用命令是每位工程师的必备技能。本文将为大家介绍一些Linux系统中常用的命令&#xff0c;帮助大家更好地进行系统管理和维护。 一、文件操作命令 1.ls&#xff1a;列出目录内容。 2.cd&#xff1a;切换目录。 3.pwd&#xff1…

如何在Windows 10中启用和使用上帝模式,这里有详细步骤

序言 上帝模式&#xff08;God Mode&#xff09;是一个特殊的文件夹&#xff0c;只在一个窗口中显示所有可用的操作设置。它可以节省搜索命令的时间&#xff0c;而无需知道通过“开始”菜单或“控制面板”查找命令的步骤。上帝模式默认情况下是隐藏的&#xff0c;所以我们需要…

windows10 下 wsl + ubuntu + cups 安装使用

文章目录 windows10 下 wsl + ubuntu + cups 安装使用一、安装wsl二、wsl闪退三、安装cups四、启动cups五、无法添加打印机六、挂载usb打印机七、添加打印机八、打印文件参考文献windows10 下 wsl + ubuntu + cups 安装使用 一、安装wsl wsl --install安装完按要求重启,两次…

类和对象-封装-设计案例1-立方体类

#include<bits/stdc.h> using namespace std; class Cube{public://设置长void setL(int l){m_Ll;} //获取长int getL(){return m_L;}//设置宽 void setW(int w){m_Ww;}//获取宽 int getW(){return m_W;}//设置高 void setH(int h){m_Hh;}//获取高int getH(){return m_H;…

线程池 ThreadPoolExecutor 配置参数详解

《开发语言-Java》 线程池 ThreadPoolExecutor 参数详解 一、引言二、主要内容2.1 核心构造函数2.2 核心线程数2.3 最大线程数2.4 空闲线程存活时间2.5 keepAliveTime 的时间单位2.6 核心线程在空闲时的回收策略2.7 工作队列2.8 线程工厂2.9 拒绝策略 三、总结 一、引言 提到 …

《QT实用小工具·三十一》基于QT开发的访客管理平台demo2

1、概述 源码放在文章末尾 该项目为访客管理平台demo&#xff0c;包含主界面、系统设置、警情查询、调试帮助、用户退出功能。 项目部分代码如下&#xff1a; #pragma execution_character_set("utf-8")#include "frmmain.h" #include "ui_frmmain…

js调用html页面需要隐藏某个按钮

&#x1f3c6;本文收录于「Bug调优」专栏&#xff0c;主要记录项目实战过程中的Bug之前因后果及提供真实有效的解决方案&#xff0c;希望能够助你一臂之力&#xff0c;帮你早日登顶实现财富自由&#x1f680;&#xff1b;同时&#xff0c;欢迎大家关注&&收藏&&…