gpt4 book ai didi

javascript - Javascript 模块模式和子模块初始化模式

转载 作者:可可西里 更新时间:2023-11-01 01:50:40 27 4
gpt4 key购买 nike

我正在开始一个新项目,我正在审查我的最佳实践以试图防止出现任何问题,同时也看看我养成了哪些坏习惯。

我对使用模块/子模块模式在 Javascript 中处理初始化序列的方式不太满意。

比方说,我的代码以这样的结尾

FOO.init()
FOO.module1.init()
FOO.module2.init()
FOO.module3.init()
FOO.module4.init()

在全局范围内。

我实际上是在做(为简洁起见省略了错误检查和细节):

var FOO = (function (me) {
me.init = function () {
for (var i in me.inits) {
me.inits[i]();
}
}

return me;
}(FOO || {}));

var FOO = (function (parent) {
var me = parent.module1 = parent.module1 || {};

me.init = function () {
}

parent.inits.push(me.init);

return parent;
}(FOO || {}));

$(document).ready(FOO.init);

用于初始化。

我知道我之前已经阅读过这方面的内容,但我现在想不出合适的搜索词来查找这些文章。是否有经过深思熟虑和测试的模式来处理像这样的初始化?

谢谢。

编辑:在重新阅读这篇文章后,我认为一些背景信息可以提供答案。

在我的例子中,每个模块/子模块都在它自己的文件中。基本模块定义站点的基本功能,子模块启用不同的功能。例如,一个子模块可以在搜索框上连接自动完成,另一个可以将静态标题图像变成旋转横幅。子模块由 CMS 启用/禁用,所以我真的很想取消基本模块内的显式调用,以便 CMS 可以管理所有内容。我还知道有特定于 CMS 的方法可以实现此目的,但我正在寻找一种通用的 Javascript 模式来执行此操作,以在可能使用不同 CMS 的项目之间提供一致性和可重用性。

最佳答案

我个人有不同的编码风格。这是其中之一。另一个基本是模仿backbone.js中使用的样式

var myProgram = (function() {
var someGlobal, someGlobal2;

var subModule1 = (function() {
...

var init = function() {

};

...

init();

return {
"someMethod": someMethod,
...
};
}());

var OtherSubModule = (function() {
...
var init = function(param) { ... };
...
return {
"init": init,
...
};
}());

var init = function(param) {
...

OtherSubModule.init({
"foo": param.foo,
"bar": param.bar,
...
});
};


return {
"init": init,
"somePublic": OtherSubModule.foobar,
...
}
}());

取决于我是否需要向其他用户提供公共(public) API,哪个主干做得更好。我更喜欢制作由 init 函数驱动的模块,用于初始配置,其余完全由事件驱动。

[编辑]

考虑到经过编辑的问题,我对此有不同的模式。每个文件都在某个对象上定义了一个函数,在我的例子中是 $.FooBar.plugins

(function() {

var foo = function() { ... };

var bar = (function() { ... }());

myNamespace.plugins["MyPlugin"] = function() {

... do stuff
... bind to evevnts
};

}());

然后我们使用类似这样的 Bootstrap :

(function() {

var needed = function() {
// Feature detection
};

var load = function() { ... };

var getOptions = function() {
// Call something on a page by page basis.
};

for (var plugin in pluginList) {
if (needed(plugin)) {
load(plugin, function() {
// get page specific options
var options = getOptions();
// run plugin
myNameSpace.plugins[plugin](options);
// If all have been loaded trigger ready handlers
if (pluginCurrentCount == pluginCount) {
readyTrigger();
}
});
pluginCount++;
}
}

// start loading plugins after all have been counted
load.startLoading();

var readyTrigger = function() {
// Run all ready handlers
}

// Implement your own DOM ready function to run when all plugins
// have loaded.
myNameSpace.ready = function(handler) {
if (isReady) {
handler();
} else {
readyList.push(handler);
}

};
}());

这是很多漏洞和伪代码,但您应该明白了。如果不是很明显,请提出质疑。

然后在页面上我们有这样的东西

<html>
<head>
<script type="text/javascript">

var pageSpecific = {
"pluginName": {
"cssClass": "foobar",
"submitOnEnter": false,
...
},
...
};

</script>
<script src="bootstrapper.js" />
...
</head>
<body>
...
</body>
</html>

关于javascript - Javascript 模块模式和子模块初始化模式,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5083409/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com