前言

之前在看许多站点的源代码时,类似这样的代码总是屡见不鲜:

1
2
3
4
5
6
7
8
9
10
11
12
var sign = require('./controllers/sign');
var site = require('./controllers/site');
var user = require('./controllers/user');
var message = require('./controllers/message');
var topic = require('./controllers/topic');
var reply = require('./controllers/reply');
var rss = require('./controllers/rss');
var staticController = require('./controllers/static');
var auth = require('./middlewares/auth');
var limit = require('./middlewares/limit');
var github = require('./controllers/github');
var search = require('./controllers/search');

这可以算是许多站点route文件里的小常态了,往往在一个文件(web_router.js)里引用另一个目录(./controllers与./middlewares)里的大量(甚至所有)js文件。这其实是一种不是很爽的编程体验。所以笔者这里自己动手写了一个以目录为单位来导入整个目录下所有module的小工具:dir-requirer,支持导入目录下所有的.js,.json.node文件(可自定义),并且返回一个与目录结构相同的对象,支持屏蔽指定文件及目录

以下是工具简介:

用途

dir-requirer是一个对nodejs自身的require方法的封装,使用它可以直接require一个目录,它会帮助你require指定目录下的
所有文件,并且返回一个与目录结构相同的对象,目录中被require的文件名即对象的方法名。

比如在当前目录下的dir文件夹的结构如下:

1
2
3
4
5
6
				  |-- inner2 -- d.json
|-- inner -- |
| |-- e.js
|-- a.js
dir -- |-- b.js
|-- c.json
1
2
3
4
var dr = require('dir-requirer')(__dirname);
var myDir = dr('./dir');
myDir.inner.e; //e.js中exports出的对象,相当于myDir.inner.e = require('./dir/inner/e');
cJson = myDir.c;//也可以调用json文件

安装

通过NPM即可安装使用:

1
$ npm install dir-requirer

调用:

1
var dr = require('dir-requirer')(__dirname);

使用

比如在当前目录下的dir文件夹的结构如下:

1
2
3
4
5
6
				  |-- inner2 -- d.json
|-- inner -- |
| |-- e.js
|-- a.js
dir -- |-- b.js
|-- c.json

dr(path,options)

参数:

  • path(String) - 指定要导入的路径
  • options(Object) - 可选的配置选项

options可选属性:

  • ext(Array) - 只导入指定扩展名的文件,如[‘.json’],默认为[‘.js’,’.json’,’.node’]
  • dirBlackList(Array) - 不导入指定目录名下的所有文件,如[‘inner2’],默认为[]
  • fileBlackList(Array) - 不导入指定文件,如[‘e.js’],默认为[]

例子:

1
2
3
4
5
6
7
8
9
10
11
var dr = require('dir-requirer')(__dirname);
var myDir = dr('./dir');
//如果目录'./dir'不存在,myDir将为undefined
//myDir对象将会拥有与'./dir'目录相同的结构,可以直接调用 myDir.a (即a.js文件exports出的对象/方法) ,
//myDir.c , myDir.inner.e , myDir.inner.inner2.d
var myDir = dr('./dir',{ext:['.json']});
//将只会require目录下的所有json文件,如 myDir.inner.inner2.d , myDir.c
var myDir = dr('./dir',{dirBlackList:['inner2']});
//将不会require在inner2目录下的所有文件(包括子目录)
var myDir = dr('./dir',{dirBlackList:['inner'],fileBlackList:['c.json']});
//将不会require在inner目录下的所有文件(包括子目录),以及名为c.json的单独文件

源码

https://github.com/DavidCai1993/dir-requirer