node.js 需要文件夹中的所有文件?

IT技术 javascript node.js directory require
2021-01-11 04:30:33

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

需要类似的东西:

files.forEach(function (v,k){
  // require routes
  require('./routes/'+v);
}};
6个回答

当 require 指定文件夹的路径时,它会在该文件夹中查找 index.js 文件;如果有,它会使用它,如果没有,它就会失败。

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

你的文件.js

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

索引.js

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

如果您不知道文件名,您应该编写某种加载程序。

加载器的工作示例:

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

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

// Continue application logic here
添加一些说明:当require给出文件夹的路径时,它会index.js在该文件夹中查找如果有,它会使用它,如果没有,它就会失败。参见github.com/christkv/node-mongodb-native一个真实世界的例子:index.js在根目录中有一个需要./lib/mongodb, 一个目录;./lib/mongodb/index.js'使该目录中的所有其他内容可用。
2021-04-06 04:30:33
@TrevorBurnham 补充一点,目录的主文件(即index.js)文件可以通过package.json该目录进行更改像这样:{main: './lib/my-custom-main-file.js'}
2021-04-07 04:30:33
谢谢,今天遇到了同样的问题,并想“为什么没有 require('./routes/*')?”。
2021-04-08 04:30:33
@RobertMartin 当您不需要任何导出的句柄时它很有用;例如,如果我只想将 Express 应用程序实例传递给一组将绑定路由的文件。
2021-04-09 04:30:33
require是一个同步函数,因此回调没有任何好处。我会使用 fs.readdirSync 代替。
2021-04-10 04:30:33

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

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

glob.sync( './routes/**/*.js' ).forEach( function( file ) {
  require( path.resolve( file ) );
});
使用 map() 保存链接: const routes = glob.sync('./routes/**/*.js').map(file => require( path.resolve( file ) ));
2021-03-17 04:30:33
它保存到哪些变量?var x = require('x') 什么是var x在这种情况下?
2021-03-19 04:30:33
最佳答案!比所有其他选项更容易,尤其是对于包含需要包含的文件的递归子文件夹。
2021-04-02 04:30:33
glob? 你的意思是glob-savior-of-the-nodejs-race最佳答案。
2021-04-05 04:30:33
每个人都应该使用这个答案;)
2021-04-11 04:30:33

基于@tbranyen 的解决方案,我创建了一个index.js文件,文件在当前文件夹下加载任意 javascripts 作为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);
  }
});

然后您可以require从其他任何地方访问该目录。

我知道这已经有一年多了,但实际上你也可以需要 JSON 文件,所以也许类似的东西/\.js(on)?$/会更好。也不是!== null多余的吗?
2021-04-06 04:30:33

另一种选择是使用require-dir,它可以让您执行以下操作。它也支持递归。

var requireDir = require('require-dir');
var dir = requireDir('./path/to/dir');
在 Sean 发表上述评论三年后,require-dir添加了一个filter选项。
2021-03-16 04:30:33
require-dir 现在是下载次数最多的(但值得注意的是,在撰写本文时它不支持文件排除)
2021-03-19 04:30:33
在 npm 中还有一些类似的包:require-all、require-directory、require-dir 等。下载最多的似乎是必需的,至少在 2015 年 7 月是这样。
2021-03-22 04:30:33
+1require-dir因为它会自动排除调用文件(索引)并默认为当前目录。完美的。
2021-04-09 04:30:33

我有一个文件夹 /fields 充满文件,每个文件都有一个类,例如:

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

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

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);

这使得module的行为更像它们在 Python 中的表现:

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