如何用JavaScript模块化代码?

如何用JavaScript模块化代码?,javascript,node.js,parse-platform,Javascript,Node.js,Parse Platform,我正在为CloudCode使用Parse.com javascript。我对成为javascript专家没什么兴趣,但我需要做一些工作。我已经制定了一个模块化方案(划分为单独的文件),但似乎一定有更好的方法。在我的main.js中,我有这样的代码。main.js的唯一功能是调用并链接各个模块 var mods = {}; mods.functions = require('cloud/functions.js'); mods.user = require('cloud/user.js');

我正在为CloudCode使用Parse.com javascript。我对成为javascript专家没什么兴趣,但我需要做一些工作。我已经制定了一个模块化方案(划分为单独的文件),但似乎一定有更好的方法。在我的
main.js
中,我有这样的代码。
main.js
的唯一功能是调用并链接各个模块

var mods = {};

mods.functions = require('cloud/functions.js');
mods.user = require('cloud/user.js');

mods.functions.setMods(mods);
mods变量收集对每个模块的引用。然后,对于需要调用其他模块的每个模块,我调用该模块中的“setMods”,并将mods传递给它。在setMods中,模块获取它想要访问的任何其他模块的引用

然后每个模块都有这样的代码

exports.setMods = function (mods) {
    userMod =     mods.user;    
    constants =   mods.constants;    
};

Parse.Cloud.define("getRecoveryQuestion", function(request, response) 
{
    var p0 = userMod.lookupUserByEmail(request.params.email);
    var p1 = p0.then(function(user) {
            // result is a User
            // Now look for the password recovery question
            if (user) {
                // Found it
                var question = user.get("pwdRecoveryQuestion");
                response.success(question);
            } else {
                response.success(null);
            }
            return null;
        });
});
在用户模块中,导出的函数看起来是这样的

exports.lookupUserByEmail = function (email)
// returns null when not found
{ 
    var User = Parse.Object.extend("User");
    var query = new Parse.Query(User);

    query.equalTo("email", email);
    var p0 = query.first();
    var p1 = p0.then(
        function(result) {
            return result;
        }
    );
    return p1;
};

那么,有更好的解决方案吗?

没有必要在main.js中集中模块导入。node.js中的每个文件都是一个模块,很可能包含私有代码并导出接口。它可以根据需要导入任意多个模块。这是导入模块依赖项的更简单方法:

getRecoveryQuestion定义

var userMod = require('cloud/user.js'),
    constants = require('cloud/constants.js);

Parse.Cloud.define("getRecoveryQuestion", function(request, response) 
{
    var p0 = userMod.lookupUserByEmail(request.params.email);
    var p1 = p0.then(function(user) {
            // result is a User
            // Now look for the password recovery question
            if (user) {
                // Found it
                var question = user.get("pwdRecoveryQuestion");
                response.success(question);
            } else {
                response.success(null);
            }
            return null;
        });
});
用户模块将如下所示

exports.setMods = function (mods) {
    userMod =     mods.user;    
    constants =   mods.constants;    
};

Parse.Cloud.define("getRecoveryQuestion", function(request, response) 
{
    var p0 = userMod.lookupUserByEmail(request.params.email);
    var p1 = p0.then(function(user) {
            // result is a User
            // Now look for the password recovery question
            if (user) {
                // Found it
                var question = user.get("pwdRecoveryQuestion");
                response.success(question);
            } else {
                response.success(null);
            }
            return null;
        });
});
cloud/user.js

exports.lookupUserByEmail = function (email)
// returns null when not found
{ 
    var User = Parse.Object.extend("User");
    var query = new Parse.Query(User);

    query.equalTo("email", email);
    var p0 = query.first();
    var p1 = p0.then(
        function(result) {
            return result;
        }
    );
    return p1;
};
请记住,传递给
require
的是模块id。它可以是路径(如上图所示)或模块名称,将在项目根目录下的
节点\u modules
文件夹中查找。几个解析提供的模块将在他们的平台中为您提供。在前面的示例中,我假设
constants.js
user.js
都在
cloud
目录中

然而,您在代码中所做的看起来更像依赖项注入。在编码时,您可能希望执行依赖项注入有几个原因(但是,在向代码库添加一层复杂度之前,请确认您已经这样做了)。节点的
模块.require
实现了模块模式,这使得DI过时

依赖注入的主要原因之一是测试。您可以使用一个名为的方便的库来更改
所需的
返回的内容,从而避免使用依赖项注入库/框架


如果您有其他原因要进行DI(例如,如果您仍然对代码的耦合感到不舒服,或者其他什么),有些人已经为此编写了库。检查。

只是想澄清一下,您认为“问题”是什么?代码似乎已经模块化了?你不喜欢你目前的方法有什么?
我对成为javascript专家没什么兴趣,但我需要做一些。
真为你感到羞耻:(@Kevin B,我假设是node)require@Esteban也许对你的问题更直接的回答是,我可能希望每个模块都“需要”它使用的模块。在上面的方法中,main.js必须“需要”所有模块,然后将整个模块信息集分发回模块,以便每个模块都可以使用它想要的信息。我认为这是“更好的”如果每个模块都声明或获取它需要的任何模块。main.js获取然后分发的功能由其他环境中的底层语言/系统负责。谢谢。这是我最需要的。我遇到了这个()明确表示“需要”缓存对象,因此来自不同模块对requires的调用将返回同一个对象。我的印象是,不同的对象将返回到多个requires调用。这意味着我应该能够将requires调用直接放在具有依赖关系的模块中。