Node.js 我可以用一条require语句加载多个文件吗?

Node.js 我可以用一条require语句加载多个文件吗?,node.js,Node.js,也许这个问题有点傻,但有可能用一条require语句加载多个.js文件吗?像这样: var mylib = require('./lib/mylibfiles'); 和使用: mylib.foo(); //return "hello from one" mylib.bar(): //return "hello from two" 在文件夹mylibfiles中将包含两个文件: One.js exports.foo= function(){return "hello from one";}

也许这个问题有点傻,但有可能用一条require语句加载多个.js文件吗?像这样:

var mylib = require('./lib/mylibfiles');
和使用:

mylib.foo(); //return "hello from one"

mylib.bar(): //return "hello from two"
在文件夹mylibfiles中将包含两个文件:

One.js

exports.foo= function(){return "hello from one";}
exports.bar= function(){return "hello from two";}
Two.js

exports.foo= function(){return "hello from one";}
exports.bar= function(){return "hello from two";}
我想在文件夹中放一个package.json来加载所有文件,但我不知道如何加载。我想的另一个办法是使用index.js再次导出所有内容,但我将复制工作

谢谢


p.D:我正在windows 7机器上使用nodejs v0.611

首先,使用
require
不会复制任何内容。它加载模块并缓存它,因此再次调用
require
将从内存中获取它(这样您可以在不与源代码交互的情况下动态修改模块-这有时是可取的,例如,当您希望在模块内存储db连接时)

另外,
package.json
不会加载任何内容,也不会与您的应用程序进行任何交互。它仅用于
npm

现在,您不能同时需要多个模块。例如,如果
One.js
Two.js
都定义了同名函数,会发生什么情况??还有更多的问题

但您可以做的是编写附加文件,比如
modules.js
,其中包含以下内容

module.exports = {
   one : require('./one.js'),
   two : require('./two.js'),
   /* some other modules you want */
}
然后你可以简单地使用

var modules = require('./modules.js');
modules.one.foo();
modules.two.bar();

是的,您可能需要一个文件夹作为一个模块,根据。假设您需要()一个名为
/mypack/
的文件夹

/mypack/
中,在
/lib/
目录中创建一个
package.json
文件和一个同名的
main
javascript文件

{
  "name" : "mypack",
  "main" : "./lib/mypack.js"
}
现在您可以使用
require('./mypack')
,节点将加载
/mypack/lib/mypack.js

但是,如果不包含此
package.json
文件,它可能仍然有效。如果没有该文件,节点将尝试加载
/mypack/index.js
,如果没有,则加载
/mypack/index.node


我的理解是,如果您已将程序拆分为多个javascript文件,但不想将它们连接起来进行部署,这可能会很有帮助。

我有一段代码需要多个模块,但它不会像您的帖子所建议的那样将它们聚集在一起。然而,这可以通过我发现的一个技巧来克服

function requireMany () {
    return Array.prototype.slice.call(arguments).map(function (value) {
        try {
            return require(value)
        }
        catch (event) {
            return console.log(event)
        }
    })
}
你就这么用它

requireMany("fs", "socket.io", "path")
哪个会回来

[ fs {}, socketio {}, path {} ]
如果未找到模块,将向控制台发送错误。它不会破坏节目。该错误将在数组中显示为未定义。阵列不会因为其中一个模块加载失败而变短

然后可以将这些数组元素绑定到变量名,如下所示:

var [fs, socketio, path] = requireMany("fs", "socket.io", "path")
它本质上与对象类似,但将键及其值分配给全局命名空间。因此,在您的情况下,您可以:

var [foo, bar] = requireMany("./foo.js", "./bar.js")
foo() //return "hello from one"
bar() //return "hello from two"

如果你想让它在出错时中断程序,只需使用这个修改过的版本,它更小

function requireMany () {
    return Array.prototype.slice.call(arguments).map(require)
}

我在做一件类似于@freakish在一个项目中建议的事情,在这个项目中,我有一个测试脚本列表,这些脚本被拉到一个木偶+笑话测试设置中。我的测试文件遵循命名约定testname1.js-testnameN.js,我可以使用生成器函数从特定目录中要求N个文件,方法如下:

const fs = require('fs');
const path = require('path');

module.exports = class FilesInDirectory {

    constructor(directory) {

        this.fid = fs.readdirSync(path.resolve(directory));
        this.requiredFiles = (this.fid.map((fileId) => {
            let resolvedPath = path.resolve(directory, fileId);
            return require(resolvedPath);
        })).filter(file => !!file);

    }

    printRetrievedFiles() {
        console.log(this.requiredFiles);
    }

    nextFileGenerator() {

        const parent = this;
        const fidLength = parent.requiredFiles.length;

        function* iterate(index) {
            while (index < fidLength) {
                yield parent.requiredFiles[index++];
            }
        }
        return iterate(0);
    }

}
您可以使用将从语句导出的模块数组映射到一行中:

const requires = (...modules) => modules.map(module => require(module));
const [fs, path] = requires('fs', 'path');

感谢您的帮助,问题是我正在尝试将一些方法作为内部方法,我不希望使用modules.js的模块可以访问这些函数。我认为在您的示例中,我还可以执行
var one=require(./one.js)
并获得与
one.js
相同的函数,是吗?更正:Node.js实际上读取了
package.json
文件的
main
字段,作为
require
过程的一部分。这是Node从中读取的唯一内容,其余信息用于
npm
。不过,需要明确的是,您不能要求将文件夹作为模块来加载该目录中的所有javascript文件。“对吗?”迈克尔说得对。它将只加载root
package.json
中的
main
的值,如果没有,则加载root
index.js
@Michael-动态加载整个代码文件目录在几乎所有语言中都有相同的问题:加载顺序应该是什么?按字母顺序排列的然后你会陷入一种奇怪的扭曲,在文件名上加上人工前缀来影响顺序。@xyz理想情况下,顺序并不重要——在我的例子中,这是真的,每个文件只是增加了功能,但实际上并不执行任何功能。