Resolve dependency directives in assets, e.g.
@depend
(Juicer) or//= require
(Sprockets)). Inspired by grunt-concat-in-order. Useful in combination with gulp-concat.
First, install gulp-resolve-dependencies
as a development dependency:
npm install --save-dev gulp-resolve-dependencies
Then, add it to your gulpfile.js
(probably together with gulp-concat):
var resolveDependencies = require('gulp-resolve-dependencies');
var concat = require('gulp-concat');
gulp.task('js', function(){
gulp.src(['app/assets/js/main.js'])
.pipe(resolveDependencies({
pattern: /\* @requires [\s-]*(.*\.js)/g
}))
.on('error', function(err) {
console.log(err.message);
})
.pipe(concat())
.pipe(gulp.dest('dest/assets/js/'));
});
And use the directives in your JS files (dependencies can be nested, they are handled recursively):
/**
* @requires libs/jquery/jquery.js
* @requires ../modules/slideshow/slideshow.js
*/
(function(window, document, $, undefined) {
'use strict';
$(document).on('ready', function() {
$('.slideshow').slideshow();
});
})(window, document, jQuery);
Warning: This might not be very efficient (especially in case of nested dependencies). Some kind of caching mechanism could come in handy.
Circular dependencies are either silently ignored or emit an error. See options.ignoreCircularDependencies
below.
gulp.src
will not necessarily return files in a deterministic way. If this turns out to be an issue, using a plugin like gulp-sort
or gulp-order
right after gulp.src
might be an option for you. Thanks to @fabiospampinato for pointing this out.
Type: RegExp
The matching pattern (defaults to /\* @requires [\s-]*(.*?\.js)/g
).
Type: Function
Resolver for matched paths. Default:
function(match, targetFile) {
return path.join(path.dirname(targetFile.path), match);
}
Parameters:
match
{String} Matched file path (in the example above this would belibs/jquery/jquery.js
and../modules/slideshow/slideshow.js
, respectively)targetFile
{Vinyl file object} Currently parsed file (where the matches were found)
The path
package is available in this context.
Returning a falsy value will ignore the resolved path:
function(match, targetFile) {
// Ignore `/lib.js`
if (match.match(/\/lib\.js$/)) {
return null;
}
return path.join(path.dirname(targetFile.path), match);
}
Type: Boolean
Whether to log the resolved dependencies (defaults to false
).
Type: Boolean
Whether to just continue instead of emitting an error if circular dependencies are detected (defaults to false
).
Type: Array
Only dependencies matching this array of absolute paths will be included (defaults to []
).
Type: Array
Dependencies matching this array of absolute paths will be excluded (defaults to []
).
- @huang64: Circular dependencies
- @doronin: Path resolver option
- @goodforenergy: Relative file paths
- @adrianosanti: Outdated dependencies
- @Nauja: Include/exclude options