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

标签 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');

mods.functions.setMods(mods);

mods 变量收集对每个模块的引用。然后对于需要调用其他模块的每个模块,我在该模块中调用“setMods”并将模组传递给它。在 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 中的每个文件都是一个很可能拥有私有(private)代码并导出接口(interface)的模块。它可以根据需要导入任意数量的模块。这是导入模块依赖项的更简单方法:

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;
        });
});

用户模块看起来像这样。

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

但是,您在代码中所做的看起来更像是依赖注入(inject)。您可能出于多种原因希望在编码时进行依赖注入(inject)(但是,请在向代码库添加更多复杂层之前确认您这样做了)。 Node 的 module.require 实现了模块模式,这使得 DI 过时了。

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

如果您有其他理由进行 DI(例如,如果您仍然对代码的耦合感到不舒服,或其他),有些人已经为它编写了库。检查this SO question .

关于javascript - 如何在 JavaScript 中模块化我的代码?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22971264/

相关文章:

javascript - 三.JS:球形线框 Material /EdgesHelper控件

javascript - 无法得到我在 nodejs/mongoose/bluebird 中返回的 promise

ios - 如何在子类中设置只读属性?

ios - 错误提示 "contains number values but got a string"

javascript - 向 D3 中的现有 map 添加新路径

javascript - 如何使用由多行组成的 django 模板变量分配 javascript 变量?

node.js - 错误: Cannot find module 'xmldom'

node.js - npm install 好像不对

ios - 如何在 Parse 中识别与某个对象关联的用户?

javascript - 使用 select2 时如何删除 Materialise 的选择下拉列表?