如何用JavaScript模块化代码?
我正在为CloudCode使用Parse.com javascript。我对成为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');
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调用直接放在具有依赖关系的模块中。