再学一次gulp自动化构建项目(含有开发环境和生产环境之分)
前言
用gulp构建官网的项目,起初用别人配置好的gulpfile来构建,后来发现有很多不人性化的操作,比如说在开发调试中,打印出console,按这个去找源文件的出处,发现代码被压缩了,找的可费劲了,说白就是没分配好开发环境和生产环境的。然后是在生产环境中没清除掉console,作为一枚处女座,忍受不了,于是打算大改造gulpfile.js。如有不足之处,请指出来哈,我将会献上我的膝盖~
分配开发环境和生产环境
- 在本项目的根目录下新建一个文件夹,命名为"config",放入相关gulp的配置文件
- 在config的文件夹里,新建一个文件,为"index.js",放入相关路径的配置
const SRC_DIR='./src/'; //源路径,不支持相对路径,下面也是
const DEV_DIR='./dev/'; //生成开发环境的文件
const DIST_DIR='./dist/'; //生成生产环境的文件
const config={
src:SRC_DIR,
dist:DIST_DIR,
dev:DEV_DIR,
html:{
src:SRC_DIR+'*.html',
dev:DEV_DIR,
dist:DIST_DIR
},
assets:{
src:SRC_DIR+'assets/**/*',
dev:DEV_DIR+'assets',
dist:DIST_DIR+'assets'
},
style:{
src:SRC_DIR+'style/*.less', //如果是scss或者css,就改对应的
dev:DEV_DIR+'css',
dist:DIST_DIR+'css'
},
script:{
src:SRC_DIR+'script/*.js',
dev:DEV_DIR+'js',
dist:DIST_DIR+'js'
},
img:{
src:SRC_DIR+'images/**/*',
dev:DEV_DIR+'images',
dist:DIST_DIR+'images'
}
};
module.exports=config; //把这个接口暴露给别的文件用
- 在config中新建两个文件,分别为"gulpfile.dev.js","gulpfile.prod.js"
- gulpfile.dev.js
const gulp=require('gulp'); //引用gulp插件
const $=require('gulp-load-plugins')(); //自动加载插件,可以省略一个一个引用插件
const config=require('./index.js'); //引用配置的路径文件
const open=require('open'); //开启服务
function dev(){
gulp.task('html:dev',function(){
return gulp.src(config.html.src).pipe($.fileInclude()).pipe(gulp.dest(config.html.dev)).pipe($.connect.reload())
});
gulp.task('assets:dev',function(){
return gulp.src(config.assets.src).pipe(gulp.dest(config.assets.dev)).pipe($.connect.reload())
});
gulp.task('style:dev',function(){
return gulp.src(config.style.src).pipe($.less()).pipe($.autoprefixer({
browseers: ['last 2 versions','Firefox>=20','last 2 Explorer versions','last 3 Safari versions'],
cascade: true
})).pipe(gulp.dest(config.style.dev)).pipe($.connect.reload())
});
gulp.task('script:dev',function(){
return gulp.src(config.script.src).pipe($.babel()).pipe($.babel()).pipe(gulp.dest(config.script.dev)).pipe($.connect.reload())
});
gulp.task('img:dev',function(){
return gulp.src(config.img.src).pipe($.imagemin()).pipe(gulp.dest(config.img.dev)).pipe($.connect.reload())
});
gulp.task('dev',['html:dev','style:dev','script:dev','img:dev'],function(){
$.connect.server({
root:config.dev,
port:3030,
livereload:true
});
open('http://localhost:3030');
gulp.watch(config.html.src,['html:dev']);
gulp.watch(config.html.src,['style:dev']);
gulp.watch(config.html.src,['script:dev']);
gulp.watch(config.html.src,['img:dev']);
})
}
module.exports=dev;
- gulpfile.prod.js
//配置生产的文件
const gulp=require('gulp'); //引用gulp插件
const $=require('gulp-load-plugins')(); //自动加载插件,可以省略一个一个引用插件
const config=require('./index.js'); //引用配置的路径文件
function prod(){
gulp.task('html',function(){
return gulp.src(config.html.src).pipe($.fileInclude()).pipe(gulp.dest(config.html.dist))
});
gulp.task('assets',function(){
return gulp.src(config.assets.src).pipe(gulp.dest(config.assets.dist))
});
gulp.task('style',function(){
return gulp.src(config.style.src).pipe($.less()).pipe($.autoprefixer({
browseers: ['last 2 versions','Firefox>=20','last 2 Explorer versions','last 3 Safari versions'],
cascade: true
})).pipe($.cleanCss({compatibility: 'ie8'}))
.pipe(gulp.dest(config.style.dist))
});
gulp.task('script',function(){
return gulp.src(config.script.src)
.pipe($.babel())
.pipe($.uglify())
.pipe($.stripDebug({
debugger:true,console:true,alert:false
}))
.pipe(gulp.dest(config.script.dist))
});
gulp.task('img',function(){
return gulp.src(config.img.src).pipe($.imagemin()).pipe(gulp.dest(config.img.dist))
});
gulp.task('build',['html','style','script','assets','img'])
}
module.exports=prod;
是不是一目了然呢?
最后新建gulpfile.js
- 在本项目的根目录下新建一个文件,为gulefile.js,命令行都是通过这个文件启动
const gulp=require('gulp');
const prod=require('./config/gulpfile.prod.js');
const dev=require('./config/gulpfile.dev.js');
const config=require('./config/index.js');
const $=require('gulp-load-plugins')();
dev(); //启动开发环境,gulp dev
prod(); //启动生产环境, gulp prod
gulp.task('clean',function(){
gulp.src([config.dev,config.dist])
.pipe($.clean());
});
gulp.task('sprite', function () { //生成雪碧图,gulp sprite,分别生成dev和dist
let spriteData = gulp.src(config.src+'/images/sprite_2/*.png')
.pipe($.spritesmith({
imgName: 'images/sprite_2.png',
cssName: 'css/sprite.css',
padding: 2, // 图片之间的间距
algorithm: 'left-right', //图片排列格式,默认是top-down,我这里稍微修改下
algorithmOpts: {sort: false} //是否排序
}));
return spriteData.pipe(gulp.dest(config.dist)).pipe(gulp.dest(config.dev));
});
插件介绍
-
gulp-autoprefixer
- 这个是提供自动添加兼容浏览器的前缀,不需要我们手动添加,不过这并不全的。
-
gulp-clean
- 每次生成dist和dev,有时为了预防缓存的问题,需要清除的,但每次要手动清除,作为懒癌症的我都嫌弃了,只想用命令运行就清除掉,所以用这个插件的。
-
gulp-clean-css
- 清除css的注释,减少文件的大小,同时为了减少请求的延迟
-
gulp-connect
- 这个是创建本地服务器,还能热启动加载
-
gulp-file-include
- 这个是神器的哈,引用共同的html模板,代码如下
//meta.html <title>@@title</title> //index.html @@include('./page/meta.html',{ "title":"首页" })
-
gulp-imagemin
- 压缩图片的大小
-
gulp-less
- 把less转化为css
-
gulp-load-plugins
- 这个是神器的,当引用多个插件的,一个一个require,多繁杂啊,仅require这个插件的,然后在引用其他的插件时,只要写"$.<插件名>"
- 插件名的例子如下
1、gulp-connect $.connect 2、gulp.spritesmith $.spritesmith 3、gulp-file-include $.fileInclude
-
gulp-strip-debug
- 去除掉console,alert,debug,对生产环境特别有用。
- 其实我一开始是拒绝这个插件的,因为这个官方文档没说明不除掉alert的方法,然后没有其他的不错类似这个的插件,只能硬着头皮查更多关于这个的资料,结果找到了,只不过有差别的。下面会给出参考网址
- 要除掉alert的话,就在生产环境的文件中配置
$.stripDebug({ debugger:true,console:true,alert:false })
我以为结束了,兴高采烈的运行生产环境,手抖的戳,等了“半天”,没看到alert弹出来,emmm,抱自己痛哭的去看参考网址,卧槽,还要改插件的配置,这个开发者是懒得再多配置了么?好吧~
- 去node_modules里找gulp-file-include/index.js,然后加options,意思是接受上面的配置
const through = require('through2'); const stripDebug = require('strip-debug'); const PluginError = require('plugin-error'); module.exports = (options) => { return through.obj(function (file, enc, cb) { if (file.isNull()) { cb(null, file); return; } if (file.isStream()) { cb(new PluginError('gulp-strip-debug', 'Streaming not supported')); return; } try { file.contents = Buffer.from(stripDebug(file.contents.toString(),options).toString()); this.push(file); } catch (err) { this.emit('error', new PluginError('gulp-strip-debug', err, {fileName: file.path})); } cb(); }); };
- 然后再找node_modules里找strip-debug/index.js,修改最后的一段函数
module.exports = ((source,options) =>{ options=options || {}; return rocambole.moonwalk(source, node => { options.debugger!==false && stripDebugger(node); options.console!==false && stripConsole(node); options.alert!==false && stripAlert(node); }) })
ok了,喜极而泣~
-
gulp-ugllify
- 压缩js的代码
-
gulp.spritesmith
- 生成雪碧图
-
open
- 这个适合懒癌症的人,不需要每次启动服务时就手动打开浏览器的
然后至于怎么用,看上面的gulpfile配置喽!
然后献上:https://blog.csdn.net/qq_15096707/article/details/54293203
我是参考这个,思路不错的,可以“去粗取精”
发表评论 (审核通过后显示评论):