gulp项目案例——js、css压缩并添加MD5戳
使用gulp要结合当前的项目架构做一定的处理,以实现自己想要的效果。
项目目录大概:
webapp
lib
lar-ui
page
folder1
index.css
index.html
index.js
folder2
index.css
index.html
index.js
gulpfile.js
先罗列一下使用到的插件:
1.gulp-load-plugins (自动加载package.json中的插件)
2.gulp-clean (清除)
3.gulp-clean-css (压缩css)
4.gulp-uglify (压缩js)
5.gulp-rev (生成MD5戳)
6.gulp-rev-collector (将html文件中的js、css替换成带有MD5戳的文件)
7.run-sequence (进行排序)
8.through2 (根据需求自定义插件)
上代码:
//加载gulp模块 var gulp = require('gulp'); //自动加载插件,能自动加载package.json里的插件,省去繁琐的定义 var plugins = require('gulp-load-plugins')(); //加载run-sequence模块,按照顺序执行 var runSequence = require('run-sequence'); //加载through2模块 var through2 = require('through2'); //定义路径对象,方便调取
var paths = {
webapp : './',
rev : './rev',
rev_js: './rev/js',
rev_css: './rev/css',
page: './page',
node_modules_js:'./node_modules_js/**/*.js',
node_modules_css:'./node_modules_css/**/*.css',
gulpfile_js:'./gulpfile.js',
src_js : './**/*.js',
src_css: './**/*.css',
src_html:'./page/**/*.html',
del_js: './**/*-*.js',
del_css:'./**/*-*.css',
rev_json:'./rev/**/*.json'
}
/** * 自定义插件方法,修改rev.json文件内容 */ function modify(modifier) { return through2.obj(function(file,encoding, done) { var content = modifier(String(file.contents)); file.contents = new Buffer(content); this.push(file); done(); }); } /** * 删除字段 * @param data json文件里的内容 * @returns {XML|string} */ function replaceSuffix(data) { return data .replace(/page\//gmi,"") } /** * 删除字段,让路径统一 */ gulp.task("replaceSuffix",function (cb) { gulp.src([paths.rev_json]) //删除多余的字段,统一路径 .pipe(modify(replaceSuffix)) .pipe(gulp.dest(paths.rev)) .on('end', cb); }); /** * 删除掉上一次构建时创建的资源 */ gulp.task('clean',function () { return gulp.src([ paths.rev_json, paths.del_js, paths.del_css ]).pipe(plugins.clean()); }); /** * 压缩js,生成时间戳 */ gulp.task('uglifyJs',function(){ return gulp.src([paths.src_js,'!'+paths.node_modules_js,'!'+paths.gulpfile_js],{read:true}) //压缩js .pipe(plugins.uglify()) //生成MD5 .pipe(plugins.rev()) //输出压缩生成时间戳后的js文件 .pipe(gulp.dest(paths.webapp)) //生成rev.json文件 .pipe(plugins.rev.manifest({merge:true})) //输出json文件 .pipe(gulp.dest(paths.rev_js)); }); /** * 压缩css,生成时间戳 */ gulp.task('minifyCss',function(){ return gulp.src([paths.src_css,'!'+paths.node_modules_css],{read:true}) //压缩css .pipe(plugins.cleanCss()) //生成MD5戳 .pipe(plugins.rev()) //输出压缩生成时间戳后的css文件 .pipe(gulp.dest(paths.webapp)) //生成rev.json文件 .pipe(plugins.rev.manifest({merge:true})) //输出json文件 .pipe(gulp.dest(paths.rev_css)); }); /** * 替换文件 */ gulp.task('pagePath',function(){ return gulp.src([paths.rev_json,paths.src_html]) //将html文件中的js,css文件替换成压缩生成MD5戳的js、css文件 .pipe(plugins.revCollector()) //输出路径 .pipe(gulp.dest(paths.page)); }); /** * 总入口 */ gulp.task('default',function(){ runSequence( 'clean', ['uglifyJs','minifyCss'], 'replaceSuffix', 'pagePath' ); });
这个项目中遇到的问题在于全局压缩后带有MD5戳的js,css路径都带有上一级(即html中引入的是index.css,带有时间戳的路径是page/index-sdkfjdie102.css),导致替换文件时出错,解决办法就是这段代码:
/** * 自定义插件方法,修改rev.json文件内容 */ function modify(modifier) { return through2.obj(function(file,encoding, done) { var content = modifier(String(file.contents)); file.contents = new Buffer(content); this.push(file); done(); }); }
这里用through2插件自定义另一个替换文件的插件,改变rev的json文件内容,使路径统一,最后使用run-sequence插件让期按指定的顺序执行。因为这个项目里html里的js,css文件都是同级目录应用,经过处理的json文件里会有同名不同戳的文件出现,导致后面的文件覆盖前面的文件
{ "index": "index-c144065c18", "index": "index-a78095c25b" }
如果项目中html中引入js、css方式是绝对路径,可以不作处理。如果跟我一样的话,解决方法看 gulp配合fs插件与path插件实现遍历目录得到子目录。
- Web项目发布 采用gulp压缩 JS CSS CSHTML ASPX HTML Image 给JS CSS自动添加版本号 强制浏览器刷新缓存
- Maven JavaWEB项目使用Gulp自动构建js和css实现代码压缩、版本后缀
- gulp插件构建项目 压缩js、css、image、zip、web服务、跨域等插件
- 利用gulp对项目html,js,css,图片进行压缩
- 在项目中使用gulp压缩css和js
- Gulp学习--压缩js,css,img
- gulp 实现 js、css,img 合并和压缩(转)
- 一个自动化添加 js css 的版本号和压缩js css的 maven 插件 jcv-maven-plugin
- 使用gulp压缩js,css
- .net对js和css、img剥离项目进行压缩优化、cdn加速
- 使用gulp对js、css、img进行合并压缩
- gulp 整合、压缩js、css代码
- gulp入门-压缩js/css文件(windows)
- 实际项目中,为什么多个css、js文件要实现合并与压缩?(了解了这你才算入门)
- 结合YUI Compressor在WebStrom添加Watcher实现编辑js(css)文件时自动压缩(包括自定义监听范围Scope)
- gulp,css压缩,js压缩,css加密,js加密
- 前端静态资源版本更新与缓存之——通过gulp 在原html文件上自动化添加js、css版本号
- Maven项目中压缩js和Css代码
- gulp less编译css压缩和js压缩别名输出
- gulp 实现 js、css,img 合并和压缩