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

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

需要这样的东西:

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

当require被给定文件夹的path时,它将在该文件夹中查找index.js文件; 如果有的话,那就使用它,如果没有,就会失败。

这可能是最有意义的(如果你有对文件夹的控制)来创build一个index.js文件,然后分配所有的“模块”,然后只是要求。

yourfile.js

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

index.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 

我build议使用glob来完成这个任务。

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

基于@ tbranyen的解决scheme,我创build了一个index.js文件,在当前文件夹下载入任意的javascript作为exports一部分。

 // Load `*.js` under current directory as properties // ie, `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这个目录。

另一个select是使用包require-dir ,让你做下面的事情。 它也支持recursion。

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

我有一个文件夹/字段,每个文件都有一个类,例如:

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

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

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

还有一个选项是require-dir-all结合了大多数常用软件包的特性。

最stream行的require-dir没有过滤文件/目录的选项,也没有map函数(见下文),但使用小技巧来查找模块的当前path。

其次,受欢迎程度的require-all都有正则expression式过滤和预处理,但缺乏相对path,所以你需要使用__dirname (这有利弊):

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

这里提到require-index是相当简约的。

有了map你可以做一些预处理,比如创build对象并传递configuration值(假设模块在导出构造函数的下面):

 // 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`. 

我一直在使用这个确切用例的模块是require-all 。

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

它还允许指定文件filter以及如何从文件名中派生返回的哈希键。

我知道这个问题已经有5年多了,给出的答案是好的,但是我想要一些快速的function,所以我创build了npm的express-map2软件包。 我打算简单地将它命名为express-map ,但是雅虎的用户已经有了这个名字的软件包,所以我不得不重新命名我的软件包。

1.基本用法:

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

控制器用法:

 //single function module.exports = function(req,res){ }; //export an object with multiple functions. module.exports = { foo: function(req,res){ }, bar: function(req,res){ } }; 

2.高级用法,带前缀:

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

正如你所看到的,这样可以节省大量的时间,并且使你的应用程序的路由变得简单,以便编写,维护和理解。 它支持所有expression支持的http动词,以及特殊的.all()方法。

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

我正在使用节点模块“复制到”模块来创build单个文件来需要我们的基于NodeJS的系统中的所有文件。

我们的实用程序文件的代码如下所示:

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

在所有的文件中,大部分函数都是以导出方式写的,如下所示:

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

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

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

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

  • 要求只有名称的选定文件或所有文件。
  • 没有必要的absoulutepath。
  • 易于理解和使用。

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

在目录app / lib中

example.js:

 module.exports = function (example) { } 

例如,2.js:

 module.exports = function (example2) { } 

在目录应用程序中创buildindex.js

index.js:

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