使用gulp自动化打包合并前端静态资源(CSS、JS文件压缩、添加版本号)

现在正在做的项目更新迭代比较频繁,会经常对前端代码打包部署,手动整合代码文件很麻烦并且浪费时间,所以决定使用gulp来代替手工完成这项工作。

前端静态资源在发版更新时会面临客户端浏览器缓存的问题(可参考这篇文章),解决这个问题可以采用两类方法:覆盖方法(引用资源时加版本号,不修改资源文件名)、非覆盖方法(修改资源文件名),本篇文章主要采用的是第一种加版本号的方式,主要用gulp给静态资源自动加版本号和压缩CSS、JS。

原理:通过对JS,CSS文件内容进行Hash运算,生成一个文件的唯一Hash字符串,若对文件内容进行了修改则Hash号会发生变化。在HTML中引用文件时将版本号加在后面。

原始HTML:

1 <link href="css/global.css" rel="stylesheet" type="text/css" />
2 <script src="js/fun.js"></script>

使用后HTML:

1 <link href="css/global.css?v=b40a6f2a9f" rel="stylesheet" type="text/css" />
2 <script src="js/fun.js?v=3a08b5fa87"></script>

一、环境配置(安装gulp)

首先安装node、npm(此处省略)

安装gulp以及用到的插件,并在项目目录下创建文件gulpfile.js。

$ npm install --global gulp    --安装全局gulp
$ npm install --save-dev gulp
$ npm install --save-dev gulp-rev
$ npm install --save-dev gulp-rev-collector
$ npm install --save-dev run-sequence
$ npm install --save-dev gulp-clean
$ npm install --save-dev gulp-minify-css
$ npm install --save-dev gulp-uglify

在项目目录下创建文件gulpfile.js

项目目录结构:

node_modules中是安装的gulp和各种插件

二、编写gulpfile.js

 1 //引入gulp和gulp插件
 2 var gulp = require('gulp'),
 3     runSequence = require('run-sequence'),
 4     rev = require('gulp-rev'),
 5     clean = require('gulp-clean'),
 6     minifycss=require('gulp-minify-css'),
 7     uglify=require('gulp-uglify'),
 8     revCollector = require('gulp-rev-collector');
 9 
10 //定义css、js源文件路径
11 var cssSrc = './**/*.css',            //选择目录下所有css
12       jsSrc = './**/*.js',     //选择目录下所有css
13       srcExclude = '!./node_modules/**/*',    //排除node_modules中的文件
14       cssFile = 'css/**/*',    //css文件夹
15       imageFile = 'image/**/*',    //图片文件夹
16       jsFile = 'js/**/*',    //js文件夹
17       jsCompressPath = 'Publish/js/*.js',    //压缩Publish中的js
18       cssCompressPath = 'Publish/css/*.css';    //压缩Publish中的css
19 
20 
21 //CSS生成文件hash编码并生成 rev-manifest.json文件名对照映射
22 gulp.task('revCss', function(){
23     return gulp.src([cssSrc, srcExclude])
24         .pipe(rev())
25         .pipe(rev.manifest())
26         .pipe(gulp.dest('rev/css'));
27 });
28 
29 //js生成文件hash编码并生成 rev-manifest.json文件名对照映射
30 gulp.task('revJs', function(){
31     return gulp.src([jsSrc, srcExclude])
32         .pipe(rev())
33         .pipe(rev.manifest())
34         .pipe(gulp.dest('rev/js'));
35 });
36 
37 
38 //Html替换css、js文件版本
39 gulp.task('revHtml', function () {
40     return gulp.src(['rev/**/*.json', '*.html'])
41         .pipe(revCollector())
42         .pipe(gulp.dest('Publish'));
43 });
44 
45 //拷贝除HTML外其他的文件
46 gulp.task('copy', function(){
47     return gulp.src([cssFile, jsFile, imageFile],{ base: '.'})
48         .pipe(gulp.dest('Publish'));
49 });
50 
51 //压缩JS
52 gulp.task('jscompress', function(){
53     return gulp.src(jsCompressPath)
54         .pipe(uglify())
55         .pipe(gulp.dest("Publish/js"));
56 });
57 
58 //压缩CSS
59 gulp.task('csscompress', function(){
60     return gulp.src(cssCompressPath)
61         .pipe(minifycss())
62         .pipe(gulp.dest("Publish/css"));
63 });
64 
65 //开发构建
66 gulp.task('dev', function (done) {
67     condition = false;
68     runSequence(
69         ['clean'],
70         ['revCss'],
71         ['revJs'],
72         ['revHtml'],
73         ['copy'],
74         ['jscompress'],
75         ['csscompress'],
76         done);
77 });
78 
79 gulp.task('clean', function(){
80     gulp.src('rev',{read:false}).pipe(clean());
81     return gulp.src('Publish',{read:false}).pipe(clean());
82 });
83 
84 
85 gulp.task('default', ['dev']);

三、更改插件代码

在项目目录下直接执行gulp命令

$ gulp

会得到如下效果:

1 <link href="css/global-b40a6f2a9f.css" rel="stylesheet" type="text/css" />
2 <script src="js/fun-3a08b5fa87.js"></script>

需要更改gulp-rev、rev-path、gulpl-rev-collector插件的代码:

1.node_modules/gulp-rev/index.js

第135行:manifest[originalFile] = revisionedFile;

更改为:manifest[originalFile] = originalFile + '?v=' + file.revHash;

2.node_modules/rev-path/index.js

第9行:return modifyFilename(pth, (filename, ext) => `${filename}-${hash}${ext}`);

更改为:return modifyFilename(pth, (filename, ext) => `${filename}${ext}`);

3.node_modules/gulp-rev-collector/index.js

第40行:var cleanReplacement =  path.basename(json[key]).replace(new RegExp( opts.revSuffix ), '' );

更改为:var cleanReplacement = path.basename(json[key]).split('?')[0];

这里需要注意插件的版本不一样,需要改动的地方会有不同;

本文这里所有插件的版本为:

gulp@3.9.1
gulp-rev@8.1.1
gulp-rev-collector@1.2.4
rev-path@2.0.0
run-sequence@2.2.1
gulp-clean@0.4.0
gulp-minify-css@1.2.4
gulp-uglify@3.0.0

改完之后的效果

1 <link href="css/global.css?v=b40a6f2a9f" rel="stylesheet" type="text/css" />
2 <script src="js/fun.js?v=3a08b5fa87"></script>

四、小结

gulp的任务的执行是异步的,想要保证任务执行的顺序,需要使用run-sequence插件

 1 gulp.task('dev', function (done) {
 2     condition = false;
 3     runSequence(
 4         ['clean'],
 5         ['revCss'],
 6         ['revJs'],
 7         ['revHtml'],
 8         ['copy'],
 9         ['jscompress'],
10         ['csscompress'],
11         done);
12 });

这里顺序执行任务:

先清除旧的rev和Pulish文件夹及其目录下所有文件(clean),之后生成CSS文件名对照映射的JSON文件(revCSS),再之后生成JS文件名对照映射的JSON文件(revJS),之后替换掉HTML中的链接,加上版本号(revHTML),将除了HTML之外其他的静态资源拷贝到Publish中(copy),然后压缩Publish/js中的JS文件,并将压缩后的文件替换掉原来的未压缩文件(jscompress),最后压缩Publish/css中的CSS文件,并替换掉未压缩文件(csscompress)。

PS:

1.在写路径时,"!"是排除的标识,可以排除一些文件,如:

gulp.src(['./**/*.css', '!./node_modules/**/*'])

这里选中的文件就是除了node_modules中的其他文件夹下的CSS文件

2.拷贝时若要保持路径,需要加一个base选项,即:

gulp.src('Publish/css/*.css',{ base: '.'})

 之后也可以分别对测试环境和生产环境编写任务,使用命令分开打包。

转载于:https://www.cnblogs.com/Aoobruce/p/8407225.html

  • 1
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: Gulp是一种前端自动化工具,它可以帮助前端开发人员自动完成一些重复性工作,例如压缩CSS和JavaScript文件、自动刷新浏览器、合并文件等。 使用Gulp需要先安装Node.js和npm,然后使用npm安装Gulp。安装完成后,可以在项目的根目录下创建一个名为gulpfile.js文件,该文件中定义了Gulp要执行的任务和任务的具体操作。 在gulpfile.js中,可以使用Gulp提供的API来定义任务。例如,可以使用gulp.task()方法定义一个任务,该方法接受两个参数:任务的名称和任务要执行的操作。可以使用gulp.src()方法指定要处理的文件,然后使用各种Gulp插件来执行各种操作,例如gulp-concat用于合并文件gulp-uglify用于压缩JavaScript文件等。 最后,可以使用gulp.dest()方法将处理后的文件保存到指定目录。定义好任务后,可以在终端中使用gulp命令来执行任务,Gulp会自动执行任务并输出相关日志信息。 ### 回答2: Gulp是一个前端自动化工具,它通过编写简洁、易于理解的代码来帮助开发者自动化前端开发中的各种任务。 首先,Gulp使用简单且灵活。它使用流的概念,让开发者能够通过将任务连接在一起构建整个开发流程。开发者可以定义各种任务,如压缩文件合并文件、编译代码等等,然后通过管道将这些任务链接在一起。这种方式使得构建前端项目变得非常容易,同时也让开发者能够根据自己的需求定制任务流程。 其次,Gulp有大量的插件可供选择。Gulp的插件系统非常强大,社区中有数以千计的插件可用。这些插件可以帮助开发者解决各种问题,如自动添加浏览器前缀、压缩文件、优化图片等等。开发者可以根据自己的需求选择合适的插件使用,从而提高工作效率。 另外,Gulp还具有良好的生态系统。无论是官方文档还是社区文档,都非常详细且易于理解。开发者可以很容易地找到所需的信息和教程,学习如何使用Gulp来优化自己的工作流程。 总的来说,Gulp是一个功能强大且易于使用前端自动化工具。它能够帮助开发者提高工作效率,简化开发流程,同时也具有丰富的插件和优秀的生态系统。无论是小型项目还是大型项目,Gulp都是一个非常好的选择。 ### 回答3: Gulp是一个前端自动化工具,用于简化开发流程和提高工作效率。它基于流(stream)的概念,可以自动化处理和优化前端工作中的许多重复任务。 首先,通过在项目中配置gulpfile.js文件,可以定义各种任务(task)和相应的操作。可以使用Gulp来执行各种编译、压缩合并、重命名、清理等操作,例如压缩CSS和JavaScript文件、编译Sass或Less、优化图像等等。这些任务可以按照开发者的需求进行自定义配置,满足不同项目的要求。 Gulp使用也非常简单,只需要通过命令行运行gulp命令并指定要执行的任务即可。当有文件变动时,Gulp可以自动监听文件的变化并重新执行相应的任务,实时更新项目的输出。 此外,Gulp还支持插件生态系统,拥有大量的插件可供开发者选择使用。这些插件可以用于执行各种任务,例如自动生成CSS前缀、合并相同类型的文件、启动本地开发服务器等等。 总的来说,Gulp通过简化和自动化前端开发流程,大大提高了开发效率。它的简单易用和丰富的插件生态系统使得开发者能够根据项目需求快速搭建和优化前端工作流程。使用Gulp可以减少重复劳动,提高代码质量和开发效率,因此成为前端开发中不可或缺的工具之一。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值