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的解决方案,我创建了一个
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); } }); |
然后,您可以从其他任何地方来
另一个选项是使用包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,它结合了最流行的软件包中的功能。
最流行的
其次,受欢迎,
1 | var libs = require('require-all')(__dirname + '/lib'); |
这里提到的
使用
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。
它递归地要求给定目录及其子目录中的所有文件,只要它们与
它还允许指定一个文件过滤器,以及如何从文件名派生返回哈希的键。
我知道这个问题已经5岁多了,而且给出的答案很好,但是我想要一些更强大的东西来表达,所以我为NPM创建了
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动词,以及特殊的
- 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'); |