一个方法让node.js 自动加载某个目录的代码(省去require引用)
在写node.js引用的时候,常常面临下面的一个困扰...
不论是数据层,逻辑层,添加一个js文件或者暴露一个方法,当你想用的时候,在目标页必须 request 此文件才能使用被暴露的方法.
我们是不是可以写一个方法,自动加载某个指定文件夹下的js文件呢?
答案是肯定的.
这样的好处:
我只需要引用这个装载文件后(自动加载目录js 的代码文件) 以后随便你添加方法或者文件,都不影响之前的代码,从而就可以直接使用,是不是很爽....
下面来完成这个一劳永逸的代码文件.
var fs = require('fs'); var path = __dirname; var self = __filename.substring(__dirname.length + 1); var files = fs.readdirSync(path); files.forEach(function(filename) { if(filename == self) return; var pos = filename.lastIndexOf('.'); if(pos == -1) return; var filePrefix = filename.substr(0, pos); var filePostfix = filename.substr(pos + 1); if(filePrefix.length < 1 || filePostfix.length < 1 || filePostfix != 'js') return; var model = require(path + '/' + filePrefix); // 装载所有方法 Object.keys(model).forEach(function(key) { if(key != key.toLowerCase()) return; var method = model[key]; if(typeof method == 'function') { if(exports[key]) throw new Error('Repeated method name: ' + key + ' in file: ' + filename); exports[key] = method; } }); });
代码很简单,根据node.js的魔术变量获取目录下的所有js文件,然后读取这些文件内容,找到里面的 function 函数,然后 exports 暴露出来.
但是有一个缺点,同一个目录下的不同文件里不能有同名方法,你可以看到最后一个if 判断分支,会报错的,
是不是把这个判断去掉就可以在同目录下不同文件里写同名函数名了? 是的,不过这种做法太天真,代码很危险,因为最后一个同名函数会覆盖之前的.导致同名函数中只有最后一个能生效.
使用方法:
在我 方法层中 loader.js 实现了上面提到的代码,在其他调用地方如何使用呢?
假如我们想根据blogID获取BlogInfo实体.
先引用装载器.
直接调用 getBlogInfo 方法即可.
代码见github: https://github.com/zzhi191/demo/blob/master/loader.js