上一篇的gulp配置很简单,主要就是为了demo的查看和调试,这一篇则会相对详细一些,包括压缩合并打时间戳等。

在互联网环境比较好的城市,需要多人协作的,大一点的项目应该都用上了模块化(这里主要指commonjs和ES6模块系统,不是再早的require.js和sea.js)。代码也会更注重如何分离和注入,而不再是单纯的合并。

但是在很多小公司,开发模式或技术都还是比较传统的,或者一些小项目也完全不需要用上那些比较前沿的技术。

所以这篇配置就主要为了这样的中小项目。

1.所需工具和版本

包管理工具:yarn v0.24.5

自动化构建工具:gulp v4.0

2.工具安装

yarn add global gulpjs/gulp#4.0

3.开发环境配置

var gulp = require('gulp'),
pug = require('gulp-pug'),
less = require('gulp-less'),
//当发生异常时提示错误 确保本地安装gulp-notify和gulp-plumber
notify = require('gulp-notify'),
plumber = require('gulp-plumber'),
sourcemaps = require('gulp-sourcemaps'),
browserSync = require('browser-sync').create()
reload = browserSync.reload; var LessAutoprefix = require('less-plugin-autoprefix'),
autoprefix = new LessAutoprefix({ browsers: ['last 2 versions'] }); // 文件路径
var paths = {
pug: {
src: 'src/pug/pages/*.pug',
dest: 'dev/html/',
watch: 'src/pug/**/*.pug'
},
less: {
src: 'src/less/**/*.less',
dest: 'dev/css/',
watch: 'src/less/**/*.less'
},
js: {
src: 'src/js/**/*.js',
dest: 'dev/js/',
watch: 'src/js/**/*.js'
},
img: {
src: 'src/img/**/*',
dest: 'dev/img/',
watch: 'src/img/**/*'
}
} // 启动 browserSync 服务,自己启动server,并且为浏览器实时刷新提供服务
gulp.task('browserSync', function() {
return browserSync.init({
server: {
baseDir: './'
},
files: './dev/**/*'
});
}) // 将pug文件转换为html
gulp.task('pug', function buildHTML() {
return gulp.src(paths.pug.src)
.pipe(plumber({errorHandler: notify.onError('Error: <%= error.message %>')}))
.pipe(pug())
.pipe(gulp.dest(paths.pug.dest));
}); // 编译less文件
gulp.task('less', function() {
return gulp.src(paths.less.src)
.pipe(plumber({errorHandler: notify.onError('Error: <%= error.message %>')}))
.pipe(sourcemaps.init())
.pipe(less({
plugins: [autoprefix]
}))
.pipe(sourcemaps.write())
.pipe(gulp.dest(paths.less.dest));
}) // 复制js文件
gulp.task('js', function() {
return gulp.src(paths.js.src)
.pipe(gulp.dest(paths.js.dest));
}) // 复制img文件
gulp.task('img', function() {
return gulp.src(paths.img.src)
.pipe(gulp.dest(paths.img.dest));
}) // 监听文件变化
gulp.task('watch', function() {
gulp.watch(paths.pug.watch, gulp.parallel('pug'))
gulp.watch(paths.less.watch, gulp.parallel('less'))
gulp.watch(paths.js.watch, gulp.parallel('js'))
gulp.watch(paths.img.watch, gulp.parallel('img'))
}) // 默认任务,在命令行输入`gulp`来启动任务
gulp.task('default', gulp.parallel('watch', 'browserSync', 'pug', 'less', 'js'))

gulp-pug这个插件是用来编译pug模板的,也就是以前的jade模板,pug模板是一个很强大的前后端通用的模板引擎,而且学习也很简单,具体用法可以看我另外一篇关于pug的教程文章——基于express+mongodb+pug的博客系统——pug篇。

大家知道gulp在监听任务的过程中,如果某个环节出了错误,gulp就会被中断,然后得重新启动gulp任务才行,这是一件很麻烦的事。这里可以通过gulp-notify和gulp-plumber两个插件来避免gulp任务中断。

4.生产环境配置

var gulp = require('gulp'),
del = require('del'),
pug = require('gulp-pug'),
less = require('gulp-less'),
cleanCSS = require('gulp-clean-css'),
base64 = require('gulp-tobase64'),
// img64 = require('gulp-imgbase64'),
imagemin = require('gulp-imagemin'),
babel = require('gulp-babel'),
uglify = require('gulp-uglify'),
rev = require('gulp-rev'), // 添加时间戳
revCollector = require('gulp-rev-collector'); var LessAutoprefix = require('less-plugin-autoprefix'),
autoprefix = new LessAutoprefix({
browsers: ['last 2 versions']
}); // 文件路径
var paths = {
pug: {
src: 'src/pug/pages/*.pug',
dest: 'dist/html/'
},
less: {
src: 'src/less/main.less',
dest: 'dist/css/'
},
js: {
src: ['src/js/**/*.js', '!src/js/lib/*.js'],
dest: 'dist/js/'
},
img: {
src: 'src/img/**/*',
dest: 'dist/img/'
}
}; // 将pug文件转换为html
gulp.task('pug', function() {
return gulp.src(paths.pug.src)
.pipe(pug())
.pipe(gulp.dest(paths.pug.dest));
}); // 编译less文件
gulp.task('less', function() {
return gulp.src(paths.less.src)
.pipe(less({
plugins: [autoprefix]
}))
.pipe(base64({
maxsize: 8
}))
.pipe(cleanCSS({
compatibility: 'ie8' // 兼容性前缀保留
}))
.pipe(rev())
.pipe(gulp.dest(paths.less.dest))
.pipe(rev.manifest())
.pipe(gulp.dest('rev/css'))
}); // 压缩图片
gulp.task('img', function() {
return gulp.src(paths.img.src)
.pipe(imagemin({
optimizationLevel: 3,
progressive: true,
interlaced: true
}))
.pipe(gulp.dest(paths.img.dest));
}); // 编译JS文件
gulp.task('js', function() {
return gulp.src(paths.js.src)
.pipe(babel({
presets: ['es2015']
}))
.pipe(uglify())
.pipe(rev())
.pipe(gulp.dest(paths.js.dest))
.pipe(rev.manifest())
.pipe(gulp.dest('rev/js'));
});
// 引用的外部 JS 库,不需要做压缩和打时间戳等处理
// 所以直接复制就行
gulp.task('copyJs', function() {
return gulp.src('src/js/lib/*.js')
.pipe(gulp.dest('dist/js/lib/'))
}) // 替换加了MD5时间戳的文件
gulp.task('rev', gulp.series(gulp.parallel('img64', 'less', 'js'), function() {
return gulp.src(['rev/**/*.json', 'dist/html/*.html'])
.pipe(revCollector({
replaceReved: true
}))
.pipe(gulp.dest(paths.pug.dest));
}));
// Clean 任务执行前,先清除之前生成的文件
gulp.task('clean', function() {
return del('dist/')
}); // 默认任务,在命令行输入`gulp`来启动任务
gulp.task('default', gulp.series('clean', gulp.series('img', gulp.parallel('rev', 'copyJs'))))

在生成环境中,代码需要压缩合并,另外在每次代码更新发布新版本时,为了用户客户端能下载更新代码,所以我们还需要给CSS和JS文件打上时间戳。

gulp-rev这个插件就专门给文件打MD5戳的,打完MD5戳之后,HTML文件里的引用当然也需要更改,如果每个都去手动更改肯定会是一件很麻烦的事,所以我们还需要gulp-rev-collector这个插件来帮我们替换打了MD5戳的文件。

gulp-imgbase64,这个插件可以指定html文件中,哪些img元素转换为base64,需要更加个性化转换的可以使用这个插件。

5.项目目录结构

XXX——

  | — dist

    | — html

    | — css

    | — img

    | — js

      | — lib

  | — dev

    | — html

    | — css

    | — img

    | — js

      | — lib

  | — src

    | — pug

      | — components

      | — pages

      | — layout.pug

    | — less

      | — pages

      | — main.less

      | — reset.less

      | — common.less

      | — feature.less

    | — img

    | — js

      | — lib

src文件夹里是主要的业务代码,这里面是需要长期维护的代码。

dev文件夹是开发时gulp生成代码的地方。

dist文件夹是生成时gulp生成代码的地方。

在这份配置里,我并没有像其他很多人那样,把开发时通过gulp生成的代码也放在src文件夹里,因为那样会造成很多引用上的麻烦,而且把开发和生产的代码环境都分开,能很好保持src文件夹里的纯净,不会有任何杂乱代码。

所以一些没经过gulp处理的文件,我会直接把它们复制到dev或者dist文件夹里对应的位置。

dist文件夹在每次gulp任务生成代码前都会被清空,所以我们不用关心dist文件夹里的内容。

而dev文件夹可能会有很多冗余文件,但我们也不需要担心它会对我们造成任何影响,文件删除或覆盖都不重要,只需要保证src文件夹里的文件正确即可。

gulp实用配置(2)——中小项目的更多相关文章

  1. gulp实用配置(1)——demo

    在React和Vue推进下,现在很多人都在使用webpack作为自动化构建工具,但其实在很多时候我们并不是一定需要用到它,gulp这样的轻量级构建工具就足够了. 最近一段时间不是太忙,所以就写了三份配 ...

  2. 基于流的自动化构建工具------gulp (简单配置)

    项目上线也有一阵子,回头过来看了看从最初的项目配置到开发的过程,总有些感慨,疲软期,正好花点时间,看看最初的配置情况 随着前端的发展,前端工程化慢慢成为业内的主流方式,项目开发的各种构建工具,也出现了 ...

  3. gulp+ThinkPHP配置

    gulp+ThinkPHP配置 gulp+ThinkPHP配置 目录结构: html |-src 开发目录 |-Home 静态页面 |-Public 静态资源目录 |-dist 生产目录 |-Home ...

  4. gulp常用配置

    由于项目中经常会使用到gulp,而每次配置大概都差不多,所以将配置记录一下 项目结构 ├─dist │ ├─assets │ ├─css │ ├─images │ └─js ├─node_module ...

  5. DRUID连接池的实用 配置详解

    DRUID介绍 DRUID是阿里巴巴开源平台上一个数据库连接池实现,它结合了C3P0.DBCP.PROXOOL等DB池的优点,同时加入了日志监控,可以很好的监控DB池连接和SQL的执行情况,可以说是针 ...

  6. 真分布式SolrCloud+Zookeeper+tomcat搭建、索引Mysql数据库、IK中文分词器配置以及web项目中solr的应用(1)

    版权声明:本文为博主原创文章,转载请注明本文地址.http://www.cnblogs.com/o0Iris0o/p/5813856.html 内容介绍: 真分布式SolrCloud+Zookeepe ...

  7. webpack实用配置

    前面的话 上文介绍了webpack入门,本文将详细介绍webpack实用配置 版本号 以entry.js打包为bundle.js为例,出口的filename可以设置为[id].[name].[hash ...

  8. Intellij IDEA 安装和配置jrebel进行项目的热部署

    Jrebel 先介绍一下jrebel,jrebel是可以热部署项目的一个工具,更改代码自动部署并不需要重启项目(在spring中的controller中,增加.修改方法都是可以进行热部署而不需要重启的 ...

  9. vue全家桶安装以及修改webpack配置新增vue项目启动方式

    一.安装node环境(自带npm) 下载地址 二.替换下载源 // 淘宝 NPM 镜像 npm install -g cnpm --registry=https://registry.npm.taob ...

随机推荐

  1. 2017PHP程序员的进阶之路

    2017PHP程序员的进阶之路 又是一年毕业季,可能会有好多毕业生即将进入开发这个圈子,踏上码农这个不归路.根据这些年在开发圈子总结的LNMP程序猿发展轨迹,结合个人经验体会,总结出很多程序员对未来的 ...

  2. 【Netty】Netty传输

    一.前言 在简单学习了Netty中的组件后,接着学习Netty中数据的传输细节. 二.传输 2.1 传输示例 Netty中的数据传输都是使用的字节类型,下面通过一个实例进行说明,该实例中服务器接受请求 ...

  3. 006开源O/R映射框架内容回顾

    Hibernate是一个O/R映射框架(也称为ORM) 从ORM词来看,O---Object(对象模型):R--- Relational(关联模型),可以做对象和关联的一种映射,当然这只是部分功能,一 ...

  4. 【试验局】ReentrantLock中非公平锁与公平锁的性能测试

    硬件环境: CPU:AMD Phenom(tm) II X4 955 Processor Memory:8G SSD(128G):/ HDD(1T):/home/ 软件环境: OS:Ubuntu14. ...

  5. 【持续集成】GIT+jenkins+snoar——jenkins发布php、maven项目

    一.持续集成 1.1 什么是持续集成? continuous integration (CI),持续集成是一种软件开发实践,即团队开发成员经常集成他们的工作,通常每个成员,每天至少集成一次,也就意味着 ...

  6. 2017年最好的6个WEB前端开发手册下载

    php中文网为你推荐6个web前端开发相关手册下载,适合web开发人员和php web开发人员进行下载参考学习! 一. html5中文手册 通过制定如何处理所有 HTML 元素以及如何从错误中恢复的精 ...

  7. 用R语言做数据清理(详细教程)

    数据的清理 如同列夫托尔斯泰所说的那样:“幸福的家庭都是相似的,不幸的家庭各有各的不幸”,糟糕的恶心的数据各有各的糟糕之处,好的数据集都是相似的.一份好的,干净而整洁的数据至少包括以下几个要素: 1. ...

  8. Vulkan Tutorial 09 图像视图

    操作系统:Windows8.1 显卡:Nivida GTX965M 开发工具:Visual Studio 2017 使用任何的VkImage,包括在交换链或者渲染管线中的,我们都需要创建VkImage ...

  9. 第二天0605下午——超链接<a>与图片<img>

    今天下午学习了超链接<a>标签和图片<img>标签,以下面代码为例: <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 ...

  10. 刨根究底字符编码之十二——UTF-8究竟是怎么编码的

    UTF-8究竟是怎么编码的 1. UTF-8编码是Unicode字符集的一种编码方式(CEF),其特点是使用变长字节数(即变长码元序列.变宽码元序列)来编码.一般是1到4个字节,当然,也可以更长. 为 ...