Showing posts with label Gulp. Show all posts

How to Use Gulp

If you’re paying attention to the world of front-end development, you’re surely aware of how many tools exist. Git, Stylus, Broccoli, Node, Angular, etc.
In this tutorial, we’re going to be looking at Gulp. The buzziest of all the buzzwords.
Gulp is a build-automation tool. Gulp is the work truck, where we keep our tool belt. It helps us use all the tools in our tool belt in a more effective way.
Instead of managing multiple apps to provide tooling for our individual projects, Gulp can provide us an automated build process.

Before we begin…

Gulp has a command-line interface.
If you’re not comfortable with CLIs, please see my tutorial called Getting Started with Command-Line Interfaces before reading this Gulp tutorial.
Familiarity with command-line interfaces is a requirement to being able to understand and use the things we will cover in this tutorial.
Also, I suggest downloading my sample source files. These sample source files will make it easier to test the code in this tutorial. The sample files are on GitHub.
If you use Git, you can issue the following command:
git clone https://github.com/drewminns/sixrevisions_gulpstarter.git

Installing Gulp on your computer

Gulp takes advantage of a JavaScript application platform called Node.js that provides us with an environment in which to run apps from.
One of the great features of Node — besides being a powerful tool for developing apps — is the package manager it comes with. Node’s default package manager is called npm.
In order to use npm and Gulp, you will need to install Node.
Once you have Node installed, you can use npm from your command line to install Gulp, and any other package you will need.
In your CLI, issue the following command:
npm install gulp -g

If you’re having trouble: Use superuser privileges

If the command above doesn’t work, prefix the command with sudo. This command means super do. This enables administrator (superuser) access to the file system.
Whenever you have an issue performing a command, add sudo at the start of the command:
sudo npm install gulp -g
Upon typing the command above, you may be asked for your password. The reason is that we are attempting to install the Gulp package globally on our system. If you begin to type your password, you won’t see any characters being inputted. Rest easy, the characters are there, but they’re not shown for security purposes in case someone’s looking over your shoulders.

An explanation of the command

Before moving forward, let’s break down what each portion of the command means.
  • npm is the command to work within the scope of npm.
  • install is the action to perform within the the scope of npm.
  • gulp is the name of the package we want to install.
  • -g is a command option/flag that stands for global. With this command option, we’re saying we want Gulp to be available to our entire system.

Changing to the project directory

If everything installed successfully with no errors, go ahead and change your working directory to the directory where you downloaded the sample files to.
cd /your/project/directory
This will be our project directory for this tutorial.

Using Gulp for a project

Once we have Gulp installed on our system, we can move into automating our projects.

Creating a package.json file

Run the following command:
npm init
When you type the command, you will be presented with the ability to create a file called package.json.
Fill out the fields as best you can, and in the end you will find a newly created package.json file in your project directory.

What is package.json?

The package.json file contains information about your project. As we add more packages to our project, the file will also serve as a listing for those packages, telling our system what files are needed.
If we were to move our project to another computer, or work with another developer who wants to use the same build tasks, the package.json file will serve as a manifest.

Creating a gulpfile

The engine of any project that uses Gulp is the gulpfile.js file. This JavaScript file is commonly referenced as a gulpfile. The terms “gulpfile.js” and “gulpfile” are synonymous in the context of this tutorial.
A gulpfile allows us to create tasks and automate them in our project. The contents of gulpfile.js will vary from project to project.
Let’s create a gulpfile for our project.
touch gulpfile.js

Installing Gulp plugins

Even though we installed Gulp on our system, we also need to install it in our project directory. Run the following command:
npm install gulp --save-dev
Note: You may have to type sudo again at the start of the command to give yourself system access if you’re having trouble executing the command.
Next, let’s install a few Gulp plugins that will allow us to compile our Sass files into CSS, and then combine them all into one CSS file.
In the command line, type the following:
npm install gulp-sass gulp-concat --save-dev

node_modules directory

You’ll notice that a node_modules directory has been created inside your project directory after issuing the npm install command. This directory contains all the required files to run the plugins.
As we install Gulp plugins and Node packages, they’ll be placed in node_modules.

Setting up a Gulp task

Within gulpfile.js, we can now set up a Gulp task.
Open up gulpfile.js in your favorite code editor and let’s get coding.

Specifying the project’s dependencies

Node’s require() function allows us to specify the plugins that are needed in order to run our Gulp tasks. These are called dependencies. We depend on them to make our Gulp tasks work.
Also, so that we’re not calling the require() function every time we want to reference one of our plugins, we put whatever the require() function returns into JavaScript objects.
var gulp = require('gulp'),
    sass = require('gulp-sass'),
    concat = require('gulp-concat');
So now, when we use the sass() function in our code, we’re talking about the gulp-sass plugin. When we use concat(), we’re referencing the gulp-concat plugin.

Using the project’s dependencies

Once we’ve told Gulp what our dependencies are, we can set up a task.
We’ll create a Gulp task named styles.
gulp.task('styles', function() {
  return gulp.src('styles/*.scss')
    .pipe(sass({
      'sourcemap=none': true
    }))
    .pipe(concat('style.css'))
    .pipe(gulp.dest('styles/'))
});

Whoa. What?

In the code block above, we’ve created a task called styles. This is our reference to our task. We can use this name in other Gulp tasks, or call it from the command line.
Inside the task wrapper, we write what is essentially our script for our task. The general format of the Gulp task wrapper is:
gulp.task('name-of-the-task', function() {
    // The guts go here
});
The return statement says that the styles task will return a value when it’s executed. The value in this case is our processed code.
We use a Gulp method called .src() to get and specify the input files we want to run the styles task on, which are the .scss files. By placing an asterisk (*) in the place of a specific filename, we are essentially saying, Go find any file that has an extension of .scss inside the styles directory.
gulp.task('styles', function() {
    return gulp.src('styles/*.scss')
});
Now, the beautiful part of Gulp. Chaining the processes we want to execute with Node’s pipe() method. The pipe() method allows us to pass code from one process to another. When one plugin has processed our .scss files, the output gets passed to the next plugin.
gulp.task('styles', function() {
    return gulp.src('styles/*.scss')
        .pipe(sass({
            'sourcemap=none': true
        }))
        .pipe(concat('style.css'))
        .pipe(gulp.dest('styles/'));
});
This is what our styles task does:
  1. Get and specify the files we want to process. For this, we use the .src()method to get and point to the .scss files inside the styles directory.
  2. Compile Sass files to CSS. Remember that we instantiated the sass() function earlier, which refers to the gulp-sass plugin.
  3. Combine all CSS style rules into one stylesheet. The gulp-concat plugin creates a stylesheet named style.css containing all of our CSS.
  4. Write the stylesheet in the styles directory. The style.css file will be placed in the styles directory. This is done with the .dest() method.

Running a task

Now the moment of truth. Running the task.
To run the task, first be sure that your working directory is where your gulpfile is. The following command won’t work otherwise.
Our Gulp task, as you may recall, is named styles. To run the styles task, issue this command:
gulp styles
Our styles task will run and it should compile our .scss files into a file calledstyle.css that will be placed inside the styles directory. Congrats!
One small problem though, it’s a bit arduous to switch back and forth between code and the command line to compile Sass every time we update our code.

Watching changes to your source files

Gulp has a built-in method called .watch(), that allows us to tell Gulp to look out for any changes to our source files. This way, whenever we update any of our .scss files, our styles task will automatically execute and recompile the styles.css file.
Let’s create another Gulp task to watch our source files. We’ll name this Gulp task as watch. Just like our styles task, we will create the watch task using the task wrapper.
gulp.task('watch', function() {
    // The guts goes here
});
This is what the watch task will do:
  1. Use Gulp’s .watch() method to monitor any changes to any of our .scss files.
  2. Whenever Gulp detects a change, our styles task will be executed.
gulp.task('watch', function() {
    gulp.watch('styles/*.scss', ['styles']);
});
Now, instead of running gulp styles whenever we want to compile our Sass, we can run gulp watch just once when we’re working on a project. Gulp will watch our Sass files for any change. When it sees that we have updated a Sass file, it will automatically run our styles task. This will happen whenever we save a .scss file.

Creating new tasks

Gulp has a massive community. It has over 1,400 plugins right now. We can improve our build process with these plugins.
Let’s create another Gulp task. This new task will analyse our JavaScript files to find common issues. For this Gulp task, we will lean on JSHint.
JSHint is a JavaScript code-quality analysis tool. JSHint will go over our JavaScript files with a fine-toothed comb and if it spots something problematic, it will print the issue in our command line.
To use JSHint, we can install and require a Gulp plugin called gulp-jshint.
First, let’s install the gulp-jshint plugin to our project.
npm install gulp-jshint --save-dev
Next, let’s amend our dependencies statement in our gulpfile:
var gulp = require('gulp'),
    sass = require('gulp-sass'),
    concat = require('gulp-concat'),
    jshint = require('gulp-jshint');
So now we have sass()concat() and jshint() at this point.
Let’s set up a task called jshint. This Gulp task will run gulp-jshint on .js files that are inside the js directory.
gulp.task('jshint', function() {
    return gulp.src('js/*.js')
        .pipe(jshint())
});
Our task doesn’t need to output any file. Instead, if JSHint catches any errors, we’ll be notified via our command line.
To run the task we can issue the following command:
gulp jshint
We can also add the jshint task to our watch task so we don’t have to manually call it whenever we make changes to our JavaScript files.
gulp.task('watch', function() {
  gulp.watch('styles/*.scss', ['styles']);
  gulp.watch('js/*.js', ['jshint']);
});

Adding processes to existing tasks

We can easily add more things to do for our existing tasks. Let’s do that now.
Let’s install a supplemental plugin that will give us a more readable output.
Run the following command to install the JSHint-stylish library to our project.
npm install jshint-stylish --save-dev
We can then modify our jshint task so that it uses jshint-stylish as our reporter.
gulp.task('jshint', function() {
    return gulp.src('js/*.js')
        .pipe(jshint())
        .pipe(jshint.reporter('jshint-stylish'))
});
Let’s run the jshint task:
gulp jshint
If JSHint discovers errors and code-quality issues, it will output it in our command line.
$ gulp jshint
[10:29:57] Starting 'jshint'...
\js\main.js
  line 2  col 7  Use '===' to compare with '0'.
  ‼  1 warning
[10:29:57] Finished 'jshint' after 93 ms

Auto-prefix CSS properties

Vendor-prefixing CSS properties is a lot of work and knowing what to prefix is a job all on it’s own.
Luckily there’s a package called Autoprefixer that will do all the hard work for us.
Install the gulp-autoprefixer plugin to your project with the following command.
npm install gulp-autoprefixer --save-dev
Append our dependencies statement to require the gulp-autoprefixer plugin.
var gulp = require('gulp'),
    sass = require('gulp-sass'),
    concat = require('gulp-concat'),
    jshint = require('gulp-jshint'),
    autoprefixer = require('gulp-autoprefixer');
Modify the styles task to pipe the gulp-autoprefixer plugin process.
gulp.task('styles', function() {
  return gulp.src('styles/*.scss')
    .pipe(sass({
      'sourcemap=none': true
  }))
    .pipe(concat('style.css'))
    .pipe(autoprefixer())
    .pipe(gulp.dest('styles/'));
});
To ensure that you’re targeting the right browsers, you can pass in a comma-seperated list of browsers to support.
gulp.task('styles', function() {
  return gulp.src('styles/*.scss')
    .pipe(sass({
      'sourcemap=none': true
    }))
    .pipe(concat('style.css'))
    .pipe(autoprefixer('last 2 version', 'safari 5', 'ie 8', 'ie 9', 'opera 12.1'))
    .pipe(gulp.dest('styles/'));
});
The above will support the last 2 versions of all browsers, Safari 5, IE 8 and 9 and Opera 12.1.
A full list of values you can pass in can be found here at Browserslist.

Putting it all together

At this point, we have three Gulp tasks that all serve a purpose in our build process:
  • styles – deals with processes related to our CSS
  • jshint – checks our JavaScript files
  • watch – automatically runs the styles and watch tasks whenever Gulp detects changes in our source files.
However, we can make one master task that accomplishes all of these in one go.
Right now, we could run gulp watch and it would start the watch task, which would in turn wait for us to make a change to our files.
However, what if we wanted the files to be compiled and checked immediately, and then watched for a change, all by simply typing gulp.
Within gulpfile.js, add a new task called default, but instead of using a function for the second argument, use an array.
gulp.task('default', []);
Within that array, we can pass in our tasks in the order we want them run.
gulp.task('default', ['styles', 'jshint', 'watch']);
Now when we run gulp in the command line in our project directory, it will:
  1. Compile our Sass to CSS
  2. Combine all our CSS into one file called styles.css
  3. Add vendor-prefixes to the appropriate CSS properties
  4. check our .js files for errors
  5. Watch our source files for changes and rerun our tasks automatically
Imagine having to do all of that manually. Every single time you update your source code. Not only is this build process tedious to do without a task runner, but it’s also prone to human error.
Here are the contents of our gulpfile:
// Dependencies
var gulp = require('gulp'),
    sass = require('gulp-sass'),
    concat = require('gulp-concat'),
    jshint = require('gulp-jshint'),
    autoprefixer = require('gulp-autoprefixer');
// Task: styles
gulp.task('styles', function() {
  return gulp.src('styles/*.scss')
    .pipe(sass({
      'sourcemap=none': true
    }))
    .pipe(concat('style.css'))
    .pipe(autoprefixer('last 2 version', 'safari 5', 'ie 8', 'ie 9', 'opera 12.1'))
    .pipe(gulp.dest('styles/'))
});
// Task: watch
gulp.task('watch', function() {
   gulp.watch('styles/*.scss', ['styles']);
});
// Task: jshint
gulp.task('jshint', function() {
  return gulp.src('js/*.js')
    .pipe(jshint())
    .pipe(jshint.reporter('jshint-stylish'));
});
// Default task
gulp.task('default', ['styles', 'jshint', 'watch']);

Moving forward

The Gulp ecosystem is massive and developers are creating new tools and plugins every day.
To see what plugins are available for you use, check out the Gulp Plugin Registry.

Grunt vs Gulp: Which One Should You Use?

Nobody likes doing boring and repetitive tasks. The good news is we can probably make our computer do them for us.
When it comes to web development build automation, there are two major players you will want to look at: Grunt and Gulp.
But, which one should you go with? What are the differences between them? Which one is better?
Let’s take a look at the similarities and differences between Grunt and Gulp in order to help you choose the right JavaScript task runner for you.
Grunt vs. Gulp

Similarities between Grunt and Gulp

Grunt and Gulp can automate tedious, human-error-prone build processes such as:
  • code minification
  • code-quality analysis
  • image optimization
  • vendor-prefixing
  • unit-testing
  • … and much more
Basically, if you’re doing something over and over again, there’s a huge chance that you can automate it using either Grunt or Gulp.
By integrating a task runner into our workflow, we avoid wasting time and energy on things our computer can do for us. Ultimately, this means we will be able to focus on stuff that matter most: Creation and innovation.
Think of a task runner as a framework for automating development tasks.
JavaScript web development frameworks like Angular and jQuery make it easier to write JavaScript code. Likewise, Grunt and Gulp make it easier to write build-automation code.
How does a task runner work? Simple. You write instructions that tell the task runner:
  1. which files you want it to process
  2. what you want it to do with the files (minify them, analyze them for errors, etc.)
  3. where you want it to place the processed files
Since Grunt and Gulp are JavaScript task runners, we write our instructions using JavaScript.
Here are step-by-step tutorials that will help you get started with Grunt and Gulp:
At first glance, Grunt and Gulp both seem quite alike.
And using either one of them leads to the same result: A more efficient web development workflow.
So, in the broader sense, Grunt and Gulp are identical in that:
  • They’re task runners that can automate portions of our development workflow
  • We write the tasks we want them to run using JavaScript
  • They both need Node and npm in order to work
The similarities end there. The way they are configured and their method for executing our tasks are different.

Differences between Grunt and Gulp

There are two main differences between Grunt and Gulp:
  • The way you configure your tasks. Grunt is configuration-based. Gulp is stream-based.
  • The way they run your tasks. Grunt runs the processes you want to execute in a sequential manner. Gulp tries to run them with maximum concurrency, meaning it will try to execute processes in parallel if possible.

Task Configuration

Let’s explore a major difference between Grunt and Gulp by way of an example.
We will create a task for Grunt and Gulp to do. This task will take a bunch of CSS files and optimize them to improve web performance.
Here is what the task will do:
  1. Combine all CSS files found inside the src directory into one big stylesheet
  2. Minify the stylesheet
  3. Placed the minified file into the css directory with the name ofstyles.min.css
  4. Report the task-execution time in the command line after the task has completed

Grunt Task Configuration

module.exports = function(grunt) {
  // Report the task-execution time in the command line
  require('time-grunt')(grunt);
  // Task configuration
  grunt.initConfig({
    pkg: grunt.file.readJSON('package.json'),
    // Combine all CSS files found inside the src directory
    concat_css: {
      dist: {
        src: ['src/*.css'],
        dest: 'css/styles.css'
      }
    },
    // Minify the stylesheet
    cssmin: {
      target: {
        // Write the minified file in the css directory
        files: [{
          'css/styles.min.css': ['css/styles.css']
        }]
      }
    }
  });
  // Load the plugins
  grunt.loadNpmTasks('grunt-concat-css');
  grunt.loadNpmTasks('grunt-contrib-cssmin');
  // Use `grunt` command to run the task
  grunt.registerTask('default', ['concat_css', 'cssmin']);
}

Gulp Task Configuration

// Load the plugins
var gulp = require('gulp');
var concatenate = require('gulp-concat-css');
var minify = require('gulp-cssmin');
var duration = require('gulp-duration');
// Task configuration
gulp.task('default', function() {
  gulp.src('src/*.css')
  // Combine all CSS files found inside the src directory
  .pipe(concatenate('styles.min.css'))
  // Minify the stylesheet
  .pipe(minify())
  // Report the task-execution time in the command line
  .pipe(duration('Execution Time: '))
  // Write the minified file in the css directory
  .pipe(gulp.dest('css/'));
});
// Use `gulp` command to run the task

Task Configuration Difference

Gulp’s syntax is terser. The great thing about Gulp is the stream-based build system. You just create your tasks by piping in all of your processes, one after another. Sort of like how we can chain methods on the selector function in jQuery.
The magic happens because of the object format that plugins exchange, the so called Vinyl. Vinyl is just an abstraction that describes a virtual file object—one that could refer to an existing file on the FS, a stream, or simply dead-ends with a null.
— Preslav Rachev
What I have found was most of the tasks I create with Gulp result in a much shorter and cleaner task configuration file. In other words, with Gulp, there is less code to write for doing the same processes.
You may think I’m biased — maybe a little — but I do use both Grunt and Gulp. (I choose one over another depending on the type of project I’m working on.)
The following table lists the Grunt and Gulp plugins used in the task.
ProcessGrunt PluginGulp Plugin
concatenationgrunt-concat-cssgulp-concat-css
minificationgrunt-contrib-cssmingulp-cssmin
Display task-execution speed in the command linetime-gruntgulp-duration

Task Execution

The manner in which a task is executed is different in Grunt vs. Gulp.

How Grunt Executes a Task

For each process in a task, Grunt needs to:
  1. Open the processed file from the last process
  2. Run the current process
  3. Save the changes
  4. Close the current processed file so that the next process can access it

How Gulp Executes a Task

Gulp, on the other hand, doesn’t need the intermediary steps of creating temporary files in between processes.
The code that comes out of a process goes directly into the next one, saving a lot of I/O time. That’s why it’s “stream-based”.
Gulp uses Orchestrator, which helps it run processes with maximum concurrency. This means Gulp will try to perform processes simultaneously. Theoretically, this allows Gulp to finish tasks faster.

Measuring Task-Execution Speed

You can test the speed difference between Grunt and Gulp. They can both report the time it takes to complete tasks.
To measure the execution speed of the tasks we created earlier, the time-grunt and gulp-duration plugins were used.
The Grunt task and the Gulp task were executed five times each.
The same source files were used (three CSS files).
The destination directory (i.e. the css directory) was removed from the machine in between each task execution. This way, the task runners are required to write to disk each time the task was executed.
Be careful when interpreting the results of the following data. Many factors can affect the results, such as the variances between the Grunt and Gulp plugins for concatenating, minifying, and reporting execution speed.
Grunt Task-Execution Speeds
Test 1915ms
Test 2941ms
Test 3908ms
Test 4994ms
Test 5938ms
Average Time939.2ms
Gulp Task-Execution Speeds
Test 1229ms
Test 2229ms
Test 3226ms
Test 4225ms
Test 5221ms
Average Time226ms
In this particular case, Gulp was able to execute the CSS optimization task 4x faster than Grunt.
For simple tasks, you’ll never notice the difference. But for complex build-automation tasks that take minutes to complete, this might be an issue. You don’t want to wait around longer than you have to.
It’s worth pointing out that there is a new version of Grunt on the way. It will use Orchestrator too. This will most likely lead to task-execution speed improvements.
Check out this blog post where Zander Martineau made a speed comparison test of Grunt vs. Gulp. He similarly reports that Gulp was able to complete tasks quicker than Grunt.
Source: tech.tmw.co.uk

Grunt vs Gulp Stats

Project Start Date

The Grunt project started in late-2011. It took the project about a year to get noticed. Since it was the first to arrive in the market, it has a larger user-base compared to Gulp.
Gulp entered the scene in mid-2013. It only got noticed in the beginning of 2014. Since then, the number of adopters have been ramping up.

Usage

To get an idea of how many developers use Grunt and Gulp, we can look at the npm download stats for the grunt and gulp packages.
Since downloading the grunt and/or gulp package is the first step to using the task runners, this is a decent starting point for attempting to quantify how many people use Grunt and Gulp.
However, the “download” metric has several flaws for comparative purposes. Some developers might be using both Grunt and Gulp. Gulp has released more version updates compared Grunt, and the might lead to increased download rates due to people updating their software. This measurement only tells part of the story.
The following data is from npm-stat — a tool that reports statistics about npm packages.

Grunt Usage Stats

Total downloads14 million
Number of downloads last month1.3 million
Average number of downloads per day42,075

Gulp Usage Stats

Total downloads5.9 million
Number of downloads last month~929,000
Average number of downloads per day32,479

Amount of Plugins

Plugins are the bread-and-butter of task-configuration. Although you can certainly write your own processes to automate, it’s much easier to use a pre-existing one if it already exists.
Both Grunt and Gulp have official plugin directories on their site.They both display the number of plugins listed in their respective plugin directories.
Grunt has 4,663 plugins.
Gulp has 1,561 plugins.
Clearly, Grunt has more plugins than Gulp, with nearly 3x more plugins compared to its the latter. Keep in mind that Grunt has a bit of a head start, so having more plugins is to be expected.

Development Activity

When relying on a piece of software, it’s a good idea to look at how frequently it gets updated.
You want to use tools that are being quickly and continually improved via bug fixes, patches for security vulnerabilities, and feature enhancements.
By looking at the GitHub repositories of Grunt and Gulp, we can gain insights about the level of development activity these two open source projects have. That’s because GitHub displays the number of commits, releases, and contributors.
Commits occur whenever the source code has been updated. This can be a good signifier of how active the developers of the project are when it comes to fixing bugs and adding/improving features.
In software, releases refer to distinct stages of development. For example (using semantic versioning conventions) v1.0.0 is the first stable release. v2.1.2 is a more mature release. The number of releases can show how often the software is updated. It can give us a clue on how responsive the project’s developers are when vulnerabilities and other issues are found.
Contributors are the hard-working people who contribute code to the project. More GitHub users contributing to the project can mean that there are more people reviewing the project’s source code, more people that can help develop the project, and a greater chance that someone can/will take over if the creators of the project decide they no longer wish to work on the project.
The tricky thing about using these metrics to measure software development activity is that each project may have unique policies for committing source code and releasing updates. Also, they may have certain requirements and guidelines that affect the number of people contributing code to the project. Also, as open source projects mature, there will naturally be fewer bugs to fix and features to add. So, theoretically, the rate of commits and releases will decrease as the project gets older.
But at least we can use these numbers to get a rough feel for how often the developers of Grunt and Gulp update their respective repos.

Grunt Development Activity Stats

Commits1,310
Releases8
Contributors54

Gulp Development Activity Stats

Commits814
Releases14
Contributors135
The good news is both Grunt and Gulp are healthy in terms of development activity.
At the time of writing, Grunt had a commit five days ago, while Gulp had one four days ago.
Grunt’s lastest release was close to 11 months ago. Gulp’s last release is more recent, about  3 months ago.
Where they differ most is in the number of developers contributing to the project.Gulp has 2.5x more developers working on the project.

Popularity

In GitHub, you can quantify the amount of people who are interested in a repository by looking at the Watch, Star, and Fork metrics.
The Watch metric is the number of GitHub users actively monitoring the activities in a repo.
The Star metric is the number of GitHub users who have “favorited” the repository.
The Fork metric shows the number of GitHub users who have copied the project to their own GitHub account.
These metrics can give us insights about the popularity of a project on GitHub.

Grunt Popularity Stats

Watchers563
Stars9,466
Fork1,120

Gulp Popularity Stats

Watchers653
Stars13,540
Fork1,240
Even though Grunt is older than Gulp, we can see just by the number of stars, watchers, and forks that Gulp is more popular right now.

Data Sources

Stats were obtained on May 11, 2015. The average number of downloads per day were calculated based on stats from May 1-7, 2015.
Sources:

Conclusion

So, should you use Grunt or Gulp?
Honestly, that’s up to you. It’s tough to say.
One isn’t better than the other. They’re the same type of tool that can do the same job. So it will come down to personal preferences.
But let me share with you how I use Grunt and Gulp, in case you are wondering, and also to illustrate that you don’t have to pledge your allegiance to just one of them.
I use Grunt for my Angular projects. Mainly because of the Yeoman generator for AngularJS plugin that scaffolds my app just the way I like. There’s also a Gulp version for this, generator-gulp-angular, but I didn’t like it. So I keep using Grunt for Angular projects. I make some small tweaks and updates on my task configurations if needed.
I mainly use Gulp for my Laravel projects and some small websites. Basically, if I can’t find a Yeoman generator that suits me, I’ll make it from scratch using Gulp. Gulp, in my opinion, is much simpler to use and configure.
Hopefully the information you have read here will help you decide between Grunt or Gulp.