gulp实现打包js/css/img/html文件,并对js/css/img文件加上版本号

参考打包教程:

http://www.cnblogs.com/tugenhua0707/p/4069769.html

http://www.cnblogs.com/tugenhua0707/p/4982646.html

http://www.tuicool.com/articles/viequay

实现要点:

1、如何运行gulp的任务,加入新建好一个如下任务:

// 语法检查
gulp.task(‘jshint‘, function () {
    gulp.src(‘js/**/*.js‘)
        .pipe(jshint())
        .pipe(jshint.reporter(‘default‘));
});

那么在命令行上运行:gulp jshint

2、为什么安装了全局还要安装本地,参考这个:http://www.cnblogs.com/EasonJim/p/6207201.html

3、对于npm的命令详解,参考这个:http://www.cnblogs.com/EasonJim/p/6206179.html

以下为我项目上的一个打包配置文件,如下:

(注意:这个没有解决同步执行问题)

var gulp = require(‘gulp‘);//gulp主组件
var htmlmin = require(‘gulp-htmlmin‘);//html压缩组件
var jshint = require(‘gulp-jshint‘);//js语法检查
var concat = require(‘gulp-concat‘);//多个文件合并为一个
var minifyCss = require(‘gulp-minify-css‘);//压缩CSS为一行;
var uglify = require(‘gulp-uglify‘);//js文件压缩
var del = require(‘del‘);//文件删除
var rev = require(‘gulp-rev‘);//对文件名加MD5后缀
var revCollector = require(‘gulp-rev-collector‘);//路径替换
var gulpRemoveHtml = require(‘gulp-remove-html‘);//标签清除,参考:https://www.npmjs.com/package/gulp-remove-html
var removeEmptyLines = require(‘gulp-remove-empty-lines‘);//清除空白行,参考:https://www.npmjs.com/package/gulp-remove-empty-lines
var replace = require(‘gulp-replace‘);//文件名替换,参考:https://www.npmjs.com/package/gulp-replace

var buildBasePath = ‘build/‘;//构建输出的目录

// 语法检查
gulp.task(‘jshint‘, function () {
    gulp.src(‘js/**/*.js‘)
        .pipe(jshint())
        .pipe(jshint.reporter(‘default‘));
});

//删除Build文件
gulp.task(‘clean:Build‘, function () {
    del([
        buildBasePath+‘**/*‘,
    ]);
});

//复制文件夹
gulp.task(‘copy‘,  function() {
    gulp.src(‘plugins/**/*‘)
        .pipe(gulp.dest(buildBasePath+‘plugins‘));
});
gulp.task(‘copyimg‘,  function() {
    //如果下面执行了md5资源文件img,那么这步可以省略
    gulp.src(‘img/**/*‘)
        .pipe(gulp.dest(buildBasePath+‘img‘));
});

//合并js,css文件之后压缩代码
//js
gulp.task(‘minifyjs‘, function(){
    gulp.src(‘js/**/*.js‘)
        .pipe(concat(‘build.js‘))//合成到一个js
        .pipe(gulp.dest(buildBasePath+‘js‘))//输出到js目录
        .pipe(uglify())//压缩js到一行
        .pipe(concat(‘build.min.js‘))//压缩后的js
        .pipe(gulp.dest(buildBasePath+‘js‘));//输出到js目录
});
//jsmd5,压缩后并用md5进行命名,下面使用revCollector进行路径替换
gulp.task(‘minifyjsmd5‘, function() {
    gulp.src(‘js/**/*.js‘)
        .pipe(concat(‘build.min.js‘))//压缩后的js
        .pipe(uglify())//压缩js到一行
        .pipe(rev())//文件名加MD5后缀
        .pipe(gulp.dest(buildBasePath+‘js‘))//输出到js目录
        .pipe(rev.manifest(‘rev-js-manifest.json‘))////生成一个rev-manifest.json
        .pipe(gulp.dest(‘rev‘));//将 rev-manifest.json 保存到 rev 目录内
});
//css
gulp.task(‘minifycss‘, function (){
    gulp.src(‘css/**/*.css‘)
        .pipe(concat(‘build.css‘))//合成到一个css
        .pipe(gulp.dest(buildBasePath+‘css‘))//输出到css目录
        .pipe(minifyCss())//压缩css到一样
        .pipe(concat(‘build.min.css‘))//压缩后的css
        .pipe(gulp.dest(buildBasePath+‘css‘));//输出到css目录
});
//cssmd5,压缩后并用md5进行命名,下面使用revCollector进行路径替换
gulp.task(‘minifycssmd5‘, function (){
    gulp.src(‘css/**/*.css‘)
        .pipe(concat(‘build.min.css‘))//压缩后的css
        .pipe(minifyCss())//压缩css到一样
        .pipe(rev())//文件名加MD5后缀
        .pipe(gulp.dest(buildBasePath+‘css‘))//输出到css目录
        .pipe(rev.manifest(‘rev-css-manifest.json‘))//生成一个rev-manifest.json
        .pipe(gulp.dest(‘rev‘));//将 rev-manifest.json 保存到 rev 目录内
});
//imgmd5,压缩后并用md5进行命名,下面使用revCollector进行路径替换
gulp.task(‘minifyimgmd5‘, function (){
    gulp.src([‘img/**/*.jpg‘,‘img/**/*.png‘])
        .pipe(rev())//文件名加MD5后缀
        .pipe(gulp.dest(buildBasePath+‘img‘))//输出到css目录
        .pipe(rev.manifest(‘rev-img-manifest.json‘))//生成一个rev-manifest.json
        .pipe(gulp.dest(‘rev‘));//将 rev-manifest.json 保存到 rev 目录内
});

//html压缩
gulp.task(‘html‘,function(){
    var options = {
        removeComments: true,//清除HTML注释
        collapseWhitespace: false,//压缩HTML
        collapseBooleanAttributes: 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
    };
    gulp.src(‘*.html‘)
        .pipe(gulpRemoveHtml())//清除特定标签
        .pipe(removeEmptyLines({removeComments: true}))//清除空白行
        .pipe(htmlmin(options))
        .pipe(gulp.dest(buildBasePath));
});

//生产使用,替换文件名,common.js替换为build.min.js
gulp.task(‘replacejs‘, function(){
    gulp.src([buildBasePath+‘*.html‘])
        .pipe(replace(‘common.js‘, ‘build.min.js‘))
        .pipe(gulp.dest(buildBasePath));
});
//生产使用,替换文件名,common.css替换为build.min.css
gulp.task(‘replacecss‘, function(){
    gulp.src([buildBasePath+‘*.html‘])
        .pipe(replace(‘common.css‘, ‘build.min.css‘))
        .pipe(gulp.dest(buildBasePath));
});
//开发使用,替换文件名,common.js替换为build.js
gulp.task(‘replacejsdev‘, function(){
    gulp.src([buildBasePath+‘*.html‘])
        .pipe(replace(‘common.js‘, ‘build.js‘))
        .pipe(gulp.dest(buildBasePath));
});
//开发使用,替换文件名,common.css替换为build.css
gulp.task(‘replacecssdev‘, function(){
    gulp.src([buildBasePath+‘*.html‘])
        .pipe(replace(‘common.css‘, ‘build.css‘))
        .pipe(gulp.dest(buildBasePath));
});

//使用rev替换成md5文件名,这里包括html和css的资源文件也一起
gulp.task(‘rev‘, function() {
    //html,针对js,css,img
    gulp.src([‘rev/**/*.json‘, buildBasePath+‘**/*.html‘])
        .pipe(revCollector({replaceReved:true }))
        .pipe(gulp.dest(buildBasePath));
});
gulp.task(‘revimg‘, function() {
    //css,主要是针对img替换
    gulp.src([‘rev/**/rev-img-manifest.json‘, buildBasePath+‘css/*.css‘])
        .pipe(revCollector({replaceReved:true }))
        .pipe(gulp.dest(buildBasePath+‘css‘));
});

//监视文件的变化,有修改时,自动调用default缺省默认任务
gulp.task(‘watch‘, function () {
    gulp.watch(‘**/*.html‘, [‘default‘]);
});

//缺省默认任务,输出的js和css文件都带参数
/*执行顺序:
* 1、清除编译输出目录build的全部文件
* 2、复制第三方组件依赖到build文件夹
* 3、使用带md5对js文件进行压缩打包一个文件,命名根据gulp-rev插件md5之后的命名进行命名,如build-asdf123.min.js,并输出到build/js文件夹
* 4、使用带md5对cs文件进行压缩打包一个文件,命名根据gulp-rev插件md5之后的命名进行命名,如build-asd323.min.css,并输出到build/cs文件夹
* 5、(可选)使用带md5对img文件夹的全部文件进行重命名,命名根据gulp-rev插件md5之后的命名进行命名,如common-asdf123.jpg,并输出到build/img文件夹;如果这部不操作,下面第10步将不执行。
* 6、将build目录下的全部html页面进行压缩处理,采用gulp-minhtml插进
* 7、由于项目上使用了模块开发,然后每个页面上都会引入common.js文件,而合并后的js文件为build.min.js,所以使用gulp-replace插进对html页面进行替换,并将html文件输出到build目录上
* 8、再次在build目录上,将html进行common.css文件替换成build.min.css
* 9、使用gulp-rev-collectorc插件对刚才生成带参数的js和css文件在html页面上进行替换,如build.min.js替换成build-asdf123.min.js。还是输出到build目录。
* 10、(可选)使用gulp-rev-collectorc插件对刚才生成带参数的img文件在css文件上进行替换,如common.jpg替换成common-asdf12.jpg。输出到目录
* */
gulp.task(‘default‘,[‘clean:Build‘,‘copy‘,‘minifyjsmd5‘,‘minifycssmd5‘,‘minifyimgmd5‘,‘replacejs‘,‘replacecss‘,‘html‘,‘rev‘,‘revimg‘]);
//默认任务2,输出的js和css文件不带参数
/*执行顺序:
 * 1、清除编译输出目录build的全部文件
 * 2、复制第三方组件依赖到build文件夹
 * 3、对js文件进行压缩打包一个文件,命名如build.min.js,并输出到build/js文件夹
 * 4、对cs文件进行压缩打包一个文件,命名如build.min.css,并输出到build/cs文件夹
 * 5、将build目录下的全部html页面进行压缩处理,采用gulp-minhtml插进
 * 6、由于项目上使用了模块开发,然后每个页面上都会引入common.js文件,而合并后的js文件为build.min.js,所以使用gulp-replace插进对html页面进行替换,并将html文件输出到build目录上
 * 7、再次在build目录上,将html进行common.css文件替换成build.min.css
 * */
gulp.task(‘default2‘, [‘clean:Build‘,‘copy‘,‘copyimg‘,‘minifyjs‘,‘minifycss‘,‘replacejs‘,‘replacecss‘,‘html‘]);
//开发使用默认任务,js和css不带参数,且不合并
/*执行顺序:
 * 1、清除编译输出目录build的全部文件
 * 2、复制第三方组件依赖到build文件夹
 * 3、对js文件进行压缩打包一个文件,命名如build.js,并输出到build/js文件夹
 * 4、对cs文件进行压缩打包一个文件,命名如build.css,并输出到build/cs文件夹
 * 5、将build目录下的全部html页面进行压缩处理,采用gulp-minhtml插进
 * 6、由于项目上使用了模块开发,然后每个页面上都会引入common.js文件,而合并后的js文件为build.js,所以使用gulp-replace插进对html页面进行替换,并将html文件输出到build目录上
 * 7、再次在build目录上,将html进行common.css文件替换成build.css
 * */
gulp.task(‘defaultdev‘, [‘clean:Build‘,‘copy‘,‘copyimg‘,‘minifyjs‘,‘minifycss‘,‘replacejsdev‘,‘replacecssdev‘,‘html‘]);

但是很纠结的一个问题,我这样去执行默认任务:gulp,发现没有按顺序执行。

下载将改写上面的配置,加入同步顺序执行。

时间: 2024-11-10 18:01:15

gulp实现打包js/css/img/html文件,并对js/css/img文件加上版本号的相关文章

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

现在正在做的项目更新迭代比较频繁,会经常对前端代码打包部署,手动整合代码文件很麻烦并且浪费时间,所以决定使用gulp来代替手工完成这项工作. 前端静态资源在发版更新时会面临客户端浏览器缓存的问题(可参考这篇文章),解决这个问题可以采用两类方法:覆盖方法(引用资源时加版本号,不修改资源文件名).非覆盖方法(修改资源文件名),本篇文章主要采用的是第一种加版本号的方式,主要用gulp给静态资源自动加版本号和压缩CSS.JS. 原理:通过对JS,CSS文件内容进行Hash运算,生成一个文件的唯一Hash

iOS项目中如何正确引入Html5文件(html/js/css)

iOS项目中使用项目中的html js css 文件时,有时会遇到引用路径出错的问题,导致html js css image文件无法加载的情况. 那么,引入H5相关文件的正确操作方式如下,这样就不会出现资源文件无法引入并正常使用的情况: 1 在项目目录下创建存放Html5文件文件夹:H5 2 将文件夹H5拖放至项目中对应的位置,此处注意要选择:Create groups 3 将各种Html5文件(html js css image等)拖放到H5文件夹中,此处注意选择:Create folder

Node.js完整的响应html页面(包括css,js文件)

主要思想就是任何一个静态文件也应该做响应,一个获取静态文件都应当请求来处理,这是主要思想. 同时要注意两点.第一,对于不同的文件类型,比如html,css,js,请求头里面的文件类型需要根据不同的文件类型注明, 第二,文件的路径需要表达准确,fs.readFile方法的第一个参数path是已起服务的文件为根目录,这里就是以server.js文件的所在目录为根目录 文件目录 文件夹public Index.html Css文件夹 Reset.css Index.css Js文件夹 vue.min.

nodejs分离html文件里面的js和css

摘要: 本文要实现的内容,使用nodejs 对文件的增删改查,演示的例子->分离出一个html 文件里面的script 和style 里面的内容,然后单独生成js文件和css 文件.中间处理异步的api->async/await , Promise 项目托管:extract-js-css , 欢迎star 直接上代码: // import fs from 'fs' var fs = require('fs') // import csscomb from 'csscomb' // var cs

[js高手之路]深入浅出webpack教程系列2-配置文件webpack.config.js详解

接着上文,重新在webpack文件夹下面新建一个项目文件夹demo2,然后用npm init --yes初始化项目的package.json配置文件,然后安装webpack( npm install [email protected] --save-dev ),然后创建基本的项目文件夹结构,好了,我们的又一个基本项目结构就搭建好了. 第一.开始通过webpack.config.js文件配置我们的webpack项目 首先在项目文件夹demo2下面,新建一个webpack.config.js文件,这

[js高手之路]深入浅出webpack教程系列3-配置文件webpack.config.js详解(下)

本文继续接着上文,继续写下webpack.config.js的其他配置用法. 一.把两个文件打包成一个,entry怎么配置? 在上文中的webpack.dev.config.js中,用数组配置entry webpack.dev.config.js文件代码: 1 console.log( __dirname ); //D:\ghostWu\bak\webpack\demo2 2 module.exports = { 3 entry : ['./src/js/main.js', './src/js/

文件打包,下载之使用PHP自带的ZipArchive压缩文件并下载打包好的文件

总结: 使用PHP下载文件的操作需要给出四个header(),可以参考我的另一篇博文:PHP如何实现下载功能超详细流程分析 计算文件的大小的时候,并不需要先打开文件,通过filesize($filename)就可以看出,如果需要先打开文件的话,filesize可能就会是这样的形式了filesize($filehandle) 向客户端回送数据的是,记得要设置一个buffer,用来指定每次向客户端输出多少数据,如:$buffer=1023.如果不指定的话,就会将整个文件全部写入内存当中,再一次性的讲

在IIS上新发布的网站,样式与js资源文件加载不到(资源文件和网页同一个域名下)

在IIS上新发布的网站,网站能打开,但样式与js资源文件加载不到(资源文件和网页是同一个域名下,例如:网页www.xxx.com/index.aspx,图片www.xxx.com/pic.png). 然后单独打开资源文件(例如打开图片的链接)是,报错: 这个问题应该是web.config配置文件的设置问题. 在配置文件的<httpHandlers>下的节点,对应的资源文件的type值设置可能是“System.Web.DefaultHttpHandler”值(默认),例如: <httpHa

js相对路径相关(比如:js中的路径依赖导入该js文件的路径)

问题描述: 前几天调用同事的js接口文件,在他自己的html测试页面ok,在我这边调用时出现问题. debug过程中,将该测试html移到其他位置都不行,放到原html测试页面同层次路径下是OK的. 解决过程: 很疑问啊,用F12调试下,在调用的js中,发现xmlhttp.status返回状态是404,靠,原来是找不到文件. 仔细看了下,在js中看到如下代码:[var requestURL = "../servlet/ajaxServlet.jsp";]坑爆了, 模糊记得js中引用路径