Gulp实战
推荐文章:
gulp.js中文网 : http://www.gulpjs.com.cn/
DBPOO : http://www.dbpoo.com/getting-started-with-gulp/
Ooo_My_God : http://www.ydcss.com/archives/424
w3cplus : http://www.w3cplus.com/blog/tags/511.html
demo截图:
讲一下目录结构:
c\ 文件夹为发布css文件夹(css简写);
i\ 文件夹为发布img文件夹(img简写);
j\ 文件夹为发布js文件夹(js简写);
src\ 生产环境下的文件
config.js 为gulp里路径配置的文件(可不写)
gulpfile.js 为gulp配置文件
package.json node安装配置文件
总文件夹:

生产文件夹:

package.json:

{
"name": "test-gulp2",
"version": "1.0.0",
"description": "",
"main": "index.js",
"scripts": {
"test": "echo \"Error: no test specified\" && exit 1"
},
"author": "uuu",
"license": "ISC",
"devDependencies": {
"gulp": "^3.9.1",
"gulp-autoprefixer": "^3.1.0",
"gulp-concat": "^2.6.0",
"gulp-connect": "^3.2.1",
"gulp-htmlmin": "^1.3.0",
"gulp-imagemin": "^2.4.0",
"gulp-jshint": "^2.0.0",
"gulp-livereload": "^3.8.1",
"gulp-minify-css": "^1.2.4",
"gulp-notify": "^2.2.0",
"gulp-rename": "^1.2.2",
"gulp-rev-append": "^0.1.6",
"gulp-sass": "^2.2.0",
"gulp-uglify": "^1.5.3",
"imagemin-pngquant": "^4.2.2"
}
}
gulpfile.js:
'use strict';
var gulp = require('gulp');
var connect = require('gulp-connect'); //启动服务器:http://localhost:8000/;
var rename = require('gulp-rename'); //改名;
var concat = require('gulp-concat'); //文件合并;
var notify = require('gulp-notify'); //提示;
var config = require('./config.js'); //引入配置文件; var port = config.port;//端口号;
var livereload = require('gulp-livereload'); //刷新浏览器; /* 启动服务器 */
gulp.task('webserver',function(){
connect.server({
port : port,
livereload:true
});
}); //编译Sass compact(编译一行)/compressed(压缩一行);
var sass = require('gulp-sass'); //编译sass;
var minifycss = require('gulp-minify-css');
var autoprefixer = require('gulp-autoprefixer'); //自动补全css3前缀;
gulp.task('sass', function() { var cssSrc = config.css.src,
cssDst = config.css.dist; gulp.src( cssSrc )
.pipe( sass({outputStyle: 'compact'}).on('error', sass.logError) ) //sass输出格式;
.pipe( autoprefixer({browsers: ['last 2 versions', 'Android >= 4.0'],remove:false}) ) //自动添加css3前缀;
.pipe( gulp.dest( cssDst ) )
.pipe(rename({suffix: '.min'})) //改名;
.pipe(minifycss({"compatibility": "ie7"})) // compatibility 保留iehack 如:'*,_';
.pipe( gulp.dest( cssDst ) )
.pipe(notify({ message: 'css task ok' }))
.pipe( livereload({start:true}) );
}); //合并css;
gulp.task('cssmin', function() {
var cssSrc = config.css.src,
cssDst = config.css.dist,
allCss = config.css.dist; /**
* 合并还是自己写这个数组,因为合并有时要有顺序;
*/
gulp.src([cssDst+'index.css',cssDst+'a.css',cssDst+'b.css'])
.pipe(concat('main.all.css'))
.pipe(gulp.dest(cssDst))
.pipe(concat('main.all.min.css'))
.pipe(minifycss({"compatibility": "ie7"}))
.pipe(gulp.dest(cssDst))
}); //合并压缩JS;
var uglify = require('gulp-uglify');
var jshint = require('gulp-jshint'); //提示;
gulp.task('jsmin', function () {
var jsSrc = config.js.src,
jsDst = config.js.dist; gulp.src(jsSrc+'*.js')
.pipe(jshint())
.pipe(jshint.reporter('default')) // 对代码进行报错提示
.pipe(uglify())
.pipe(rename({suffix: '.min'})) //改名;
.pipe(gulp.dest(jsDst));
}); //合并压缩JS;
gulp.task('alljsmin', function () {
var jsSrc = config.js.src,
jsDst = config.js.dist; gulp.src([jsSrc+'index.js',jsSrc+'index2.js'])
.pipe(jshint()) // 进行检查
.pipe(jshint.reporter('default')) // 对代码进行报错提示
.pipe(concat('main.all.js'))
.pipe(gulp.dest(jsDst))
.pipe(uglify())
.pipe(rename({suffix: '.min'})) //改名;
.pipe(gulp.dest(jsDst));
}); //实时监听;
gulp.task('watch',function(){ var cssSrc = config.css.src;
gulp.watch(cssSrc,['sass']);
livereload.listen({start:true}); }); //压缩图片
var imagemin = require('gulp-imagemin'); // 压缩图片 $ npm i -D gulp-imagemin;
var pngquant = require('imagemin-pngquant'); // 压缩图片 $ npm i -D imagemin-pngquant;
gulp.task('img', function(){ var imgSrc = config.img.src,
imgDst = config.img.dist; return gulp.src( imgSrc + '*' )
.pipe(imagemin({
optimizationLevel: 5, //类型:Number 默认:3 取值范围:0-7(优化等级)
progressive: true, //类型:Boolean 默认:false 无损压缩jpg图片
interlaced: true, //类型:Boolean 默认:false 隔行扫描gif进行渲染
multipass: true, //类型:Boolean 默认:false 多次优化svg直到完全优化
svgoPlugins: [
{removeViewBox: false} //不要移除svg的viewbox属性
],
use: [pngquant({quality: '65-80'})] //使用pngquant深度压缩png图片的imagemin插件/quality 压缩的比例最好60-80之间;
}))
.pipe(gulp.dest(imgDst));
}); //添加引入文件版本号,引入文件后边补?rev=@@hash;
//例子:<link rel="stylesheet" href="c/index.css?rev=@@hash">;
var rev = require('gulp-rev-append');
gulp.task('rev', function () {
gulp.src('*.html')
.pipe(rev())
.pipe(gulp.dest(''));
}); //执行的默认事件;
gulp.task('default',function(){
gulp.run('webserver', 'watch', 'sass');
});
config.js(其实这个文件是可以没有的只不过是为了输入输入的路径)
module.exports = {
port : 8000,
css : {
all : '',
src : './src/scss/*.scss', //需要编译的scss;
dist : './c/', //输出的scss;
},
img : {
src : './src/img/',
dist : './i/'
},
js : {
src : './src/js/',
dist : './j/'
},
html : {
src : '',
dist : ''
}
}
启动服务:
CMD输入:gulp(默认启动服务器,监听watch)同时编译一遍sass文件

启动服务:

同步刷新需要chrome上的LiveReload插件在配置gulp-connect;
同时c文件夹下的css生成了:

这是开发完成在做合并文件工作:
CMD输入:gulp cssmin


压缩合并js
CMD输入:gulp jsmin gulp alljsmin

生产环境:src\js:

发布环境:j:

图片压缩:
CMD输入:gulp img

生产环境:src\img:

发布环境:i:

后记:
首先你要安装node.js
然后在装 gulp 和一些列 gulp-XXX的插件
截图上的编译时间对不上是因为有的之前截图好的有的是写的文章的时候后补的截图;
写个技术书名梗:
翻译API的都叫《XXX权威指南》
写Demo的都叫《XXX实战》
有点自己理解的都叫《XXX深入浅出》
API+Demo的都叫《XXX高级编程》
地摊卖的都叫《21天学会XXX》
Gulp实战的更多相关文章
- 前端构建大法 Gulp 系列 (四):gulp实战
前端构建大法 Gulp 系列 (一):为什么需要前端构建 前端构建大法 Gulp 系列 (二):为什么选择gulp 前端构建大法 Gulp 系列 (三):gulp的4个API 让你成为gulp专家 前 ...
- Gulp实战和原理解析
Gulp实战和原理解析(以weui作为项目实例)http://i5ting.github.io/stuq-gulp/
- 1-1 gulp 实战
npm install gulp-htmlmin gulp-imagemin imagemin-pngcrush gulp-minify-css gulp-jshint gulp-uglify gul ...
- Gulp实战(二)
一.配置环境 1.基于NodeJs安装Git,npm,gulp 2.安装各类插件 3.参考文档 http://www.tuicool.com/articles/UbaqyyJ http://www.t ...
- 前端构建大法 Gulp 系列 (三):gulp的4个API 让你成为gulp专家
系列目录 前端构建大法 Gulp 系列 (一):为什么需要前端构建 前端构建大法 Gulp 系列 (二):为什么选择gulp 前端构建大法 Gulp 系列 (三):gulp的4个API 让你成为gul ...
- 前端构建大法 Gulp 系列 (二):为什么选择gulp
系列目录 前端构建大法 Gulp 系列 (一):为什么需要前端构建 前端构建大法 Gulp 系列 (二):为什么选择gulp 前端构建大法 Gulp 系列 (三):gulp的4个API 让你成为gul ...
- 前端构建大法 Gulp 系列 (一):为什么需要前端构建
系列目录 前端构建大法 Gulp 系列 (一):为什么需要前端构建 前端构建大法 Gulp 系列 (二):为什么选择gulp 前端构建大法 Gulp 系列 (三):gulp的4个API 让你成为gul ...
- 教你写gulp plugin
前端开发近两年工程化大幅飙升.随着Nodejs大放异彩,静态文件处理不再需要其他语言辅助.主要的两大工具即为基于文件的grunt,基于流的gulp.简单来说,如果需要的只是文件处理,gulp绝对首选. ...
- 前端构建大法 Gulp 系列
参考: 前端构建大法 Gulp 系列 (一):为什么需要前端构建 前端构建大法 Gulp 系列 (二):为什么选择gulp 前端构建大法 Gulp 系列 (三):gulp的4个API 让你成为gulp ...
随机推荐
- HTML文字与列表
文字内容 添加文字 <body> 我是Mingle </body> HTML文字的需要添加在<body> </body>里面. 标题字 标题字就是以几种 ...
- SQL中ON和WHERE的区别
SQL中ON和WHERE的区别 - 邃蓝星空 - 博客园 https://www.cnblogs.com/guanshan/articles/guan062.html
- 求100之内的素质并输出(最优算法)-PHP面试题
曾经第一次面试题中的题目, 今天碰巧看到整理一下 当时用了最基本的算法写出来了, 两个for循环, 一个一个取余, 是质数就放进结果数组中 代码如下, 检查代码运行时间的代码是来对比三种不同算法的优劣 ...
- Win10 登陆密码不正确(安全模式仍然启动不了)
今天朋友重启Win10后,登陆密码显示不正确,是用了很多方法都不行 然后就瞎捣鼓就进去 进入BIOS将启动模式调为USB模式 重启启动不了后 再改回系统启动 就进去了(好神奇)
- 微信小程序开发编程手记20190303
三元表达式: 运算: 引号与花括号之间如果有空格,将被视为字符串: pages页面容器标签: vscode:
- python中self和cls的区别
1.self表示一个具体的实例本身.如果用了staticmethod,那么就可以无视这个self,将这个方法当成一个普通的函数使用. 2.cls表示这个类本身. >>> class ...
- 自己实现ArrayList与LinkedList类
ArrayList与LinkedList的底层实现 ArrayList内部由数组实现,LinkedList内部由链表实现. 自己动手实现ArrayList与LinkedList中一些常用方法 Arra ...
- 第六十九天 dom与bom
1.节点 dom与bom属 // DOM:文档对象模型 =>提高给用户操作document obj的标准接口 // DOM:以document为根,树状展开所有子节点 节点分类 // 节点分类: ...
- 【XSY2887】【GDOI2018】小学生图论题 分治FFT 多项式exp
题目描述 在一个 \(n\) 个点的有向图中,编号从 \(1\) 到 \(n\),任意两个点之间都有且仅有一条有向边.现在已知一些单向的简单路径(路径上任意两点各不相同),例如 \(2\to 4\to ...
- ajax 跨域 springboot
CORS 定义 Cross-Origin Resource Sharing(CORS)跨来源资源共享是一份浏览器技术的规范,提供了 Web 服务从不同域传来沙盒脚本的方法,以避开浏览器的同源策略,是 ...