本次操作覆盖Windows/MacOS/Linux,需提前装好以下3个工具:
用Node.js生态最成熟的压缩工具组合处理所有前端静态资源,压缩率普遍可达60%-90%。
新建空文件夹static-compress,打开命令行进入该文件夹,执行以下命令生成package.json:
``` npm init -y ```安装核心压缩依赖:
``` npm install gulp gulp-cli gulp-imagemin@8 imagemin-pngquant imagemin-mozjpeg gulp-uglify-es gulp-clean-css del -D ```在static-compress根目录新建文件gulpfile.js,粘贴以下完整代码:
```javascript const gulp = require('gulp'); const imagemin = require('gulp-imagemin'); const pngquant = require('imagemin-pngquant'); const mozjpeg = require('imagemin-mozjpeg'); const uglify = require('gulp-uglify-es').default; const cleanCSS = require('gulp-clean-css'); const del = require('del'); // 清空输出目录 gulp.task('clean', () => del(['dist'])); // 压缩PNG/JPG/GIF/SVG gulp.task('compress-img', () => gulp.src('src/img//.{png,jpg,jpeg,gif,svg}') .pipe(imagemin([ imagemin.gifsicle({ interlaced: true }), imagemin.mozjpeg({ quality: 75, progressive: true }), pngquant({ quality: [0.6, 0.8], speed: 1 }), imagemin.svgo({ plugins: [ { removeViewBox: false }, { cleanupIDs: false } ] }) ])) .pipe(gulp.dest('dist/img')) ); // 压缩JS(保留注释/许可证) gulp.task('compress-js', () => gulp.src('src/js//.js') .pipe(uglify({ output: { comments: /^!/ } })) .pipe(gulp.dest('dist/js')) ); // 压缩CSS gulp.task('compress-css', () => gulp.src('src/css//.css') .pipe(cleanCSS({ level: 2 })) .pipe(gulp.dest('dist/css')) ); // 复制HTML(如需压缩可加gulp-htmlmin插件,本次以简单场景覆盖) gulp.task('copy-html', () => gulp.src('src//.html') .pipe(gulp.dest('dist')) ); // 默认执行全部压缩任务 gulp.task('default', gulp.series('clean', gulp.parallel('compress-img', 'compress-js', 'compress-css', 'copy-html'))); ```在static-compress根目录创建src文件夹,按以下结构放原始静态资源:
回到命令行,执行压缩命令:
``` npx gulp ```压缩后的资源会自动生成在dist目录,可直接替换生产环境的静态资源。

用nginx对动态接口返回的JSON/XML/文本等内容实时压缩,无需修改后端业务代码。
打开nginx.conf,找到http块,在include mime.types;后面直接添加以下完整动态压缩配置:
``` 开启gzip压缩 gzip on; 开启gzip_vary,让CDN/代理服务器缓存不同压缩版本的资源 gzip_vary on; 只压缩超过1KB的内容,避免小资源压缩反而变大 gzip_min_length 1024; 压缩代理服务器返回的资源,根据响应头Vary判断 gzip_proxied any; 设置压缩级别(1-9,级别越高压缩率越高但CPU占用越大,生产用6最佳) gzip_comp_level 6; 设置需要压缩的MIME类型 gzip_types text/plain text/css text/xml text/javascript application/json application/javascript application/x-javascript application/xml application/xml+rss application/xhtml+xml font/truetype font/opentype application/vnd.ms-fontobject image/svg+xml; ```压缩后的静态资源如果文件名不变,浏览器会使用旧的缓存资源,无法生效,需用简单的文件名哈希方案解决。
在static-compress根目录安装哈希依赖:
``` npm install gulp-rev gulp-rev-collector -D ```修改gulpfile.js的完整代码如下:
```javascript const gulp = require('gulp'); const imagemin = require('gulp-imagemin'); const pngquant = require('imagemin-pngquant'); const mozjpeg = require('imagemin-mozjpeg'); const uglify = require('gulp-uglify-es').default; const cleanCSS = require('gulp-clean-css'); const del = require('del'); const rev = require('gulp-rev'); const revCollector = require('gulp-rev-collector'); // 清空输出目录 gulp.task('clean', () => del(['dist', 'rev'])); // 压缩并哈希图片 gulp.task('compress-img', () => gulp.src('src/img//.{png,jpg,jpeg,gif,svg}') .pipe(imagemin([ imagemin.gifsicle({ interlaced: true }), imagemin.mozjpeg({ quality: 75, progressive: true }), pngquant({ quality: [0.6, 0.8], speed: 1 }), imagemin.svgo({ plugins: [ { removeViewBox: false }, { cleanupIDs: false } ] }) ])) .pipe(rev()) .pipe(gulp.dest('dist/img')) .pipe(rev.manifest()) .pipe(gulp.dest('rev/img')) ); // 压缩并哈希JS gulp.task('compress-js', () => gulp.src('src/js//.js') .pipe(uglify({ output: { comments: /^!/ } })) .pipe(rev()) .pipe(gulp.dest('dist/js')) .pipe(rev.manifest()) .pipe(gulp.dest('rev/js')) ); // 压缩并哈希CSS gulp.task('compress-css', () => gulp.src('src/css//.css') .pipe(cleanCSS({ level: 2 })) .pipe(rev()) .pipe(gulp.dest('dist/css')) .pipe(rev.manifest()) .pipe(gulp.dest('rev/css')) ); // 替换HTML中的静态资源引用为哈希版本 gulp.task('replace-html', () => gulp.src(['rev//.json', 'src//.html']) .pipe(revCollector()) .pipe(gulp.dest('dist')) ); // 默认执行全部任务 gulp.task('default', gulp.series('clean', gulp.parallel('compress-img', 'compress-js', 'compress-css'), 'replace-html')); ```回到static-compress命令行,再次执行:
``` npx gulp ```现在dist目录下的静态资源文件名会带8位哈希值(如main.abc123def.js),HTML中的引用也会自动替换。
用Chrome DevTools完成验证,确保所有优化生效:
若图片/JS/CSS的Size比原始小60%以上,Content-Encoding有gzip,且HTML引用的是哈希文件名的资源,说明流量收缩成功。
易频IT社区是综合性互联网IT技术门户网站,专注分享网络技术、服务器运维、网络安全、编程开发、系统架构、云计算、大数据等行业干货,实时更新IT行业资讯、零基础教程、实战案例,为IT从业者、技术爱好者提供专业的学习交流平台。
Copyright © 2021-2026 易频IT社区. All Rights Reserved. 备案号:闽ICP备2023013482号 网站地图