Docs: Add "Using Plugins" documentation · gulpjs/gulp@233c3f9

1+

<!-- front-matter

2+

id: using-plugins

3+

title: Using Plugins

4+

hide_title: true

5+

sidebar_label: Using Plugins

6+

-->

7+8+

# Using Plugins

9+10+

Gulp plugins are [Node Transform Streams][through2-docs] that encapsulate common behavior to transform files in a pipeline - often placed between `src()` and `dest()` using the `.pipe()` method. They can change the filename, metadata, or contents of every file that passes through the stream.

11+12+

Plugins from npm - using the "gulpplugin" and "gulpfriendly" keywords - can be browsed and searched on the [plugin search page][gulp-plugin-site].

13+14+

Each plugin should only do a small amount of work, so you can connect them like building blocks. You may need to combine a bunch of them to get the desired result.

15+16+

```js

17+

const { src, dest } = require('gulp');

18+

const uglify = require('gulp-uglify');

19+

const rename = require('gulp-rename');

20+21+

exports.default = function() {

22+

return src('src/*.js')

23+

// The gulp-uglify plugin won't update the filename

24+

.pipe(uglify())

25+

// So use gulp-rename to change the extension

26+

.pipe(rename({ extname: '.min.js' }))

27+

.pipe(dest('output/'));

28+

}

29+

```

30+31+

## Do you need a plugin?

32+33+

Not everything in gulp should use plugins. They are a quick way to get started, but many operations are improved by using a module or library instead.

34+35+

```js

36+

const { rollup } = require('rollup');

37+38+

// Rollup's promise API works great in an `async` task

39+

exports.default = async function() {

40+

const bundle = await rollup.rollup({

41+

input: 'src/index.js'

42+

});

43+44+

return bundle.write({

45+

file: 'output/bundle.js',

46+

format: 'iife'

47+

});

48+

}

49+

```

50+51+

Plugins should always transform files. Use a (non-plugin) Node module or library for any other operations.

52+53+

```js

54+

const del = require('delete');

55+56+

exports.default = function(cb) {

57+

// Use the `delete` module directly, instead of using gulp-rimraf

58+

del(['output/*.js'], cb);

59+

}

60+

```

61+62+

## Conditional plugins

63+64+

Since plugin operations shouldn't be file-type-aware, you may need a plugin like [gulp-if][gulp-if-package] to transform subsets of files.

65+66+

```js

67+

const { src, dest } = require('gulp');

68+

const gulpif = require('gulp-if');

69+

const uglify = require('gulp-uglify');

70+71+

function isJavaScript(file) {

72+

// Check if file extension is '.js'

73+

return file.extname === '.js';

74+

}

75+76+

exports.default = function() {

77+

// Include JavaScript and CSS files in a single pipeline

78+

return src(['src/*.js', 'src/*.css'])

79+

// Only apply gulp-uglify plugin to JavaScript files

80+

.pipe(gulpif(isJavaScript, uglify()))

81+

.pipe(dest('output/'));

82+

}

83+

```

84+85+

## Inline plugins

86+87+

Inline plugins are one-off Transform Streams you define inside your gulpfile by writing the desired behavior.

88+89+

There are two situations where creating an inline plugin is helpful:

90+

* Instead of creating and maintaining your own plugin.

91+

* Instead of forking a plugin that exists to add a feature you want.

92+93+

```js

94+

const { src, dest } = require('gulp');

95+

const uglify = require('uglify-js');

96+

const through2 = require('through2');

97+98+

exports.default = function() {

99+

return src('src/*.js')

100+

// Instead of using gulp-uglify, you can create an inline plugin

101+

.pipe(through2.obj(function(file, _, cb) {

102+

if (file.isBuffer()) {

103+

const code = uglify.minify(file.contents.toString())

104+

file.contents = Buffer.from(code)

105+

}

106+

}))

107+

.pipe(dest('output/'));

108+

}

109+

```

110+111+

[gulp-plugin-site]: https://gulpjs.com/plugins/

112+

[through2-docs]: https://github.com/rvagg/through2

113+

[gulp-if-package]: https://www.npmjs.com/package/gulp-if