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