Gulp真实项目用例
包括了less预编译,css压缩,html文件include引入,js混淆压缩,本地开发热刷新服务器,html压缩,版本号添加
github地址:
gulpfile.js
var gulp = require('gulp'), //基础库
imagemin = require('gulp-imagemin'), //图片压缩
less = require('gulp-less'), // less
minifycss = require('gulp-minify-css'), //css压缩
fileinclude = require('gulp-file-include'), // 文件包含
//jshint = require('gulp-jshint'), //js检查
uglify = require('gulp-uglify'), //js压缩
rename = require('gulp-rename'), //重命名
//concat = require('gulp-concat'), //合并文件
//clean = require('gulp-clean'), //清空文件夹
notify = require('gulp-notify'), // 信息提示
plumber = require('gulp-plumber'),
connect = require('gulp-connect'), //本地开发web服务器,包括实时刷新
rev = require('gulp-rev'),
revCollector = require('gulp-rev-collector'),
revReplace = require('gulp-rev-replace'),
minifyHTML = require('gulp-minify-html'); var devDir = 'dist'; /** less编译 **/
gulp.task('less', function () {
gulp.src('./src/less/mspei.less')
.pipe(less())
//.pipe(rename({ suffix: '.min' }))
//.pipe(minifycss())
.pipe(gulp.dest('./'+devDir+'/css/'));
}); /** js **/
gulp.task('js', function () {
gulp.src(['./src/js/**/*'])
.pipe(gulp.dest('./'+devDir+'/js/'));
}); /** 通用文件包含 **/
gulp.task('fileinclude', function() {
gulp.src(['./src/views/**/*.html', '!./src/views/include/**.html'])
.pipe(fileinclude({
prefix: '@@',
basepath: '@file'
}))
.pipe(gulp.dest('./'+devDir+'/'));
}); /** 图片处理 **/
gulp.task('images', function () {
gulp.src(['./src/images/**/*'])
.pipe(gulp.dest('./'+devDir+'/images/'));
}); /** 字体图标 **/
gulp.task('fonts', function () {
gulp.src(['./src/fonts/**/*'])
.pipe(gulp.dest('./'+devDir+'/fonts/'));
}); /** 使用connect启动一个Web服务器 **/
gulp.task('connect', function () {
connect.server({
root: './'+devDir+'/',
livereload: true
});
}); /** 刷新页面 **/
gulp.task('reload', function () {
gulp.src('./'+devDir+'/**/*.html')
.pipe(connect.reload());
}); /** 监测文件变动,设置自动执行的任务 **/
gulp.task('watch', function () {
gulp.watch('./src/less/**/*.less', ['less', 'reload']); // 当所有less文件发生改变时,调用less任务
gulp.watch('./src/js/**/*.js', ['js', 'reload']); // 当所有js文件发生改变时,调用js任务
gulp.watch('./src/views/**/*.html', ['fileinclude', 'reload']); // 当所有模板文件变化时,重新生成生成页面到根目录
gulp.watch('./src/images/**/*', ['images']); // 监听images
}); /** 开发时,运行 'gulp dev' **/
gulp.task('dev', ['connect', 'less', 'js', 'fileinclude', 'images', 'fonts', 'reload', 'watch']); /*****************************************************************
* dist版本,压缩版
****************************************************************/
/** less编译 **/
gulp.task('lessDist', function () {
gulp.src('./src/less/mspei.less')
.pipe(less())
//.pipe(rename({ suffix: '.min' }))
.pipe(minifycss())
.pipe(rev())
.pipe(gulp.dest('./dist/css/'))
.pipe(rev.manifest())
.pipe(gulp.dest('./src/rev/css'));
}); /** js **/
gulp.task('jsDist', function () {
gulp.src(['./src/js/**/*', '!./src/js/**/*.js'])
.pipe(gulp.dest('./dist/js'));
gulp.src(['./src/js/**/*.js'])
.pipe(uglify({
mangle: {except: ['require', 'exports', 'module', '$']}
}))
.pipe(rev())
.pipe(gulp.dest('./dist/js/'))
.pipe(rev.manifest())
.pipe(gulp.dest('./src/rev/js'));
}); /** 通用文件包含 **/
gulp.task('fileincludeDist', function() {
gulp.src(['./src/views/**/*.html', '!./src/views/include/*.html'])
.pipe(fileinclude({
prefix: '@@',
basepath: '@file'
}))
.pipe(gulp.dest('./dist/'));
}); /** 图片处理 **/
gulp.task('imagesDist', function () {
gulp.src(['./src/images/**/*'])
.pipe(gulp.dest('./dist/images/'));
}); /** 字体图标 **/
gulp.task('fontsDist', function () {
gulp.src(['./src/fonts/**/*'])
.pipe(gulp.dest('./dist/fonts/'));
}); gulp.task('commonRev', function () {
return gulp.src(['src/rev/**/*.json', 'dist/**/*.html'])
.pipe( revCollector({
replaceReved: true,
dirReplacements: {
'css': 'css',
'js': 'js',
//'cdn/': function(manifest_value) {
// return '//cdn' + (Math.floor(Math.random() * 9) + 1) + '.' + 'exsample.dot' + '/img/' + manifest_value;
//}
}
}) )
.pipe( minifyHTML({
empty:true,
spare:true
}) )
.pipe( gulp.dest('dist') );
}); //处理seajs脚本的模块引用
gulp.task("seaRev", function() {
var jsManifest = gulp.src('./src/rev/js/*.json'); return gulp.src(["src/js/config.js"], {
base: "src/js"
})
.pipe(revReplace({
manifest: jsManifest
}))
.pipe(rev())
.pipe(gulp.dest("dist/js"))
.pipe(rev.manifest("rev-manifest-seajs.json", {
merge: true
}))
.pipe(gulp.dest("src/rev/js"));
}); /** 发布时,运行 'gulp dist' **/
/** 需版本号,再运行 'gulp rev' **/
gulp.task('dist', ['lessDist', 'jsDist', 'fileincludeDist', 'imagesDist', 'fontsDist']);
gulp.task('rev', ['commonRev', 'seaRev']);
package.json
{
"name": "mspei_front",
"version": "1.0.0",
"description": "",
"main": "index.js",
"devDependencies": {
"gulp": "^3.9.1",
"gulp-asset-rev": "^0.0.15",
"gulp-connect": "^4.1.0",
"gulp-file-include": "^0.13.7",
"gulp-imagemin": "^3.0.1",
"gulp-less": "^3.1.0",
"gulp-livereload": "^3.8.1",
"gulp-minify-css": "^1.2.4",
"gulp-notify": "^2.2.0",
"gulp-plumber": "^1.1.0",
"gulp-rename": "^1.2.2",
"gulp-rev": "^7.1.2",
"gulp-rev-collector": "^1.0.5",
"gulp-uglify": "^2.0.0",
"gulp-rev-replace": "^0.4.3",
"gulp-minify-html": "^1.0.6"
},
"scripts": {
"test": "echo \"Error: no test specified\" && exit 1"
},
"author": "nuanfeng",
"license": "ISC"
}
Gulp真实项目用例的更多相关文章
- iOS -数据持久化方式-以真实项目讲解
前面已经讲解了SQLite,FMDB以及CoreData的基本操作和代码讲解(CoreData也在不断学习中,上篇博客也会不断更新中).本篇我们将讲述在实际开发中,所使用的iOS数据持久化的方式以及怎 ...
- 实战项目-用例评审-问题总结-Dotest-董浩
实战项目-用例评审-问题总结 内部班项目用例评审,总结的问题:供大家参考!提升用例最好的方式,可以互相执行下(评审),就会明白自己的差距或者需要避免的点在哪里.(前提是会) 1)覆盖率 原型中提到的一 ...
- Java算法之递归打破及在真实项目中的使用实例
开心一笑 刚才领导问开发:"你觉得这个项目的最大风险是什么",开发说:"加班猝死" , 气氛尴尬了一分钟!!! 提出问题 1.递归算法简单复习 2.如何实现递归 ...
- Eclipse的maven构建一个web项目,以构建SpringMVC项目为例
http://www.cnblogs.com/javaTest/archive/2012/04/28/2589574.html springmvc demo实例教程源代码下载:http://zuida ...
- gulp在项目中的基本使用
在项目中用gulp做项目的代码的管理,用起来很方便.主要用到了下面一些功能 关于js的处理,包括合并.压缩.加hash. 关于css的处理,编辑scss,合并css,加hash,自动加入前缀 本地开发 ...
- OkGo3.0 --真实项目使用和二次封装(转)
转载:https://blog.csdn.net/jiushiwo12340/article/details/79011480 11.OkGo3.0真实项目使用和二次封装: ==== 11.OkG ...
- 用java发邮件之一 (直接源于真实项目) 【原】
真实项目应用的java发送邮件,应该还待进一步完善. 依赖 mail-1.4.jar jar包下载地址: http://mvnrepository.com/artifact/javax.mail/ma ...
- 从后端到前端之Vue(四)小试牛刀——真实项目的应用(树、tab、数据列表和分页)
学以致用嘛,学了这么多,在真实项目里面怎么应用呢?带着问题去学习才是最快的学习方式.还是以前的那个项目,前后端分离,现在把前端换成vue的,暂时采用脚本化的方式,然后在尝试工程化的方式. 现在先实现功 ...
- 使用低版本的VS打开高版本项目的解决方案(以VS2008打开VS2010开发的项目为例)
使用低版本的VS打开高版本项目的解决方案,这里以VS2008打开VS2010开发的项目为例. 右键项目的sln文件以记事本的方式打开: 将对应的前两列版本各降到对应的版本,这边的11.00改为10.0 ...
随机推荐
- Mysql查询——学习阶段
1.开篇 搞开发的都知道,当数据量很大的时候,我们的代码逻辑的简单性就显得十分重要,否则处理起来就需要花费相当多的时间.另外还有一个地方需要注意的是我们写的sql语句. 一个拥有多年开发的资深开发者可 ...
- [转]Android自定义控件三部曲系列完全解析(动画, 绘图, 自定义View)
来源:http://blog.csdn.net/harvic880925/article/details/50995268 一.自定义控件三部曲之动画篇 1.<自定义控件三部曲之动画篇(一)—— ...
- 一些常用的git指令
PyCharm编辑器 如何切换分支 git branch 查看当前在哪个分支,也会显示本地所有的分支名 git branch dev-chenqiao 新建分支 git checkout dev-ch ...
- 锋利的jQuery-读书笔记(二)
知识小点: 1.由于$()获取的永远是对象,不管括号里面的元素是否存在都会获得对象.所以检测某个元素在网页上是否存在时,不能使用以下代码: if($("#tt")){ //do s ...
- bzoj 1146 [CTSC2008]网络管理Network
很久之前写过 count on the tree. 然后一直不懂树状数组是怎么套上这个主席树的. 看了两小时发现它套的就是个权值线段树, 看不出来可持久化在哪里. 因为动态开点所以空间nlog2n. ...
- java--面向对象---访问属性
<第一节> private--只能用于成员变量和成员函数(限制于类而不是对象),即只能在本类中访问被定义为private 的变量 public-- protected-- <第二节& ...
- Sublime Text编辑器的12个技巧和诀窍
本文为您提供Sublime Text编辑器的12个技巧和诀窍,深入挖掘这个看似简洁的代码编辑器,背后所隐藏的实现各种高级功能的无限可能. 1) 选择 以下是一些Sublime Text选择文本的快捷键 ...
- Python Logging模块的简单使用
前言 日志是非常重要的,最近有接触到这个,所以系统的看一下Python这个模块的用法.本文即为Logging模块的用法简介,主要参考文章为Python官方文档,链接见参考列表. 另外,Python的H ...
- R 查看函数源代码
1:输入函数名. 2:methods( ),例如methods(quantile). 3:针对方法2得到的带*的,例stats:::quantile.default.
- 在UP Board 上搭建M——L服务器
前言 原创文章,转载引用务必注明链接,水平有限,欢迎指正. 本文环境:ubilinux 3.0 on UP Board 初识免流 所谓免流,就是免除手机访问网络产生的流量费用.其原理在乌云网上有过报道 ...