我可以用一个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";}
Two.js
exports.bar= function(){return "hello from two";}
我正打算把一个package.json文件夹加载所有的文件,但我不知道如何。 我正在考虑的其他的aproach是有一个index.js输出的一切,但我会重复工作。
谢谢!!
PD:我正在使用windows 7机器上的nodejs v0.611
首先使用require
不会重复任何东西。 它加载模块并将其caching起来,所以再次调用require
会从内存中获取它(因此,您可以在不进行源代码交互的情况下修改模块 – 有时候这是需要的,例如,当您想要在模块中存储数据库连接时) 。
另外, 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/
的文件夹。
在./lib/
目录下,在./lib/
目录下创build一个name
“ ./mypack/
”的文件夹和一个名字相同的main
javascript文件。
{ "name" : "mypack", "main" : "./lib/mypack.js" }
现在你可以使用require('./mypack')
,节点将加载./mypack/lib/mypack.js
。
但是,如果你不包含这个package.json
文件,它可能仍然有效。 如果没有该文件,节点将尝试加载./mypack/index.js
,或者如果不存在,./ ./mypack/index.node
。
我的理解是,这可能是有益的,如果你已经把你的程序分成许多JavaScript文件,但不想连接它们进行部署。
我有一个需要多个模块的代码片段,但是它不会像你的post所build议的那样把它们聚集在一起。 但是,这可以用我发现的一个技巧来克服。
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 {} ]
如果找不到模块,则会向控制台发送错误。 它不会中断程序。 该错误将在数组中显示为未定义。 数组不会更短,因为其中一个模块加载失败。
然后,你可以将这些数组元素中的每一个绑定到一个variables名称,如下所示:
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) }