How to manage multiple JS files server-side with Node.js
我正在使用Node.js进行项目,并且服务器端代码越来越大,我想将其拆分为多个文件。似乎已经在客户端完成了很长时间,开发是通过为每个文件插入script标记来完成的,并且仅用于分发,就像" Make"之类的用于将所有内容组合在一起。我意识到,容纳所有服务器端代码毫无意义,所以我不问如何做到这一点。我能找到的最接近的东西是require(),但是它的行为不像script在浏览器中那样,因为要求文件不共享公共命名空间。
看看一些较旧的Node.js项目,例如Shooter,似乎曾经不是这种情况,或者我的代码中缺少一些非常简单的东西。我的required文件无法在编译时或运行时访问全局调用名称空间。有什么简单的方法可以解决这个问题,还是我们必须使所有需要的JS文件完全独立于调用范围?
您不希望使用通用名称空间,因为全局变量是邪恶的。在节点中,我们定义模块
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18
| // 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对象。同样,您不想使用全局变量。
- 感谢您提供的信息,将其标记为正确。我通常同意globals ==邪恶的概念,但似乎他们确实有自己的位置。例如,如果我有一个基础属性要为给定的" class"设置,而该属性取决于其他地方的值,该怎么办?例如:SomeClass.prototype.baseProp = SomeOtherClass.prototype.prop * 2;在这种情况下,我要么被迫通过构造函数在对象实例化时进行设置,要么按照您的建议使用global对象。我认为稍后可能是最合适的。
-
@XHR然后SomeClass对SomeOtherClass有依赖关系,而您require("SomeOtherClass")在SomeClass.js中。我的代码中只有一个全局变量。 global._ = require("underscore"),因为我在每个文件中都使用它。这是global的唯一用例。
是@Raynos答案,如果模块文件在包含它的文件旁边,则应该是
1
| var things = require("./someThings"); |
如果该模块在npm上发布并通过npm安装,或显式放入./node_modules/文件夹中,则
1
| var things = require("someThings"); |
是正确的。
-
如果您需要一个实际的节点模块(通过npm安装,安装在PROJECT_ROOT / node_modules下),则需要第二行代码。如果您需要自己的文件(即ROOT_DIR / models / thing.js),则需要执行第一行代码(尽管可以删除.js扩展名)。
-
我不是很肯定,但是您可以使用require对象的extensions属性来更改此行为。
-
为我工作。 :)