Node.js 我可以用一条require语句加载多个文件吗?
也许这个问题有点傻,但有可能用一条require语句加载多个.js文件吗?像这样: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";}
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文件。“对吗?”迈克尔说得对。它将只加载rootpackage.json
中的main
的值,如果没有,则加载rootindex.js
@Michael-动态加载整个代码文件目录在几乎所有语言中都有相同的问题:加载顺序应该是什么?按字母顺序排列的然后你会陷入一种奇怪的扭曲,在文件名上加上人工前缀来影响顺序。@xyz理想情况下,顺序并不重要——在我的例子中,这是真的,每个文件只是增加了功能,但实际上并不执行任何功能。