var config = require("./build.config")   //获取build.config.js文件里的内容
var gulp = require("gulp")         //获取gulp模块
var sass = require('gulp-sass'); //gulp-sass模块是用于把sass转成css
var path = require("path")
var babel = require("gulp-babel"); //gulp-babel模块用于把es6转成es5
var postcss = require("gulp-postcss")    //项目中把scss文件转化成css文件
var autoprefixer = require('autoprefixer') //autoprefixer根据当前浏览器的普及度以及属性支持提供给你前缀:
var postasset = require("postcss-assets") //postcss-assets 插件用来处理图片和 SVG。在 CSS 声明中引用图片时,可以使用 resolve 加上图片路径的形式,如“resolve(‘logo.png’)”。https://www.ibm.com/developerworks/cn/web/1604-postcss-css/
var cssnano = require('cssnano') //css文件压缩
var imagemin = require('gulp-imagemin'); //压缩图片文件
var pngquant = require('imagemin-pngquant'); //使用pngquant深度压缩png图片的imagemin插件
var uglify = require('gulp-uglify'); //压缩javascript文件
var cache = require('gulp-cache'); //静态资源缓存
var sourcemaps = require('gulp-sourcemaps'); //简单说,Source map就是一个信息文件,里面储存着位置信息。也就是说,转换后的代码的每一个位置,所对应的转换前的位置
var browserify = require('gulp-browserify');
var changed = require('gulp-changed'); //该插件能够实现只编译或打包改变过文件,大大加快了gulp task的执行速度。
var runSequence = require('run-sequence'); //让gulp任务,可以相互独立,解除任务间的依赖,增强task复用
livereload = require('gulp-livereload'); //不用F5了,实时自动刷新页面来开发
var rev = require('gulp-rev') //对文件加md5后缀
var revCollector = require('gulp-rev-collector'); //文件路径替换
var log = console.log.bind(console);
var prefix = require('gulp-prefix'); //给引用了静态资源的的HTML文件替换引用和加CDN前缀
require('shelljs/global') gulp.task('d', function () {
livereload.listen();
gulp.watch('src/**/*.*', function (file) { //关查src下的所有文件
log("File " + file.path + " changed!");
if (file.path.endsWith(".scss")) { //如果文件后缀是.scss
gulp.run("css")
} else if (file.path.endsWith(".jsx")) { //如果文件后缀是.jsx
gulp.run("js")
} else {
livereload.changed(file.path);
}
})
log(" ***** Watching " + "[crtl+c to stop.] ****** ");
}); gulp.task('r', function (callback) {
rm('-rf', config.distRoot)
runSequence(["js:r", "css:r"], "revCss", "revJs", callback)
});
css()
css(":r")
js()
js(":r")
gulp.task("default", ["r"]); function js(type) {
gulp.task("js" + (type || ""), function () {
var stream = gulp.src(config.jsSrc)
.pipe(changed(config.jsDist))
.pipe(sourcemaps.init())
.pipe(babel({
presets: ['es2015']
}))
.pipe(browserify({
debug: false
}))
if (type == ":r") {
stream = stream.pipe(uglify({compress: {warnings: true}}))
.pipe(sourcemaps.write("./sources_maps"))
.pipe(rev())
.pipe(gulp.dest(config.jsDist))
.pipe(rev.manifest())
.pipe(gulp.dest('./rev/js'))
} else {
stream.pipe(gulp.dest("./src/static/js"))
}
return stream;
});
}
function css(type) {
var processors = [
postasset,
autoprefixer({
browsers: ['last 2 versions', 'Android >= 4.1'],
cascade: true,
remove: true
})
];
var depend = [];
if (type == ":r") { // 如果是打包线上版本
processors.push(cssnano()); 压缩css
depend[] = "img"
}
gulp.task('css' + (type || ""), depend, function () {
var stream = gulp.src(config.cssSrc)
.pipe(changed(config.cssDist))
.pipe(sass())
.pipe(postcss(processors))
//.pipe(rename(function (path) {
// path.extname = ".css"
//})) if (type == ":r") {
stream.pipe(rev())
.pipe(gulp.dest(config.cssDist))
.pipe(rev.manifest())
.pipe(gulp.dest('./rev/css'));
} else {
stream.pipe(gulp.dest("./src/static/css"))
}
});
} gulp.task('img', function () {
gulp.src(config.imgSrc)
.pipe(cache(imagemin({ //缓存压缩图片
progressive: true,
svgoPlugins: [{removeViewBox: false}],
use: [pngquant()]
})))
.pipe(gulp.dest(config.imgDist));
}); gulp.task('revCss', function () {
return gulp.src(['./rev/css/*.json', './src/*.html']) //读取rev下面的.json文件,来替换html里面对应的文件名字
.pipe(revCollector()) //替换html中对应的记录
.pipe(gulp.dest(config.distRoot));
}); gulp.task('revJs', function () {
return gulp.src(['./rev/js/*.json', config.distRoot+"*.html"])
.pipe(revCollector())
.pipe(gulp.dest(config.distRoot));
}); gulp.task('prefix', function(){
gulp.src(config.distRoot+"*.html")
.pipe(prefix(config.cdnUrl, null, '{{'))
.pipe(gulp.dest(config.distRoot));
}); gulp.task('img:clear', function (done) { //清除图片缓存
return cache.clearAll(done);
});

gulpfile.js demo的更多相关文章

  1. 通过Anuglar Material串串学客户端开发 - javascript编译和gulpfile.js

    Angular Material不仅仅有本身框架的源代码,还有在这个框架上实现的一个应用docs.更为强大的是,这个应用是真正的产品网站:就是它的官网.我有理由相信,这个网站是从源代码直接发布的,从网 ...

  2. 基于 Koa.js 平台的 Node.js web 快速开发框架KoaHub.js demo 可安装

    KoaHub.js demo KoaHub.js KoaHub.js -- 基于 Koa.js 平台的 Node.js web 快速开发框架.可以直接在项目里使用 ES6/7(Generator Fu ...

  3. gulp的使用(二)之gulpfile.js文件的配置

    Gulpfile.js是什么文件: gulp是前端开发过程中对代码进行构建的工具,是自动化项目的构建利器:她不仅能对网站资源进行优化,而且在开发过程中很多重复的任务能够使用正确的工具自动完成:使用她, ...

  4. 代码高亮插件——wangHightLighter.js——demo演示

    wangHighLighter.js demo 语言:   主题: 转换   说明: wangHightLighter.js是一个可以将代码高亮显示的javascript小插件,支持常用的20多语言. ...

  5. gulpfile.js不断更新中...

    Gulp压缩合并js/css文件,压缩图片,以及热更新教程 var gulp = require('gulp');var concat = require('gulp-concat');//- 多个文 ...

  6. gulp-load-task 解决 gulpfile.js 过大的问题

    当我们在项目中使用gulp来实现前端自动化时,常常因任务太多导致gulpfile.js越来越臃肿,增加后期维护/变更成本.在计算机科学领域中,分治可以将我们的项目变得井然有序.所以,我们利用这个理念, ...

  7. gulpfile.js文档

    gulp watch 实现监听不仅需要package.json文档,还需要gulpfile.js文档.否则无法实现. 1.gulp的安装 1.1 首先必须先安装node.js.这个可以参考之前的博客& ...

  8. gulp 图片、样式、js、实时刷新等压缩gulpfile.js文件各个模块

    1.压缩tinypng图片   gulp-tinypng-nokey,但不压缩gif格式(另外一个gulp-imagemin压缩率不高,可以压缩gif格式) // 获取 gulp var gulp = ...

  9. 编写gulpfile.js文件:压缩合并css、js

    使用gulp一共有四个步骤: 1. 全局安装 gulp: $ npm install --global gulp 2. 作为项目的开发依赖(devDependencies)安装: $ npm inst ...

随机推荐

  1. Android Button.getWidth()为0的问题

    View在onCreate的时候,没有渲染组件,所以获取到的宽度和高度为0, 需要添加一个观察者,在layout渲染后再去取宽高.代码如下: private Button btn_icon; @Ove ...

  2. PHP之最长回文串

    给定一个字符串 s,找到 s 中最长的回文子串.你可以假设 s 的最大长度为 1000. 示例 1: 输入: "babad"输出: "bab"注意: " ...

  3. C/C++ 公有函数无法返回私有的类对象解决方案

    { 能出这种错的说明还需要提升C++,增强对类的理解 解决方案:把你的私有的对象的私有的拷贝构造或者同类赋值改为公开的 }

  4. 【转载】TCP拥塞控制算法 优缺点 适用环境 性能分析

    [摘要]对多种TCP拥塞控制算法进行简要说明,指出它们的优缺点.以及它们的适用环境. [关键字]TCP拥塞控制算法 优点    缺点   适用环境公平性 公平性 公平性是在发生拥塞时各源端(或同一源端 ...

  5. expect离线安装

    expect5.45.4.tar.gz和tcl8.4.11-src.tar.gz压缩包请前往以下链接下载: https://download.csdn.net/download/gangzi221/1 ...

  6. JavaConfig

    Java Config是Spring的一个子项目,它旨在通过Java类的方式提供Bean的定义信息,是Spring4.0的核心功能   普通的POJO只要标注@Configuration注解,就可以为 ...

  7. 【题解】P1440 均分纸牌

    均分纸牌 题目描述: 有\(N\)堆纸牌,编号分别为\(1,2,-,N\).每堆上有若干张,但纸牌总数必为\(N\)的倍数.可以在任一堆上取若干张纸牌,然后移动. 移牌规则为:在编号为\(1\)堆上取 ...

  8. niginx相关命令及代理配置

    安装 in mac https://www.cnblogs.com/meng1314-shuai/p/8335140.html Nginx相关命令 mac下启动: 通过brew 安装install 后 ...

  9. socket远程执行命令

    两个脚本模拟远程执行命令 cmd_server.py import socket import subprocess # 运行系统命令 sk = socket.socket() addess = (' ...

  10. POJ 2932 平面扫描 /// 判断圆的包含关系

    题目大意: 平面上有n个两两不相交的圆,给定圆的圆心(x,y)和半径 r 求所有最外层的 即 不包含于其他圆内部的圆 挑战258页 平面扫描 记录所有圆的左端和右端 排序后 逐一扫描 将到当前圆为止的 ...