我如何专业地构建我的模块模式Javascript项目
How do I professionally structure my module-pattern Javascript projects?
我读过关于揭示模块模式的文章,我喜欢它。但是,对于"主对象"有数十个子对象和数百个函数的大型项目呢?我不想成为将所有代码放在一个匿名函数闭包中的人。
那么如何管理大型模块模式项目呢?
您可以使用扩充将模块分离到不同的文件中。准备好正式发布后,可以将这些文件连接成一个或多个文件。
文件 1 定义模块 M.n
var M = M || {};
M.n = M.n || {};
(function (self) {
self.doSomething = function () {
console.log("something");
};
})(M.n);
文件2定义模块M.n.p
var M = M || {};
M.n = M.n || {};
M.n.p = M.n.p || {};
(function (self) {
self.doSomethingElse = function () {
console.log("something else");
};
})(M.n.p);
现在在你的"主"脚本中,你可以自由地使用这些模块的成员。
M.n.doSomething();
M.n.p.doSomethingElse();
定义模块可能有点乏味,但您应该能够制作一些东西来自动化它。过去,我使用这个小脚本来帮助简化它,但请随意制作自己的脚本。您甚至可以使用一致的文件命名来烘焙依赖项管理。
var namespace = function(path, context, args) {
var finalLink = namespace._generateChain(path, window);
context.apply(finalLink, [finalLink].concat(args));
};
namespace._generateChain = function(path, root) {
var segments = path.split('.'),
cursor = root,
segment;
for (var i = 0; i < segments.length; ++i) {
segment = segments[i];
cursor = cursor[segment] = cursor[segment] || {};
}
return cursor;
};
要使用:
namespace("M.n.p", function (self) {
self.doSomethingElse = function () {
console.log("something else");
};
});
如果出于某种原因,您希望在不同的别名下包含一个变量,您可以将其传递给命名空间函数,它将作为参数传递给该函数。
namespace("M.n.p", function (self, $) {
self.doSomethingElse = function () {
$("p").text("something else");
};
}, jQuery);
使用 RequireJS 来组织事物。 对于共享逻辑,共享方法必须存储在全局可访问的命名空间中,或通过 require() 访问。 我不喜欢对应用程序代码进行许多 require() 调用,所以我将模块包含在块中,并且每个模块都通过定义包含附加到特定的命名空间。
//Core.js
define(function(){
return {
ns: 'global namespace'
};
});
//newMethod.js
define(['core'], function( ns ){
ns.newMethod = function(){ console.log( 'my new method ' ); }
});
//Application code
require(['newMethod'], function( namespace ) {
console.log( namespace.ns ); //global namespace
namespace.newMethod(); //'my new method'
});
相关文章:
- Javascript,访问一个主要对象模块模式中的每个对象
- 模块模式和这个
- 显示模块模式在Knockout中设置模型的新实例
- Javascript中的模块模式和揭示模块模式是否仅在创建API时有用;s
- JavaScript模块模式-如何在使用对象/函数之前激发构造函数/init函数
- TypeScript代码类似于揭示模块模式结构
- 为什么在javascript中的模块模式中实现Lazy函数时范围会发生变化
- JavaScript:模块模式差异
- 显示模块模式中的私有成员
- 如何将window.setTimeout与javascript和模块模式一起使用
- j查询模块模式未命名 |如何访问“$”
- 挖空和显示模块模式的数据绑定问题
- 传递参数时如何避免模块模式中的 getter/setter 函数
- JavaScript 模块模式给出了意想不到的结果
- 从模块模式开始
- 试图通过模块模式在DOM元素上实现change()事件
- 揭示模块模式、KnockoutJS和CoffeeScript
- 使用模块模式时访问父作用域中的变量
- 模块模式:函数未定义
- 如何用模块模式扩展javascript中的事件委派