我正在使用Node.js开发一个项目,服务器端代码变得越来越大,我想把它拆分成多个文件。它似乎已经在客户端完成了很长时间,通过为每个文件插入script
标记来完成开发,并且仅用于分发类似于“Make”用于将所有内容放在一起。我意识到连接所有服务器端代码是没有意义的,所以我不会问如何做到这一点。我能找到的最接近的东西是require()
,但它在浏览器中的行为与script
不同,因为要求的文件不共享公共名称空间。
查看一些较旧的Node.js项目,例如Shooter,似乎曾经不是这样,或者我在代码中遗漏了一些非常简单的东西。我的require'd文件在编译时和运行时都无法访问全局调用命名空间。有没有简单的方法或者我们是否被迫使所有需要的JS文件完全独立于调用范围?
答案 0 :(得分:59)
你不需要一个共同的命名空间,因为全局变量是邪恶的。在节点中我们定义模块
// someThings.js
(function() {
var someThings = ...;
...
module.exports.getSomeThings = function() {
return someThings();
}
}());
// main.js
var things = require("someThings");
...
doSomething(things.getSomeThings());
您可以通过写入exports
来定义模块,然后为您的模块公开公共API。
处理此问题的最佳方法是依赖注入。您的模块公开了init
函数,并将依赖项的对象哈希传递到您的模块中。
如果您真的坚持访问全球范围,那么您可以通过global
访问该范围。每个文件都可以写入和读取global
对象。你再次不想使用全局变量。
答案 1 :(得分:33)
re @Raynos answer,如果模块文件位于包含它的文件旁边,那么它应该是
var things = require("./someThings");
如果模块已在npm上发布,并通过npm安装,或明确放入./node_modules/
文件夹,那么
var things = require("someThings");
是对的。