使用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];

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

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

[email protected]3.9.1
[email protected]
[email protected]
[email protected]
run[email protected]2.2.1
gulp[email protected]0.4.0
gulp[email protected]1.2.4
gulp[email protected]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

时间: 2024-10-10 22:44:24

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

Gulp:静态资源(css,js)版本控制

为了防止客户端的静态资源缓存,我们需要每次更新css或js的时候,通过md5或时间戳等方式重新命名静态资源: 然后涉及到的html模板里的src也要做相应的修改,静态资源需要优化(压缩) 文件目录结构 html模板文件 <html> <head> <link rel="stylesheet" href="../styles/one.css"> <link rel="stylesheet" href=&qu

flask前端优化:css/js/html压缩

1.先压缩再传输,可以减少传输的大小,减少传输时间,但是压缩需要时间,所以最终页面显示是快了还是慢了,需要比较 2.先看html压缩模块:pip install Flask-HTMLmin 压缩前:大小1.9M,完成时间1.20s 压缩后:大小1.3M,完成时间2.35s,反而时间更久了 2.再看css压缩和js压缩:pip install cssmin; pip install jsmin

gulp自动化打包及静态文件自动添加版本号

前端自动化打包发布已是一种常态,尤其在移动端,测试过程中静态资源的缓存是件很头疼的事情,有时候明明处理的bug测试还是存在,其实就是缓存惹的祸,手机不比pc浏览器,清理缓存还是有点麻烦的.所以自动化实现静态资源的版本更新才是正道. 实际开发过程中,我们常用到的功能包括: 1.目标路径的清除: 2.静态资源复制到目标路径: 3.css文件的合并与压缩: 4.js文件的合并与压缩: 5.根据文件的变化添加版本号: 第1.2.3.4几个功能倒是很好解决,今天主要说说gulp实现静态资源自动添加版本号:

百度静态资源(JS)公共库

     例如: chosen http://apps.bdimg.com/libs/chosen/1.1.0/chosen.jquery.min.js classlist http://apps.bdimg.com/libs/classlist/2014.01.31/classList.min.js cookies.js http://apps.bdimg.com/libs/Cookies.js/0.4.0/cookies.min.js dojo http://apps.bdimg.com/l

【转载】IIS7.5(经典模式)访问静态资源(.css和.js文件)提示:未能执行 URL

IIS7.5(经典模式)静态资源(.css和.js文件)提示:未能执行 URL “/”应用程序中的服务器错误. 未能执行 URL. 说明: 执行当前 Web 请求期间,出现未处理的异常.请检查堆栈跟踪信息,以了解有关该错误以及代码中导致错误的出处的详细信息. 异常详细信息: System.Web.HttpException: 未能执行 URL. 源错误: 执行当前 Web 请求期间生成了未处理的异常.可以使用下面的异常堆栈跟踪信息确定有关异常原因和发生位置的信息. 堆栈跟踪: [HttpExce

关于WEB-INF目录下的静态资源(js、css、img)的访问

首先,需要明确的是WEB-INF目录是被保护起来的,其下的jsp页面不能直接运行,只能通过控制器跳转来访问:而同样在此目录下的静态资源(js.css.img)也不能被WEB-INF目录外的其他文件直接引用. WEB-INF下的目录结构如图: jsp文件夹下放的是jsp文件,static文件夹下放的是css,js,img等静态资源: 由于jsp文件夹与static文件夹都在WEB-INF目录下,故jsp文件夹下的jsp引入某js可通过相对路径访问: <script src="../stati

前端部署ant+yuicompressor文件压缩+获取版本号+SSH发布(部分代码)

文件压缩: <apply executable="java" parallel="false" failonerror="true" dest="../../release/publish/ecshop" append="false" force="true"> <fileset dir="../../release/publish/ecshop"&

Gulp 自动化你的前端

前端(段子)界的发展突飞猛进,总感觉随时会跟不上技术潮流(其实我已经被甩开了一条街,so sad 选择在这样一个时机发布一篇 gulp 教程并不是我的初衷,第一次用 gulp 是在一年前,而这篇帖子在草稿箱里躺了一个多月,再不发出来说不定就过时了. 当我在用 gulp 时我用它做什么? 编译 sass 合并优化压缩 css 校验压缩 js 优化图片 添加文件指纹(md5) 组件化头部底部(include html) 实时自动刷新… 总之,gulp是前端开发过程中对代码进行自动化构建的利器.它不仅

vue打包后出现静态资源|(图片,json数据)找不到路径

最近在学习Vue是如何编写项目的,在踩了许多坑后,终于要到了最后一步npm run build了,很开心的等待奇迹,然后打包后出现了找不到图片路径的问题. 解决办法:1.将图片或者json数据文件夹放到static的文件夹中,这样打包后webpack会自动打包 2.在build的文件夹下找到utils.js的文件,修改打包后静态资源的路径,添加 publicPath: '../../' 原文地址:https://www.cnblogs.com/klkitty/p/9099472.html