本文介绍了使用Gulp进行静态资源压缩的方法,以提高网站打开速度。Gulp是一个基于Node.js的自动化构建工具,通过编写JavaScript脚本来定义任务,实现自动化构建。静态资源包括HTML、CSS、JavaScript、图片和字体等,可以通过压缩这些资源文件来减小文件大小。文章详细介绍了安装Gulp和相应插件的步骤,并给出了一个示例的gulpfile.js文件,其中定义了压缩HTML、CSS、JavaScript和字体的任务。此外,文章还提到了对于字体文件的压缩方案,以及通过整合CSS文件和配置本地缓存来进一步优化网站性能的方法。
此内容根据文章生成,并经过人工审核,仅用于文章内容的解释与总结
投诉网站打开速度,一直是博主所关心的问题,那么除了优化系统本身、CDN等方式,还可以采用gulp来压缩资源,从而提升效率
Gulp是什么
Gulp是一个基于Node.js的自动化构建工具,通过编写JavaScript脚本来定义任务,从而实现自动化构建。
- 简单易用:Gulp 的 API 简单易用,不需要很多配置就能够快速上手。
- 插件系统:Gulp 的插件系统丰富,几乎可以处理各种开发任务,包括文件压缩、合并、图片压缩、CSS 预处理器等。
- 自动化构建:Gulp 可以自动监视文件变化,并自动执行相应的任务,大大提高了开发效率。
- 流式处理:Gulp 使用流式处理,可以大大降低内存使用,提高构建速度。
- 易于扩展:Gulp 使用 Node.js 开发,开发者可以自行编写插件来扩展其功能。
综上所述,Gulp 是一个功能强大、易于使用和扩展的自动化构建工具,可以大大提高前端开发的效率。
资源压缩
静态资源:指在 Web 应用程序中,不需要动态生成内容的资源,例如 HTML、CSS、JavaScript、图片、字体等等。这些资源的特点是不会随着请求而发生变化,通常存储在服务器的文件系统中,并通过 HTTP 协议向客户端传输
对于多媒体文件,很多资源都可以被压缩。尽管压缩多少会有一些失真(有损压缩),但只要失真程度不影响用户体验,我们也不必计较这些损失。最常见的压缩方式包括但不限于:使用webp格式、降低图片分辨率等。
字体文件对于英文网站不会有特别严重的负担,但是中文字符数量非常庞大,如果把所有字符都囊括进来,一个字体文件动辄4MB,甚至有些能够超过20MB。因此,对字体文件进行压缩也是必要的。压缩字体文件有两种方案:从字体文件中提取出常用的文字或仅保留我们需要用到的文字。第二种方案的压缩率通常更高,同时也更安全,不会出现有些生僻字我们用到了却给删掉了的情况。但是,第二种方案每当更新网站内容时,就要生成新的字体文件,这就需要考虑客户端缓存的影响。
教程
下面我们使用gulp来压缩静态资源。注:我并没有通过gulp压缩多媒体资源,多媒体资源我是通过netlify插件,如果你需要压缩多媒体资源,可以自行去网上查找相应的插件。
1 2
| npm install --global gulp-cli npm install gulp --save
|
1 2 3 4 5 6 7 8 9 10 11 12
| # 压缩HTML npm install gulp-htmlclean --save-dev npm install gulp-html-minifier-terser --save-dev
# 压缩CSS npm install gulp-cssnano --save-dev
# 压缩JS npm install gulp-terser --save-dev
# 压缩TTF npm install gulp-fontmin --save-dev
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78
| const gulp = require("gulp") //用到的各个插件 const htmlMin = require('gulp-html-minifier-terser') const htmlClean = require('gulp-htmlclean') const terser = require('gulp-terser') const cssnano = require('gulp-cssnano') const fontmin = require('gulp-fontmin')
// 压缩js gulp.task('minify-js', () => gulp.src(['./public/**/*.js', '!./public/**/*.min.js']) .pipe(terser({})) .pipe(gulp.dest('./public')) )
//压缩css gulp.task('minify-css', () => gulp.src(['./public/**/*.css']) .pipe(cssnano({ mergeIdents: false, reduceIdents: false, discardUnused: false, zIndex: false })).pipe(gulp.dest('./public')) )
//压缩html gulp.task('minify-html', () => gulp.src('./public/**/*.html') .pipe(htmlClean()) .pipe(htmlMin({ removeComments: true, //清除html注释 collapseWhitespace: true, //压缩html collapseInlineTagWhitespace: true, collapseBooleanAttributes: true, noNewlinesBeforeTagClose: false, removeAttributeQuotes: true, removeRedundantAttributes: true, //省略布尔属性的值,例如:<input checked="true"/> ==> <input /> removeEmptyAttributes: true, //删除所有空格作属性值,例如:<input id="" /> ==> <input /> removeScriptTypeAttributes: true, //删除<script>的type="text/javascript" removeStyleLinkTypeAttributes: true, //删除<style>和<link>的 type="text/css" minifyJS: true, //压缩页面 JS minifyCSS: true, //压缩页面 CSS minifyURLs: true //压缩页面URL })) .pipe(gulp.dest('./public')) )
//压缩字体 function minifyFont(text, cb) { gulp .src('./public/fonts/*.ttf') //原字体所在目录 .pipe(fontmin({ text: text })) .pipe(gulp.dest('./public/fontsdest/')) //压缩后的输出目录 .on('end', cb); }
gulp.task('minify-ttf', (cb) => { var buffers = []; gulp .src(['./public/**/*.html']) //HTML文件所在目录请根据自身情况修改 .on('data', function (file) { buffers.push(file.contents); }) .on('end', function () { var text = Buffer.concat(buffers).toString('utf-8'); minifyFont(text, cb); }); });
//压缩 gulp.task("zip", gulp.parallel('minify-js', 'minify-css', 'minify-html', 'minify-ttf'))
|
如果有不需要压缩的资源,直接删除或注释对应压缩代码即可。
现在,只要我们在执行hexo g后执行gulp zip即可压缩我们想要压缩的资源了。
下面是优化后的效果
文件 | 压缩前(KB) | 压缩后(KB) | 减少(KB) |
---|
manxin.css | 358 | 150 | 208 |
main.js | 27 | 14 | 13 |
注意
使用gulp压缩TTF字体文件的方法。对于中文网站来说,由于中文字符数量庞大,如果把所有字符都囊括进字体文件中,一个字体文件很容易就会动辄4MB甚至超过20MB。因此,对字体文件进行压缩也是必要的。
压缩字体文件主要有两种方案:
- 第一种:从字体文件中提取出常用的文字或仅保留需要用到的文字。
- 第二种:方案的压缩率通常更高,同时也更安全,因为不会出现删掉了实际需要的生僻字的情况。
不过,第二种方案每当更新网站内容时,就要生成新的字体文件,这就需要考虑客户端缓存的影响。
整合css
我们可以通过将CSS整合进一个文件中来提高空间的利用率(原理自行百度”小文件多为什么占用空间大”)同时也能提高插件的压缩率(因为插件压缩的时候只会分析正在压缩的文件,不会分析多个CSS之间的关系)。
整合CSS有两个方案,一种是手动整合,一种是修改源代码。
尽量使用第二种方案,这里我只给出butterfly主题对应的方案,其它主题的读者可以自行摸索或者干脆用第一种方案。
- 修改[butterfly]\source\css\index.styl
1 2 3 4 5 6 7 8 9 10 11
| // search if hexo-config('algolia_search.enable') @import '_search/index' @import '_search/algolia'
if hexo-config('local_search') && hexo-config('local_search.enable') @import '_search/index' @import '_search/local-search'
+ @import '_custom/*.styl' + @import '_custom/*.css'
|
然后在与该文件同级目录中新建文件夹_custom,接下来,我们把我们自己编写的CSS/styl文件全部放到这里就能直接整合进index.css中了。
本地缓存
另一个简单有效的方案就是配置网站的本地缓存,将网站的一部分静态资源缓存在客户端上。这样客户端在访问网站时,就可以减少一部分网络请求,以此优化用户体验,同时还能减轻服务器负担。
我使用的ServiceWorker进行本地缓存,有兴趣的小伙伴可以看这篇博文:解剖SW原理暨博主SW实现

满心记
分享技术与生活
本文是转载文章,版权归原作者所有。建议访问原文,转载本文请联系原作者