关于javascript:node.js需要文件夹中的所有文件?

node.js require all files in a folder?

如何要求node.js中文件夹中的所有文件?

需要这样的东西:

1
2
3
4
files.forEach(function (v,k){
  // require routes
  require('./routes/'+v);
}};


如果给定了某个文件夹的路径require,它将在该文件夹中查找index.js文件;如果有,则使用该文件;如果没有,则失败。

创建一个index.js文件,然后分配所有"模块",然后简单地要求它,这可能是最有意义的(如果您可以控制该文件夹)。

YouFiel.js

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

索引文件

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

如果你不知道文件名,你应该写一些加载程序。

装载机的工作示例:

1
2
3
4
5
6
7
var normalizedPath = require("path").join(__dirname,"routes");

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

// Continue application logic here


我建议使用glob来完成这项任务。

1
2
3
4
5
6
var glob = require( 'glob' )
  , path = require( 'path' );

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


基于@tbranyen的解决方案,我创建了一个index.js文件,将当前文件夹下的任意javascripts作为exports的一部分加载。

1
2
3
4
5
6
7
8
// 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);
  }
});

然后,您可以从其他任何地方来require这个目录。


另一个选项是使用包REQUEST DIR,让您执行以下操作。它也支持递归。

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


我有一个文件夹/字段,其中包含每个类的文件,例如:

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

将其放到fields/index.js中以导出每个类:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
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);

这使得模块的行为更像在Python中那样:

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

还有一个选项是REQUEST DIR ALL,它结合了最流行的软件包中的功能。

最流行的require-dir没有过滤文件/目录的选项,也没有map功能(见下文),但使用小技巧查找模块的当前路径。

其次,受欢迎,require-all有regexp过滤和预处理,但缺乏相对路径,因此需要使用__dirname(这有优点和缺点),如:

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

这里提到的require-index是非常简单的。

使用map可以进行一些预处理,如创建对象和传递配置值(假设下面的模块导出构造函数):

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
// 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`.


对于这个具体的用例,我一直使用的一个模块是RequireAll。

它递归地要求给定目录及其子目录中的所有文件,只要它们与excludeDirs属性不匹配。

它还允许指定一个文件过滤器,以及如何从文件名派生返回哈希的键。


我知道这个问题已经5岁多了,而且给出的答案很好,但是我想要一些更强大的东西来表达,所以我为NPM创建了express-map2包。我本来打算简单地把它命名为express-map,但是雅虎的员工已经有了一个同名的软件包,所以我不得不重新命名我的软件包。

1。基本用法:

1
2
3
4
5
6
7
8
9
10
11
12
13
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.
});

控制器用法:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
//single function
module.exports = function(req,res){

};

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

    foo: function(req,res){

    },

    bar: function(req,res){

    }

};

2。高级用法,带前缀:

1
2
3
4
5
6
7
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
});

如您所见,这节省了大量的时间,并使应用程序的路由变得非常简单,易于编写、维护和理解。它支持所有表示支持的HTTP动词,以及特殊的.all()方法。

  • NPM包:https://www.npmjs.com/package/express-map2
  • Github回购:https://github.com/r3wt/express-map

可使用:https://www.npmjs.com/package/require-file-directory

  • 只需要名为的选定文件或所有文件。
  • 不需要绝对路径。
  • 易于理解和使用。


我正在使用节点模块复制到模块来创建单个文件,以要求我们基于nodejs的系统中的所有文件。

实用程序文件的代码如下:

1
2
3
4
5
6
7
8
9
/**
 * Module dependencies.
 */


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

在所有文件中,大多数函数都是作为导出写入的,如下所示:

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

因此,要使用文件中的任何函数,只需调用:

1
2
3
var utility = require('./utility');

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

如果在目录示例("app/lib/*.js")中包含*.js的所有文件:

在目录app/lib中

JS:

1
module.exports = function (example) { }

示例2.JS:

1
module.exports = function (example2) { }

在目录app create index.js中

索引:

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