gulp ,基于 NodeJS 的项目,自动化构建的工具加强你的工做流程!javascript
前端构建工具,gulp是基于Nodejs,自动化地完成 javascript、coffee、sass、less、html/image、css 等文件的测试、检查、合并、压缩、格式化、浏览器自动刷新、部署文件生成,并监听文件在改动后重复指定的这些步骤。借鉴了Unix操做系统的管道(pipe)思想,前一级的输出,直接变成后一级的输入,使得在操做上很是简单。流,Node将几乎全部IO操做都抽象成了stream的操做,简单来讲就是:
(1)在面向对象基础上的一种抽象的处理数据的工具。
(2)经过各类 Transform Stream 来实现文件不断处理 输出。css
安装好node,而后全局安装gulp。html
npm i -g gulp
npm i gulp -D
//安装插件 npm i gulp gulp-ssh gulp-ftp -D ------------- //引入差价(有些插件常常用 已装在全局,就能够直接引入到项目里) npm link gulp gulp-ssh gulp-ftp
gulp执行的时候默认去找这个文件。前端
//**AMD** require.js 用require()加载模块 下面例子都用require var gulp = require('gulp'); //**es6中** 用import加载模块 import gulp from 'gulp';
var gulp = require('gulp'); gulp.task('default', function() { // doSomething console.log("开启默认gulp项目") });
示例:在终端输入 gulp等于输出gulp default; 就是默认读取'default'任务java
task( )
建立定义任务task(name,function(){}); 语法参数 (名字,执行函数)node
//建立定义名为'build'的任务 gulp.task('build', function() { console.log("开启build任务") });
dest( )
导出文件到哪正式描述:建立用于将虚拟对象写入文件系统的流git
var gulp = require('gulp'); gulp.task('save', function(){ return gulp.src('../js/**/*.js') .pipe(gulp.dest('../output/js/')); //写入到output/js/路径下 } //pipe方法传入一个function接收上一个流(stream)的结果,并返回一个处理后流的结果(返回值应该是一个stream对象)
src()
读取文件正式描述:src(匹配文件路径);建立一个流,从文件中读取虚拟对象es6
var gulp = require('gulp'); var uglify = require('gulp-uglify'); gulp.task('uglify', function(){ //新建一个叫uglify的任务 return gulp.src('../js/**/*.js') //js项目下所有的js文件 .pipe(uglify()) //对流进行压缩 .pipe(gulp.dest('../output/js/')); //写入到output/js/路径下 });
watch( )
监视文件,文件发生变化执行任务watch(globs, [options], [task]); 监听文件路径,配置选项,执行任务github
var gulp = require('gulp'); var sass = require('gulp-sass'); gulp.src('./sass/**/*.scss') .pipe(sass({ outputStyle: 'compressed' // 配置输出方式,默认为nested })) .pipe(gulp.dest('./dist/css')); gulp.watch('./sass/**/*.scss', ['sass']); // 实时监听sass文件变更,执行sass任务
Glob 是由普通字符和/或通配字符组成的字符串,用于匹配文件路径。能够利用一个或多个 glob 在文件系统中定位文件。正则表达式
有点相似于正则表达式,可是语法又有点差别。
这种模式,被普遍用于命令行、Shell 等场景,你们熟悉的.gitignore
文件也是使用这种模式。各大语言都有对于 Glob 的实现,例如 Go 和 PHP 的Glob函数,Python 中的glob模块。 而 NodeJS 的实现是minimatch, 而在 Gulp 源码中,就用了对 minimatch 进行封装的node-glob模块。
Gulp的gulp.watch和gulp.src都有用到 Glob 来匹配对应的路径和文件。
很接近正则 但不彻底同样
code | 匹配 | 说明 |
---|---|---|
*.* |
a.js , b.css |
匹配全部带后缀的文件 |
*/*/*.js |
a/b/c.js ,x/y/z.js |
匹配固定层级目录 |
** |
abc ,a/b ,a/b.js |
匹配全部的目录和文件 |
js/**/*.js |
js/a.js ,js/a/b.js |
匹配a目录下的.js 文件 |
a?? |
a.b ,abc |
占位符与字符搭配使用 |
[abc].js |
a.js ,b.js ,c.js |
整个[] 只匹配一个字符 |
[^abc].js [!abc].js |
x.js ,y.js |
除了a.js b.js c.js 外的所有js |
1.类正则
2.数组[ ]
code | 匹配说明 |
---|---|
[*.js,'!b*.js'] | 匹配全部js文件,但排除掉以b开头的js文件 |
['!b*.js',*.js] | 不排除任何文件,由于排除模式不能出如今数组的第一个元素中 |
3.展开模式{ }
正则里面咱们用{}装载量词, 而这里是表示展开模式。
code | 匹配说明 |
---|---|
a{b, c}d | 展开为:abc,acd |
a{b,}c | 展开为:abc,ac |
a{0..3}c | 展开为:a0c,a1c,a2c |
a{b, c{d, e}f}g | 展开为:abg,acdfg,acefg |
a{b, c}d{e, f}g | 展开为:abdeg,acdeg,abdeg,abdfg |
进入官网 搜索插件名字后都有详细的配置说明和示例
var del = require('del'); del('./dist');// 删除整个dist文件夹
var gulp = require('gulp'); var rename = require("gulp-rename"); gulp.src('./hello.txt') .pipe(rename('gb/goodbye.md')) // 直接修改文件名和路径 .pipe(gulp.dest('./dist')); gulp.src('./hello.txt') .pipe(rename({ dirname: "text", // 路径名 basename: "goodbye", // 主文件名 prefix: "pre-", // 前缀 suffix: "-min", // 后缀 extname: ".html" // 扩展名 })) .pipe(gulp.dest('./dist'));
var concat = require('gulp-concat'); gulp.src('./js/*.js') .pipe(concat('all.js')) // 合并all.js文件 .pipe(gulp.dest('./dist')); gulp.src(['./js/demo1.js','./js/demo2.js','./js/demo2.js']) .pipe(concat('all.js')) // 按照[]里的顺序合并文件 .pipe(gulp.dest('./dist'));
由于是node自带的模块 不须要另外安装。
列举两个是冰山一角,能够点连接去官网看
var fs =require("fs"); // 写入文件 fs.writeFile(file, data[, options], callback) //读取文件 fs.readFile(path[, options], callback)
//-----------任务--------------
var gulpSequence= require('gulp-sequence'); //并行执行任务a和任务b, 在a和b都结束后才执行c gulp.task('sequence-1', gulpSequence(['a', 'b'], 'c')) //执行单个任务 gulp.task('sequence-1', gulpSequence('a')
var gulp = require('gulp'); var uglify = require('gulp-uglify'); var pipeline = require('readable-stream').pipeline; gulp.task('compress', function () { return pipeline( gulp.src('lib/*.js'), uglify(), gulp.dest('dist') ); });
var gulp = require('gulp'); var imagemin = require('gulp-imagemin'); exports.default = () => ( gulp.src('src/images/*') .pipe(imagemin()) .pipe(gulp.dest('dist/images')) );
var gulp = require('gulp'); var less = require('gulp-less'); var cssmin = require('gulp-cssmin'); var autoprefixer=require('gulp-autoprefixer'); gulp.task('cssmin', function(){ return gulp.src('../less/'+ lessFile +'.less') .pipe(less()) .pipe(autoprefixer({ cascade: false })) .pipe(cssmin()) .pipe(gulp.dest('../css/')); })
var gulp = require('gulp'), less = require('gulp-less'), livereload = require('gulp-livereload'); gulp.task('less', function() { gulp.src('less/*.less') .pipe(less()) .pipe(gulp.dest('css')) .pipe(livereload()); });
var rename = require("gulp-rename"); gulp.src("./src/main/text/a.txt") .pipe(rename("main/text/ciao/b.js")) .pipe(gulp.dest("./dist")); // ./dist/main/text/ciao/goodbye.md
mark一下 仅供参考 欢迎更正补充 Thanks
参考资料:
官网: https://www.gulpjs.com.cn/
官网插件使用: https://www.npmjs.com/
博客类:
gulp及其插件: https://www.jianshu.com/p/a9e...
经常使用gulp插件: https://www.cnblogs.com/nanxi...
插件编写入门: https://www.cnblogs.com/chyin...
gulp的基础和原理:http://huang-jerryc.com/2017/...