gulp-task-maker v2.0.0
gulp-task-maker
A small wrapper for gulp, which helps you separate task configuration (objects) and implementation (functions).
Some advantages:
- Creates
watchtasks automatically. - Helps you write tasks with sourcemaps, and better logging and system notifications!
- Reuse the same task with different configuration objects, to create multiple builds.
⚠ Requires Node.js 6.5 or later.
Install
Install gulp and gulp-task-maker as devDependencies:
npm install --save-dev gulp@4 gulp-task-maker@2Configure
Then in your gulpfile.js, use gulp-task-maker’s add method:
const gtm = require('gulp-task-maker')
const test = (config, tools) => {
console.log(config)
tools.done()
}
gtm.add(test, {
src: './src/*.js',
watch: true,
dest: './public',
})With this configuration, gulp-task-maker will create four gulp tasks:
build(runs allbuild_*tasks)watch(runs allwatch_*tasks)build_testwatch_test
We can run them on the command line, for example using npx (which comes with recent versions of Node and/or npm):
# run the "parent" build task
$ npx gulp build
# run a specific task
$ npx gulp build_testLet’s go back to our gulpfile.js. We could also:
- tell
gulp-task-makerto load theminifyJSfunction from a node script, - provide an array of config objects, instead of just one,
- and add any arbitrary config values we want on config objects.
Here is an updated example:
gtm.add('./tasks/minifyJS', [
{
src: [
'node_modules/jquery/dist/jquery.js',
'node_modules/some-other-lib/dist/some-other-lib.js'
],
dest: 'public',
bundle: 'vendor.js',
sourcemaps: '.'
},
{
src: 'src/*.js',
watch: true,
dest: 'public',
bundle: 'bundle.js',
sourcemaps: '.'
}
])Writing tasks
With the previous gulpfile.js, gulp-task-maker will load the module at ./tasks/minifyJS.js (or ./tasks/minifyJS/index.js). This module should export a function (and that function must be named, because we’re using its name for the gulp tasks’ names).
Here is a function that concatenates JS files, minifies the result, and writes it (plus a source map) to a destination folder.
const concat = require('gulp-concat')
const uglify = require('gulp-uglify')
module.exports = function minifyJS(config, tools) {
return tools.simpleStream(config, [
concat(config.bundle), // concatenate files
uglify() // minify JS
])
}If you’re used to gulp, you can see that we’re not using gulp.src and gulp.dest. Instead, we’re using tools.simpleStream which does this work for us, supports source maps, and logs file sizes. If we want the same result with gulp only, we have to write:
const gulp = require('gulp')
const concat = require('gulp-concat')
const plumber = require('gulp-plumber')
const sourcemaps = require('gulp-sourcemaps')
const size = require('gulp-size')
const uglify = require('gulp-uglify')
module.exports = function minjs(config, tools) {
// take some source files
return gulp.src(config.src)
// use gulp-plumber to log errors (to console + notifications)
.pipe(tools.catchErrors())
// start source maps
.pipe(sourcemaps.init())
// concatenate files
.pipe(concat(config.bundle))
// minify JS
.pipe(uglify())
// log resulting file names and size
.pipe(size())
// generate sourcemaps
.pipe(sourcemaps.write(config.sourcemaps))
// write resulting files to a directory
.pipe(gulp.dest(config.dest))
}This is a bit longer, as you can see.
Running tasks
Finally we can run the gulp command, and get a console output that looks like this:
$ npx gulp build
[13:37:21] Using gulpfile ~/Code/my-project/gulpfile.js
[13:37:21] Starting 'default'...
[13:37:21] Starting 'build_minifyJS'...
[13:37:22] ./public/ main.js 88.97 kB
[13:37:22] Finished 'build_minifyJS' after 1.12 s
[13:37:22] Finished 'build' after 1.13 sYou could also run a specific build task, which can be useful when you have many:
$ npx gulp build_minifyJS
...Or start the main watch task:
$ npx gulp watch
[13:37:49] Using gulpfile ~/Code/my-project/gulpfile.js
[13:37:49] Starting 'watch'...
[13:37:49] Starting 'watch_minifyJS'...Full API doc, debugging and more
For a complete guide on using gulp-task-maker’s API, see the API docs.