安装

先在全局安装,再在本地项目安装。

  1. $ npm install -g gulp
  2. $ npm install --save-dev gulp

gulpfile.js

安装完成后,接下来就是配置 gulpfile.js 文件,我们将会在这里定义任务列表。

  1. const gulp = require('gulp'); // 引入 gulp
  2. gulp.task('default', () => {
  3. return gulp.src('./scr/**/*.js')
  4. .pipe(gulp.dest('./dist'))
  5. })

以上就是一个最简单的任务,我们将 src 目录下所有的 js 文件通过 pipe(管道) 导流到 dist 目录中,如果当前没有此目录,便会新建一个。

我们只要执行 gulp命令,即可完成任务。

gulp.task

gulp.task 用于创建一个 gulp 任务,可以接受以下参数:

  • 任务名称(必选)
  • 任务函数(可选)或任务数组(可选)。

定义一个任务,我们需要给这个任务起一个唯一的名字,当我们想要执行这个任务时,可以输入以下命令

  1. $ gulp 任务名

当我们不加任务名进行执行时,即只输入 gulp 时 ,会执行名为 default 的默认任务,如果没有定义这个任务,将什么也不做。

gulp.task() 的第二个参数可以是一个数组,数组中的值是任务名的集合,当执行此任务时,会先执行数组中的任务。

  1. const gulp = require('gulp');
  2. gulp.task('script', () => {
  3. gulp.src('./src/**/*.js')
  4. .pipe(gulp.dest('./dist'))
  5. })
  6. gulp.task('css', () => {
  7. gulp.src('./src/**/*.css')
  8. .pipe(gulp.dest('./dist'))
  9. })
  10. gulp.task('copy',['script'], () => {
  11. gulp.src(copyPath)
  12. .pipe(gulp.dest('./dist'))
  13. })
  14. gulp.task('default', ['script','css']);

在上面的例子中,执行 copy 任务之前,将会首先执行 script 任务;执行 default 命令时, 将会执行 scriptcss 任务。

但是,当任务中存在异步操作时,下一个任务并不会等到上一个任务完成后再去执行。如下:

  1. gulp.task('default', ['copy','script'])
  2. gulp.task('script', () => {
  3. console.log('script');
  4. })
  5. gulp.task('copy', () => {
  6. console.log('copy1')
  7. setTimeout(() => {
  8. console.log('copy2');
  9. }, 3000);
  10. })

上面的例子中会先输入copy1 ,接着输出 script ,三秒后输出 copy2

如果希望 copy 执行结束后再执行 script,有三种方式。

  • 使用回调函数作为参数,用于标记任务执行完毕 ```javascript // 添加依赖[‘copy’] gulp.task(‘script’, [‘copy’], () => { console.log(‘script’); })

gulp.task(‘copy’, (cb) => { console.log(‘copy1’) setTimeout(() => { console.log(‘copy2’); // 标志异步执行结束 cb();
}, 3000); })

  1. - 返回一个 Stream(适用于异步操作 `gulp.src` 导出的文件)
  2. ```javascript
  3. // 添加依赖['copy']
  4. gulp.task('script', ['copy'], () => {
  5. console.log('script');
  6. })
  7. gulp.task('copy', () => {
  8. return gulp.src('./temp/*.js')
  9. // 异步操作文件流
  10. .pipe()
  11. .pipe(gulp.dest('./dist')
  12. })

// 添加依赖[‘copy’] gulp.task(‘script’, [‘copy’], () => { console.log(‘script’); })

const deferred = Q.defer(); console.log(‘copy1’) setTimeout(() => { console.log(‘copy2’); deferred.resolve(); }, 3000); return deferred.promise;

  1. <a name="gulp.src"></a>
  2. ## gulp.src
  3. `gulp.src` 是一个用来读取文件的 API 。
  4. 可以接受一个路径字符串或数组作为参数来选择所要读取的文件,并输出一个可以被输入到 `plugins` 的 `Stream` (文件流)。
  5. `gulp` 使用 `node-glob` 方式获取匹配的文件,通常,有以下几种方式。
  6. > - `js/app.js` 匹配 js 目录下的 `app.js` 文件。
  7. > - `js/*.js` 匹配 js 目录下所有以 `.js` 结尾的文件。
  8. > - `js/**/*.js` 匹配 js 目录及其所有子目录下以 `.js` 结尾的文件。
  9. > - `!js/app.js` 匹配 js 目录下除 `app.js` 外的所有文件。
  10. > - `css/*.{css,less,sass}`(逗号后不要加空格) 匹配 css 目录下以 `.css` , `.less` , `.saas` 结尾的文件。
  11. <a name="gulp.watch"></a>
  12. ## gulp.watch
  13. `gulp.watch` 是一个用于监控文件变化的 API 。
  14. 同 `gulp.src` ,它接受一个路径字符串或数组作为**第一个**参数用于选择将要监控文件,**第二个**参数可以是一个**任务列表数组**或者**回调函数**。当监控到文件变化时将会执行它们。
  15. ```javascript
  16. // 假设你已经有一个 script 任务。
  17. gulp.task('watch', () => {
  18. gulp.watch('./temp/*.html',['script'])
  19. })

此时我们在启动 watch 任务。

  1. $ gulp watch

现在,当我们的 ./temp/*.html 文件发生变化,将会直接执行 script 任务。

假如第二个参数是一个回调函数,

  1. gulp.task('watch', (event) => {
  2. console.log(event); // event 包含 'added', 'changed', 'deleted' 三种类型
  3. // 下面可以进行其他的操作...
  4. //...
  5. })

另外,gulp.watch() 会返回一个 watcher 对象,可以通过这个对象监听其他事件。

  1. gulp.task('watch', () => {
  2. // watcher 对象
  3. const watcher = gulp.watch('./temp/*');
  4. watcher.on('change', (event) => {
  5. console.log(event);
  6. console.log('has changed')
  7. })
  8. watcher.on('add', (event) => {
  9. console.log(event);
  10. console.log('has added')
  11. });
  12. })

plougins

我们通常会使用一些 npm 模块来方便实际开发。这些模块的使用方法也很简单——通过管道流处理文件。

  1. var gulp = require('gulp'),
  2. jshint = require('gulp-jshint'),
  3. uglify = require('gulp-uglify'),
  4. concat = require('gulp-concat');
  5. gulp.task('js', function () {
  6. return gulp.src('js/*.js')
  7. .pipe(jshint())
  8. .pipe(jshint.reporter('default'))
  9. .pipe(uglify())
  10. .pipe(concat('app.js'))
  11. .pipe(gulp.dest('build'));
  12. });

在使用之前,我们只需要通过 package.json 将安装到本地项目中。

在上面的例子中,我们对 js 目录下的 .js 文件依次进行了 jshint()jshint.reporter()uglify()concat()gulp.dest()操作。

以上就是关于 gulp 一些基本的使用,如有异议,欢迎指证。

参考

  1. 再学一次gulp
  2. building-with-gulp