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 ...
随机推荐
- Vue-异步组件
一般情况下,在代码开头引入组件: import Vue from 'vue' import Router from 'vue-router' import Home from '@/pages/hom ...
- WPF: 自动设置Owner的ShowDialog 适用于MVVM
原文:WPF: 自动设置Owner的ShowDialog 适用于MVVM 原文地址:http://www.mgenware.com/blog/?p=339 WPF中的Windows的ShowDialo ...
- Winform开发框架中工作流模块的动态处理
在工作流处理表中,首先我们区分流程模板和流程实例两个部分,这个其实就是类似模板和具体文档的概念,我们一份模板可以创建很多个类似的文档,文档样式结构类似的.同理,流程模板实例为流程实例后,就是具体的一个 ...
- Spring AOP前置通知实例说明AOP相关概念
今天又看了下韩顺平的SpringAOP的讲解,讲解的很透彻.仿照视频自己使用下前置通知. 一.引出问题 有个接口TestServiceInter,有两个实现方法TestService和Test2Ser ...
- 控制结构(4): 局部化(localization)
// 上一篇:状态机(state machine) // 下一篇:必经之地(using) 基于语言提供的基本控制结构,更好地组织和表达程序,需要良好的控制结构. 前情回顾 上一次,我们说到状态机结构( ...
- IdentityServer4【Reference】之Profile Service
Profile Service 当创建令牌或者请求像Userinfo这种端点时,IdentityServer通常会需要用户的标识信息(identity information),默认情况下,Ident ...
- vue mock自己总结
cli安装mock模块 npm install mockjs 创建mock文件夹 配置及创建文件 当后端写好真实接口以后,我们只需删掉创建的mock.js文件和在main.js中导入假数据的那行 ...
- java valueOf()函数
valueOf() 方法用于返回给定参数的原生 Number 对象值,参数可以是原生数据类型, String等. 该方法是静态方法.该方法可以接收两个参数一个是字符串,一个是基数. 语法 该方法有以下 ...
- 【NLP】Conditional Language Models
Language Model estimates the probs that the sequences of words can be a sentence said by a human. Tr ...
- 洛谷P1220关路灯题解
题目 此题是一个状态转移方程还算比较多的一个区间DP,这个题也能启示我们如果某个状态不能够很好地解决问题,那么不妨试试再加一维,而且如果转移顺序不确定的话,可以试试记忆化搜索,说不定就可以比较容易的写 ...