如何在JavaScript中模块化我的代码?

时间:2014-04-09 18:39:29

标签: javascript node.js parse-platform

我正在使用Parse.com javascript for CloudCode。我没兴趣成为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”并将mod传递给它。在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;
};

那么,这个问题有更好的解决方案吗?

1 个答案:

答案 0 :(得分:1)

没有必要在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;
        });
});

用户模块看起来像这样。

<强>云/ 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。它可以是路径(如上例所示)或将在项目根目录下的node_modules文件夹中查找的模块名称。几个Parse提供的模块将在他们的平台中为您提供。在前面的示例中,我假设constants.jsuser.js都位于cloud目录中。

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

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

如果你有其他理由去做DI(例如,如果你仍然觉得不舒服关于你的代码和耦合,或者其他什么),有些人已经为它编写了库。检查this SO question