Recursively iterates over specified directory, require()
'ing each file, and returning a nested hash structure containing those modules.
Follow me (@troygoode) on Twitter!
$ npm install require-directory
A common pattern in node.js is to include an index file which creates a hash of the files in its current directory. Given a directory structure like so:
routes/index.js
uses require-directory
to build the hash (rather than doing so manually) like so:
var requireDirectory = require('require-directory'); module.exports = requireDirectory(module);
app.js
references routes/index.js
like any other module, but it now has a hash/tree of the exports from the ./routes/
directory:
var routes = require('./routes'); // snip app.get('/', routes.home); app.get('/register', routes.auth.register); app.get('/login', routes.auth.login); app.get('/logout', routes.auth.logout);
The routes
variable above is the equivalent of this:
var routes = { home: require('routes/home.js'), auth: { login: require('routes/auth/login.js'), logout: require('routes/auth/logout.js'), register: require('routes/auth/register.js') } };
Note that routes.index
will be undefined
as you would hope.
You can specify which directory you want to build a tree of (if it isn't the current directory for whatever reason) by passing it as the second parameter. Not specifying the path (requireDirectory(module)
) is the equivelant of requireDirectory(module, __dirname)
:
var requireDirectory = require('require-directory'); module.exports = requireDirectory(module, './some/subdirectory');
For example, in the example in the Usage section we could have avoided creating routes/index.js
and instead changed the first lines of app.js
to:
var requireDirectory = require('require-directory'); var routes = requireDirectory(module, './routes');
You can pass an options hash to require-directory
as the 2nd parameter (or 3rd if you're passing the path to another directory as the 2nd parameter already). Here are the available options:
Whitelisting (either via RegExp or function) allows you to specify that only certain files be loaded.
var requireDirectory = require('require-directory'), whitelist = /onlyinclude.js$/, hash = requireDirectory(module, {include: whitelist});
var requireDirectory = require('require-directory'), check = function(path){ if(/onlyinclude.js$/.test(path)){ return true; // don't include }else{ return false; // go ahead and include } }, hash = requireDirectory(module, {include: check});
Blacklisting (either via RegExp or function) allows you to specify that all but certain files should be loaded.
var requireDirectory = require('require-directory'), blacklist = /dontinclude\.js$/, hash = requireDirectory(module, {exclude: blacklist});
var requireDirectory = require('require-directory'), check = function(path){ if(/dontinclude\.js$/.test(path)){ return false; // don't include }else{ return true; // go ahead and include } }, hash = requireDirectory(module, {exclude: check});
require-directory
takes a function as the visit
option that will be called for each module that is added to module.exports.
var requireDirectory = require('require-directory'), visitor = function(obj) { console.log(obj); // will be called for every module that is loaded }, hash = requireDirectory(module, {visit: visitor});
The visitor can also transform the objects by returning a value:
var requireDirectory = require('require-directory'), visitor = function(obj) { return obj(new Date()); }, hash = requireDirectory(module, {visit: visitor});
var requireDirectory = require('require-directory'), renamer = function(name) { return name.toUpperCase(); }, hash = requireDirectory(module, {rename: renamer});
var requireDirectory = require('require-directory'), hash = requireDirectory(module, {recurse: false});
$ npm run lint $ npm test