如何在路径中要求具有模式的模块?

时间:2015-03-21 07:41:53

标签: javascript node.js

如何在nodeJS中包含所有文件,如

require('./packages/city/model/cities')
require('./packages/state/model/states')
require('./packages/country/model/countries')

喜欢

require('./packages/*/model/*')

就像grunt正在加载文件一样。

3 个答案:

答案 0 :(得分:4)

你不能(或者至少你不应该)

为了做到这一点,你必须重载节点的本地require函数,这是非常不可取的。

CommonJS模式对你来说可能看起来很乏味,但它是一个非常好的模式,你不应该因为你看到其他语言/框架中的快捷方式而试图打破它。

通过在模块中引入某种形式的魔法,你会突然改变程序员可以(并且应该能够)安全地假设CommonJS模式本身的所有内容。

答案 1 :(得分:2)

由于节点模块加载系统中的一对一对应,本机不可能,但如果有这种方法的包,也不会感到惊讶。

您可以做的最好的事情是创建一个index.js,它可以加载目录中的模块,并将它们作为自己的模块导出。

module.exports = function() {
   return {
        city : require('./city/model/'),
        state : require('./packages/state/model/'),
        country : require('./packages/country/model/')
   }
} 

你也必须在所有三个dirrectories中以类似的方式加载模型。

我知道这个解决方案不是您想要的,但在我的实验中,这种方法可以更好地管理自定义包,因为您可以轻松添加/删除功能。

答案 2 :(得分:1)

Node.js的require允许你

  1. 一次只加载一个模块

  2. 仅以同步方式加载模块。

  3. 这就是模块系统在Node.js中的工作方式。但是如果你想拥有minimatch类型的匹配功能,你可以自己滚动一个,比如这个

    var path = require("path"),
        glob = require("glob");
    
    function requirer(pattern) {
        var modules = {},
            files = glob.sync(pattern);
    
        files.forEach(function(currentFile) {
            var fileName = path.basename(currentFile);
            fileName = fileName.substring(0, fileName.lastIndexOf(".js"));
            modules[fileName] = require(currentFile);
        });
    
        return modules;
    }
    

    这取决于glob模块,它允许您使用迷你匹配模式搜索文件,然后我们需要找到的文件,将它们存储在一个对象中并返回该对象。这可以像这样使用

    var modules = requirer('./packages/*/model/*.js');
    console.log(modules.cities);
    

    P.S:我正在努力使其成为public module