npm install -g gulp // 全局安装gulp 是为了执行 gulp 任务
npm install gulp --save-dev // 本地安装gulp 是为了调用 gulp 插件 -css
// -save:将保存配置信息至package.json -dev:保存至package.json的devDependencies节点,
// 不指定-dev将保存至 dependencies 节点;通常保存在dependencies的像这些express/ejs/body-parser等等
// 保存到 package.json 其余人 npm install 则会下载所须要的包; npm install --production只下载dependencies节点的包 html
npm init 输入name等信息,生产 package.json文件,该文件也能够手动生成。
entry point 输入主文件名 gulpfile.js
1.把less 编译成css
npm install gulp-less --save-dev git
2. 新建 gulpfile.js 文件
var gulp = require('gulp'),
less = require('gulp-less'); // 引入 gulp-less
// 定义任务名称
gulp.task('testLess',function(){
gulp.src('src/less/index.less') // 指定less 文件
.pipe(less())
.pipe(gulp.desc('src/css')); // 在src/css下 生成 css 文件
});
gulp.task('default',['testLess'],['otherTask']); // 把上面的任务都添加到这里,批量执行。
命令行:gulp 或 gulp default 则执行任务es6
gulp 4.0github
// 图片压缩 gulp.task('minify-images', () => { return gulp.src('./src/assets/images/**/*') .pipe(minifyImage({ optimizationLevel: 3, //类型:Number 默认:3 取值范围:0-7(优化等级) progressive: true, //类型:Boolean 默认:false 无损压缩jpg图片 interlaced: true //类型:Boolean 默认:false 隔行扫描gif进行渲染 })) .pipe(gulp.dest('dist/assets/images')) })
gulp4.0完整版 20170823web
gulp4.0安装 npm install gulpjs/gulp#4.0 -g // 全局安装 建立文件夹, npm init -y 生成package.json npm install gulpjs/gulp#4.0 --save-dev 新建gulpfile.js var gulp = require('gulp') gulp.task('copy',function () { return gulp.src('./src/config/**/*') // “**”:匹配0个或多个子文件夹 例:src/**/*.js(包含src的0个或多个子文件夹下的js文件); .pipe(gulp.dest('./dist/config')) // gulp借鉴了Unix操做系统的管道(pipe)思想,前一级的输出,直接变成后一级的输入 }) gulp.task('default', gulp.parallel('copy')); // 4.0要使用 series(按顺序执行) 和 parallel(并行) 控制台 gulp 运行
gulp4.0 清空文件夹、复制文件、删除文件ajax
var gulp = require('gulp') var del = require('del') // 清空文件夹 function cleanFile() { return del([ 'dist/*' ]) } // 复制文件夹 function copyFile() { return gulp.src('./test/**/*') .pipe(gulp.dest('./dist/test')) } //删除test多余文件 function delFile() { return del([ 'dist/test/css/*.map', 'dist/test/images/details' ]) } gulp.task('default', gulp.series(cleanFile,copyFile,delFile));
gulp4.0入门express
gulp3.0 // default任务,须要依赖scripts和styles gulp.task('default', ['scripts', 'styles'], function() {...}); // script折styles任务都依赖clean gulp.task('styles', ['clean'], function() {...}); gulp.task('scripts', ['clean'], function() {...}); // clean任务用来清空目录 gulp.task('clean', function() {...}); ====================== gulp4.0 gulp.series 按顺序执行 gulp.parallel 并行执行 gulp --tasks 查看细节 demo04:{ gulp.task('default', gulp.series(clean, gulp.parallel(scripts, styles))); gulp.task('default').description = "This is the default task and it does certain things"; function styles() {...} function scripts() {...} function clean() {...} // 能够单独运行任务 // gulp.task(styles); // 添加注释 // gulp.task(styles).description='注释' } gulp.src 接收的文件匹配字符串会顺序解释,因此你能够写成这样 gulp.src(['*.js', '!b*.js', 'bad.js'])(排除全部以 b 开头的 JS 文件可是除了 bad.js) 【实操】 复制文件3种写法,推荐demo03 demo01:{ var gulp = require('gulp') gulp.task('copy',function () { return gulp.src('./src/config/!**!/!*') // “**”:匹配0个或多个子文件夹 例:src/!**!/!*.js(包含src的0个或多个子文件夹下的js文件); .pipe(gulp.dest('./dist/config')) // gulp借鉴了Unix操做系统的管道(pipe)思想,前一级的输出,直接变成后一级的输入 }) gulp.task('default', gulp.parallel(copy)); } demo02:{ var gulp = require('gulp') function copy(callback) { gulp.src('./src/config/**/*') .pipe(gulp.dest('./dist/config')) .on('finish',callback) // 添加callback和 .on() } gulp.task('default', gulp.parallel(copy)); } demo03:{ var gulp = require('gulp') function copy() { return gulp.src('./src/config/**/*') .pipe(gulp.dest('./dist/config')) } gulp.task('default', gulp.parallel(copy)); } 删除文件 npm install del --save-dev demo07:{ var gulp = require('gulp') function clean() { return del([ 'src/config/*.html', // 删除文件 '!src/config/0.html' // 不要删除这个文件 ]) } gulp.task('default', gulp.parallel(copy)); } gulp-if 条件判断 gulp-uglify 压缩 压缩文件 var uglify=require('gulp-uglify'); function copy(callback) { gulp.src('./src/config/**/*.js') .pipe(uglify()) //压缩 .pipe(gulp.dest('./dist/config')) .on('finish',callback) } gulp-concat 拼接 gulp-rename 重命名 文件夹生成单独一个文件 http://www.gulpjs.com.cn/docs/recipes/running-task-steps-per-folder/
gulp-uglify js压缩,默认混淆闭包内的内部变量npm
gulp-uglify 默认混淆闭包内的内部变量 (function(){ var a = 10; var b = 100; function add(a,b) { return a+b } console.log(add(a, b)); })() .pipe(uglify({ mangle: { toplevel: true }})) gulp-uglify 强制混淆代码,跨文件的变量调用可能会出错。
js压缩混淆关键点 window.Test=Testjson
(function () { var Test = function (name, age) { if(!this instanceof Test) return new Test(name,age) this.name=name; this.age=age; } Test.prototype={ getName:function () { return this.name + ' haha'; } } window.Test=Test // 把对象赋值给window属性,不能引用时, new Test(), 会报错Test undefined })()
gulp 自动刷新、文件合并、引入公共头部、引入配置文件
gulp 自动刷新 npm install -g browser-sync 使用 **(表示任意目录)匹配,任意目录下任意.css 或 .html文件。 browser-sync start --server --files "**/*.css, **/*.html" browser-sync start --server --files "src/**/*" // 监控src下的任意目录的全部文件 gulp 文件合并 npm install -g gulp-concat --save-dev gulp css压缩 npm install gulp-clean-css --save-dev var cssmin = require('gulp-clean-css'); // css合并压缩去注释 function cssMergeCompress() { var url = './src/assets/css/'; return gulp.src([url+'ccc.css',url+'b.css']) // 自定义合并顺序, gulp.src(url+'*.css') 按文件名字母顺序 .pipe(concat('index.css')) // 合并后的名字 .pipe(cssmin()) // 压缩去注释 .pipe(gulp.dest('./dist/assets/css')) } gulp.task(cssMergeCompress) // 单独任务 gulp 引入html npm install -g gulp-html-import var htmlImport = require('gulp-html-import') // 引入公共头部 function importHtml() { return gulp.src('./src/index.html') .pipe(htmlImport('./src/assets/common/')) // 引入common文件夹下的header.html footer.html .pipe(gulp.dest('dist')) } index.html 文件 @import "header.html" <div>this is body..</div> @import "footer.html" // 必须用引双号,单引号无效 配置文件处理 config.js module.exports={ local:{ api: 'http://localhost:3000/banner', apiId:'本地配置参数' }, test:{ // 测试环境 api:'xxx.com/banner', apiId:'测试配置参数' }, prod:{ // 生产环境 api:'xxx.com/banner', apiId: '生产环境参数' } } a.js var api = 'localApi' var appId = 'localAppId' $.ajax({ url:api+'xxx/xxx', beforeSend:function (xhr) { xhr.setRequestHeader("appId", appId); } }) var config = require('./src/assets/config/config.js') 引入配置文件 var replace = require('gulp-replace') // 指定字符串替换 // 引入配置文件 function configImport() { console.log(config.local.api); return gulp.src('src/assets/js/a.js') .pipe(replace('localApi',config.local.api)) .pipe(replace('localAppId',config.local.apiId)) .pipe(gulp.dest('dist')) } gulp.task(configImport)
gulp 自动刷新二
var gulp = require('gulp'); var browserSync = require('browser-sync'), // 自动刷新 reload = browserSync.reload; // server function server() { browserSync.init({ port:9000, server:{ baseDir: 'dist', index:'index.html' } }) gulp.watch('*.html',myHtml) // 复制代码 gulp.watch('dist/**/*').on('change',reload) // 刷新页面 } // html function myHtml() { return gulp.src('*.html') .pipe(gulp.dest('dist')) } gulp.task('default',gulp.series(myHtml,server)) // 不用单引号!!!
gulp 自动刷新、监听、html、css、js较完整版
var gulp = require('gulp'); var browserSync = require('browser-sync'), // 自动刷新 reload = browserSync.reload; var changed = require('gulp-changed'); var cssmin = require('gulp-clean-css'); var concat = require('gulp-concat'); var less = require('gulp-less'); var htmlmin = require('gulp-htmlmin'); var babel = require('gulp-babel'); var url = './chedai_pc/assets/'; var uglify = require('gulp-uglify'); // server function server() { browserSync.init({ port:9000, server:{ baseDir: 'dist', index:'index.html' } }) gulp.watch('*.html',myHtml) // 复制代码 gulp.watch(url+'css/*.css',cssMergeCompress) // css gulp.watch(url+'less/*.less',lessMergeCompress) // less gulp.watch(url+'less/*.less',lessCss) // less->css gulp.watch(url+'js/index.js',jsCompress) // js gulp.watch('dist/**/*').on('change',reload) // 刷新页面 } // html function myHtml() { return gulp.src('*.html') .pipe(changed('dist')) .pipe(htmlmin({ collapseWhitespace: true, // 压缩成了一行 removeComments: true // 去注释 })) .pipe(gulp.dest('dist')) } // css合并压缩去注释 function cssMergeCompress() { return gulp.src(url+'css/*.css') // 自定义合并顺序, gulp.src(url+'*.css') 按文件名字母顺序 .pipe(concat('index.css')) // 合并后的名字 .pipe(cssmin()) .pipe(gulp.dest('./dist/chedai_pc/assets/css')) } // less合并压缩去注释 function lessMergeCompress() { return gulp.src(url+'less/*.less') .pipe(less()) .pipe(concat('index.css')) .pipe(cssmin()) .pipe(gulp.dest('./dist/chedai_pc/assets/css')) } // 先less -> css 再合并css function lessCss() { gulp.src(url+'less/*.less') .pipe(less()) .pipe(concat('less.css')) .pipe(gulp.dest(url+'css/')) return gulp.src(url+'css/*.css') .pipe(concat('index.css')) // 合并后的名字 .pipe(cssmin()) .pipe(gulp.dest('./dist/chedai_pc/assets/css')) } // js 混淆压缩 function jsCompress() { return gulp.src(url+'js/index.js') // .pipe(babel()) // web端 不用 es6吧 .pipe(uglify()) .pipe(gulp.dest('dist/chedai_pc/assets/js/')) } // gulp.task('default',gulp.series(myHtml,cssMergeCompress,lessCss,server)) // 不用单引号!!! gulp.task('default',gulp.series(myHtml,lessCss,jsCompress,server)) // 不用单引号!!! gulp.task(jsCompress)
gulp es6 babel转换 须要 .babelrc配置文件 详见 babelrc文章
var babel = require('gulp-babel') function es6() { return gulp.src('src/assets/js/*.js') .pipe(babel()) .pipe(gulp.dest('dist')) } gulp.task(es6)
.babelrc
{ "presets":[ ["stage-3"], ["env",{ "targets":{ "browsers":["ie 6-8"] // 详见 babelrc文章 } }] ], "plugins":[["transform-runtime",{ "helpers": false, // defaults to true "polyfill": false, // defaults to true "regenerator": true, // defaults to true "moduleName": "babel-runtime" }]] }
须要的package.json
"babel-plugin-transform-runtime": "^6.23.0", "babel-preset-env": "^1.4.0", "babel-preset-stage-3": "^6.24.1", "gulp-babel": "^6.1.2",
gulp 用到的package.json 备注
"devDependencies": { "babel-plugin-transform-runtime": "^6.23.0", // babel "babel-preset-env": "^1.4.0", // babel "babel-preset-stage-2": "^6.24.1", // babel 注意 stage 1 2 3 4 "browser-sync": "^2.18.13", // 自动刷新 "gulp": "github:gulpjs/gulp#4.0", // gulp4.0 "gulp-babel": "^6.1.2", // gulp-babel 插件 "gulp-changed": "^3.0.0", // 操做 修改过的文件 "gulp-clean-css": "^3.0.4", // 压缩css "gulp-concat": "^2.6.1", // 文件合并,并命名 "gulp-htmlmin": "^3.0.0", // html压缩去注释 "gulp-less": "^3.3.2", // less 编译 "gulp-uglify": "^3.0.0", // js 混淆压缩 "del": "^3.0.0", // 删除文件、文件夹 "gulp-html-import": "0.0.2", // 引入公共html 头部、尾部 "gulp-replace": "^0.6.1" // 指定字符串替换 配置api }