node.js require all files in a folder?

2019-01-01 06:05发布

问题:

How do I require all files in a folder in node.js?

need something like:

files.forEach(function (v,k){
  // require routes
  require(\'./routes/\'+v);
}};

回答1:

When require is given the path of a folder, it\'ll look for an index.js file in that folder; if there is one, it uses that, and if there isn\'t, it fails.

It would probably make most sense (if you have control over the folder) to create an index.js file and then assign all the \"modules\" and then simply require that.

yourfile.js

var routes = require(\"./routes\");

index.js

exports.something = require(\"./routes/something.js\");
exports.others = require(\"./routes/others.js\");

If you don\'t know the filenames you should write some kind of loader.

Working example of a loader:

var normalizedPath = require(\"path\").join(__dirname, \"routes\");

require(\"fs\").readdirSync(normalizedPath).forEach(function(file) {
  require(\"./routes/\" + file);
});

// Continue application logic here


回答2:

I recommend using glob to accomplish that task.

var glob = require( \'glob\' )
  , path = require( \'path\' );

glob.sync( \'./routes/**/*.js\' ).forEach( function( file ) {
  require( path.resolve( file ) );
});


回答3:

Base on @tbranyen\'s solution, I create an index.js file that load arbitrary javascripts under current folder as part of the exports.

// Load `*.js` under current directory as properties
//  i.e., `User.js` will become `exports[\'User\']` or `exports.User`
require(\'fs\').readdirSync(__dirname + \'/\').forEach(function(file) {
  if (file.match(/\\.js$/) !== null && file !== \'index.js\') {
    var name = file.replace(\'.js\', \'\');
    exports[name] = require(\'./\' + file);
  }
});

Then you can require this directory from any where else.



回答4:

Another option is to use the package require-dir which let\'s you do the following. It supports recursion as well.

var requireDir = require(\'require-dir\');
var dir = requireDir(\'./path/to/dir\');


回答5:

I have a folder /fields full of files with a single class each, ex:

fields/Text.js -> Test class
fields/Checkbox.js -> Checkbox class

Drop this in fields/index.js to export each class:

var collectExports, fs, path,
  __hasProp = {}.hasOwnProperty;

fs = require(\'fs\');    
path = require(\'path\');

collectExports = function(file) {
  var func, include, _results;

  if (path.extname(file) === \'.js\' && file !== \'index.js\') {
    include = require(\'./\' + file);
    _results = [];
    for (func in include) {
      if (!__hasProp.call(include, func)) continue;
      _results.push(exports[func] = include[func]);
    }
    return _results;
  }
};

fs.readdirSync(\'./fields/\').forEach(collectExports);

This makes the modules act more like they would in Python:

var text = new Fields.Text()
var checkbox = new Fields.Checkbox()


回答6:

One more option is require-dir-all combining features from most popular packages.

Most popular require-dir does not have options to filter the files/dirs and does not have map function (see below), but uses small trick to find module\'s current path.

Second by popularity require-all has regexp filtering and preprocessing, but lacks relative path, so you need to use __dirname (this has pros and contras) like:

var libs = require(\'require-all\')(__dirname + \'/lib\');

Mentioned here require-index is quite minimalistic.

With map you may do some preprocessing, like create objects and pass config values (assuming modules below exports constructors):

// Store config for each module in config object properties 
// with property names corresponding to module names 
var config = {
  module1: { value: \'config1\' },
  module2: { value: \'config2\' }
};

// Require all files in modules subdirectory 
var modules = require(\'require-dir-all\')(
  \'modules\', // Directory to require 
  { // Options 
    // function to be post-processed over exported object for each require\'d module 
    map: function(reqModule) {
      // create new object with corresponding config passed to constructor 
      reqModule.exports = new reqModule.exports( config[reqModule.name] );
    }
  }
);

// Now `modules` object holds not exported constructors, 
// but objects constructed using values provided in `config`.


回答7:

One module that I have been using for this exact use case is require-all.

It recursively requires all files in a given directory and its sub directories as long they don\'t match the excludeDirs property.

It also allows specifying a file filter and how to derive the keys of the returned hash from the filenames.



回答8:

I know this question is 5+ years old, and the given answers are good, but I wanted something a bit more powerful for express, so i created the express-map2 package for npm. I was going to name it simply express-map, however the people at yahoo already have a package with that name, so i had to rename my package.

1. basic usage:

app.js (or whatever you call it)

var app = require(\'express\'); // 1. include express

app.set(\'controllers\',__dirname+\'/controllers/\');// 2. set path to your controllers.

require(\'express-map2\')(app); // 3. patch map() into express

app.map({
    \'GET /\':\'test\',
    \'GET /foo\':\'middleware.foo,test\',
    \'GET /bar\':\'middleware.bar,test\'// seperate your handlers with a comma. 
});

controller usage:

//single function
module.exports = function(req,res){

};

//export an object with multiple functions.
module.exports = {

    foo: function(req,res){

    },

    bar: function(req,res){

    }

};

2. advanced usage, with prefixes:

app.map(\'/api/v1/books\',{
    \'GET /\': \'books.list\', // GET /api/v1/books
    \'GET /:id\': \'books.loadOne\', // GET /api/v1/books/5
    \'DELETE /:id\': \'books.delete\', // DELETE /api/v1/books/5
    \'PUT /:id\': \'books.update\', // PUT /api/v1/books/5
    \'POST /\': \'books.create\' // POST /api/v1/books
});

As you can see, this saves a ton of time and makes the routing of your application dead simple to write, maintain, and understand. it supports all of the http verbs that express supports, as well as the special .all() method.

  • npm package: https://www.npmjs.com/package/express-map2
  • github repo: https://github.com/r3wt/express-map


回答9:

I\'m using node modules copy-to module to create a single file to require all the files in our NodeJS-based system.

The code for our utility file looks like this:

/**
 * Module dependencies.
 */

var copy = require(\'copy-to\');
copy(require(\'./module1\'))
.and(require(\'./module2\'))
.and(require(\'./module3\'))
.to(module.exports);

In all of the files, most functions are written as exports, like so:

exports.function1 = function () { // function contents };
exports.function2 = function () { // function contents };
exports.function3 = function () { // function contents };

So, then to use any function from a file, you just call:

var utility = require(\'./utility\');

var response = utility.function2(); // or whatever the name of the function is


回答10:

Can use : https://www.npmjs.com/package/require-file-directory

  • Require selected files with name only or all files.
  • No need of absoulute path.
  • Easy to understand and use.


回答11:

If you include all files of *.js in directory example (\"app/lib/*.js\"):

In directory app/lib

example.js:

module.exports = function (example) { }

example-2.js:

module.exports = function (example2) { }

In directory app create index.js

index.js:

module.exports = require(\'./app/lib\');