、gzip压缩技术
gzip(GNU-ZIP)是一种压缩技术,经过gzip压缩后,页面大小可以变为原来的30%甚至更少,这样用户访问的时候速度会快得多。gzip网页压缩的实现需要浏览器和服务器的支持。
gzip压缩的过程:
首先在服务器端压缩,然后传到浏览器端后解压,当浏览器支持gzip解压时,会在请求消息头中包含Accept-Encoding:gzip,这样Nginx就会向浏览器发送经过gzip后的内容,同时在响应消息头中加入Content-Encoding:gzip,这是gzip后的内容,告知浏览器要先解压才能解析输出。
2、网页压缩传输配置
Nginx服务器为网页压缩专门提供了gzip模块,并且模块中的相关指令均可以设置在http,server,location块中,实现服务器端按照指定的设置进行压缩,具体指令如下:
gzip:用于开启或关闭gzip模块;
gzip_buffers:设置系统获取几个单位的缓存用于存储gzip的压缩结果数据流;
gzip_comp_level:gzip压缩比,压缩级别是1~9,1的压缩级别最低,9的压缩级别最高,压缩级别越高压缩率越大,压缩时间越长;
gzip_disable:对一些特定的User-Agent不使用压缩功能;
gzip_min_length:设置允许压缩的页面最小字节数,页面字节数从响应消息头的Content-Length中进行获取;
gzip_http_version:识别HTTP协议版本,其值可以是1.1(默认值)或1.0;
gzip_proxied:用户设置启用或禁用从代理服务器上收到响应内容的gzip压缩功能;
gzip_types:匹配MIME类型进行压缩,且无论是否指定,text/html类型总是会被压缩的;
gzip_vary:用于在响应消息头中添加Vary,Accept-Encoding,使代理服务器根据请求头中的Accept-Encoding识别是否启用gzip压缩;
1、修改配置文件
2、访问测试
Content-Encoding为gzip类型,Content-Type为html,Transfer-Encoding为chunked表示内容长度不确定;
除了上述配置外,在实际开发 中还可以具体配置压缩比,缓存大小,对于代理是否采用压缩等详细的设置:
gzip_buffers 4 16k; //按照原始数据大小以16KB为单位的4倍申请内存;
gzip_comp_level 4; //压缩等级;
gzip_disable "MSIE [1-6]."; //IE6时,不进行压缩,防止出现页面假死现象;
gzip_min_length 5k; //当响应内容大于5kb时进行压缩输出,且一般建议最小值设置为1kb,当小于1kb时,可能会出现越压越大的问题;
gzip_http_version 1.0;
gzip_proxied any;
gzip_vary on;
gzip_proxied常用参数:
any:无条件压缩所有响应数据;
off:关闭反向代理的压缩;
expired:如果响应消息头包含Expires,启用压缩;
no-cache:如果响应消息头包含Cache-Control:no-cache,启用压缩;
no-store:如果响应消息头包含Cache-Control:no-store,启用压缩;
private:如果响应消息头包含Cache-Control:private,启用压缩;
no_last_modified:如果响应消息头中不包含Last-Modified,启用压缩;
no_etag:如果响应消息头中不包含ETag,启用压缩;
auth:如果响应消息头中包含Authorization头信息,启用压缩;
实现 HTML 压缩,可以使用 JavaScript 中的正则表达式来去除 HTML 中的空格和注释。以下是一个简单的 HTML 压缩函数:
function compressHTML(html) {
// 去除注释
html = html.replace(/<!--[\s\S]*?-->/g, "");
// 去除多余空白
html = html.replace(/\s+/g, " ");
// 去除标签之间空格
html = html.replace(/>\s+</g, "><");
return html.trim();
}
该函数首先使用正则表达式去除 HTML 中的注释。然后,它使用另一个正则表达式去除 HTML 中的多余空格。最后,它使用另一个正则表达式去除标签之间的空格。
为了测试该函数,您可以创建一个 HTML 文件,并在其中添加一些冗余的空格和注释。例如:
<!DOCTYPE html>
<html>
<head>
<title>My Website</title>
</head>
<body>
<!-- This is a comment -->
<h1> Welcome to my website! </h1>
<p> This is some text. </p>
</body>
</html>
然后,您可以在Node.JS中使用以下代码将 HTML 文件加载为字符串并压缩它:
// 加载 HTML 文件
const fs = require("fs");
const html = fs.readFileSync("index.html", "utf8");
// 压缩 HTML
const compressedHtml = compressHTML(html);
console.log(compressedHtml);
输出是一个压缩后的 HTML 字符串,其中不包含注释或冗余空格。
或者直接在IE中测试,代码如下:
function compressHTML(html) {
// 去除注释
html = html.replace(/<!--[\s\S]*?-->/g, "");
// 去除多余空白
html = html.replace(/\s+/g, " ");
// 去除标签之间空格
html = html.replace(/>\s+</g, "><");
return html.trim();
}
var html =`
<!DOCTYPE html>
<html>
<head>
<title>My Website</title>
</head>
<body>
<!-- This is a comment -->
<h1> Welcome to my website! </h1>
<p> This is some text. </p>
</body>
</html>
`;
console.log(compressHTML(html));
运行效果:
TML+JQUERY超大视频上传解决方案
最近项目有个需求,需要在网页前端实现大文件,文件夹的上传和下载,需要支持断点续传,MD5校验,文件秒传,加密传输(国密SM4),加密存储,压缩传输(zip,gzip)功能,前端框架使用VUE,后端用的是JAVA SpringBoot
这个是央企项目,因为国家信息安全的因素,所有政府项目都必须支持信创国产化环境:国产操作系统,国产数据库,国产浏览器,客户那边有些系统用的是Windows7 + IE8,也要求兼容。
网上搜了很多文章,基本上的方案都是vue+html5,或百度webuploader,我们之前也是采用的这个方案,稳定性比较差,传上去的文件数据容易出错,然后断点续传功能不够完善,用户传大文件的时候浏览器响应卡顿容易崩溃,用户传文件的时候不能刷新页面,也不能关闭页面,否则文件进度将会丢失。这个对于现在的客户来说有点难以接受,因为用户传的文件比较大,1G到10G都有,可能一次传不完,传一半,第二天再传。
找了几个月,只发现一个产品比较不错:泽优大文件上传控件(up6),不仅提供了产品源码,视频教程,开发部这边集成很快,基本上没花什么时间,直接把他的代码复制到项目中就完事了。
我们的需求实际上很简单,第一就是希望使用简单,不管是对开发人员,还是对普通用户都要使用简单。对开发人员来说要集成和整合简单,能够提供前端和后端 API,前端API使用和调用要方便。对于普通用户,要使用简单学习成本低。不需要进行使用培训。
第二点就是稳定可靠,用户是政府单位的,对稳定性要求比较高。用户每天上传和下载的文件都比较多,大的有10GB左右,小的有几百KB。
第三点就是能够提供技术支持,因为是政府客户,必须要有技术支持,这个是硬指标,因为项目周期也比较长,中途可能会变更需求或者定制开发,所以厂商必须提供技术服务。
除了这些还有一点就是下载功能需要也支持断点续传。用户平时会从系统中下载很多文件,文件有大有小,大的1G,小的几KB,但是用户是批量下载,不是打包成ZIP下载。
上面的几点能够满足的话基本上就没有什么问题,领导这边希望提供OEM买断或控件源代码的采购方式,我们是软件公司,专门做政府和央企项目,客户项目比较多,有些政府大客户要求源代码审查,领导希望集成到我们自己的产品中去卖,这样就能够为所有用户提供这个功能,用户体验也能够统一。后面维护起来也方便。主要是领导不想每次都要单独采购,太麻烦了。
示例下载:
*请认真填写需求信息,我们会在24小时内与您取得联系。