如何使用Node.js管理服务器端的多个JS文件

Mat*_*nar 40 javascript development-environment node.js

我正在使用Node.js开发一个项目,服务器端代码变得越来越大,我想把它拆分成多个文件.它似乎已经在客户端完成了很长时间,通过script为每个文件插入一个标记来完成开发,并且仅用于分发类似于"Make"用于将所有内容放在一起.我意识到连接所有服务器端代码是没有意义的,所以我不会问如何做到这一点.我能找到的最接近的东西是require(),但是它的行为script与浏览器中的行为不同,因为要求的文件不共享公共名称空间.

看看一些较旧的Node.js项目,比如Shooter,看起来曾经不是这样,或者我在代码中遗漏了一些非常简单的东西.我的require'd文件在编译时和运行时都无法访问全局调用命名空间.有没有简单的方法或者我们是否被迫使所有需要的JS文件完全从调用范围中自治?

Ray*_*nos 59

你不需要一个通用的命名空间,因为全局变量是邪恶的.在节点中我们定义模块

// someThings.js

(function() {
    var someThings = ...;

    ...

    module.exports.getSomeThings = function() {
        return someThings();
    }

}());

// main.js

var things = require("someThings");
...
doSomething(things.getSomeThings());
Run Code Online (Sandbox Code Playgroud)

您可以定义一个模块,然后通过写入为您的模块公开一个公共API exports.

处理此问题的最佳方法是依赖注入.您的模块公开了一个init函数,并将依赖项的对象哈希传递给您的模块.

如果您真的坚持访问全局范围,那么您可以通过访问它global.每个文件都可以写入和读取global对象.你再次不想使用全局变量.

  • @XHR然后`SomeClass`依赖于`SomeOtherClass`并且你在SomeClass.js中需要("SomeOtherClass")`.我的代码中有一个全局变量.`global._ = require("下划线")`因为我使用_every_单个文件.这是`global`的唯一用例. (2认同)

mic*_*ong 34

重新@Raynos回答,如果模块文件在包含它的文件旁边,它应该是

var things = require("./someThings");
Run Code Online (Sandbox Code Playgroud)

如果模块已发布,并通过npm安装,或明确放入./node_modules/文件夹,那么

var things = require("someThings");
Run Code Online (Sandbox Code Playgroud)

是正确的.

  • 如果您需要实际的节点模块(通过npm安装,安装在PROJECT_ROOT/node_modules下),则需要第二行代码.如果您需要自己的文件(即ROOT_DIR/models/thing.js),则需要执行第一行代码(尽管可以剥离.js扩展名). (4认同)