如何在JavaScript中模块化代码
How do I modularize my code in JavaScript?
我正在为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;
});
});
在User模块中,导出的函数将是这样的。
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;
});
});
用户模块将如下所示。
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.js
和user.js
都在cloud
目录中。
然而,您在代码中所做的操作看起来更像是依赖项注入。在编码时,您可能想要进行依赖项注入有几个原因(但是,在向代码库添加一层复杂性之前,请确认您已经这样做了)。Node的module.require
实现了模块模式,这使得DI过时。
依赖注入的主要原因之一是测试。您可以通过使用一个名为proxyquire的方便库来更改require
返回的内容,从而避免使用依赖注入库/框架。
如果你有其他理由做DI(例如,如果你仍然对代码的耦合感到不舒服,或者其他什么),有些人已经为它编写了库。请检查这个SO问题。
- 聚合物是一个框架而不是一个库.如何模块化地使用web组件
- 使用Ampersand.js路由模块化应用程序
- 性能与模块化:将JS集成到PHP或单独的custom.JS中
- 将broccoliJS与当前使用requireJS的模块化主干应用程序结合使用,我想完全放弃requireJS
- 用于多个选项卡和模块化的knockoutjs设计模式
- 编写在浏览器和node.js中运行的模块化ECMAScript
- 在Meteor中重新初始化代码
- 模块化&重用使用ExtJS编写的代码
- 使用模块化CSS与Bootstrap 4和React
- 构建模块化谷歌地图应用程序
- 模块化模块?需要父模块中的部分
- 为什么模块化幂函数在 Python 和 Javascript 中对于大数字的工作方式不同
- 模块化与性能与性能与角度应用程序中的ng-include
- 如何在nodejs中模块化代码
- 是否可以包含许多.js文件以使我的代码看起来模块化
- 如何使我的前端Javascript代码更加模块化
- 如何使用需求来模块化这个代码片段
- 如何更模块化地编写jQuery代码
- 如何在JavaScript中模块化代码
- 我可以模块化我的javascript代码像这样