Dojo:循环中有 'require' 不好吗?
Dojo: is it bad to have 'require' in the loop?
假设我们有三个小部件:Foo、Bar 和 Baz。现在我们有一个长度为 10 的数组,其中包含 'Foo'、'Bar' 和 'Baz' 个单词。我们想根据数组中的字符串元素实例化相应的Widget:
array.forEach(arrayOfStrings, function(arrayElement) {
require(['some_path/' + arrayElement], function(cls) {
new cls();
});
在 forEach()
循环中使用 require
是一种不好的做法吗?有没有什么好的方法可以改进这段代码(可能是存储已经使用过的元素)?
正如 Bergi 所建议的那样,循环中的 require 不一定是坏习惯,require
也会缓存您的 AMD 模块。
备选方案:
01) 您可以使用更具声明性的方法,例如使用循环来创建 HTML 标记并将结果附加到 DOM,示例:
<input type="text" name="field1" data-dojo-type="app/foo" />
并使用 dojo/parser
以便 Auto Require
模块 foo
more info on auto require here.
02) 使用简单的 factory。您可以 摆脱 循环中的 require
并在工厂中委托它的使用。一些伪代码:
array.forEach(arrayOfStrings, function(arrayElement) {
UserFactory.createFoo(); // use the factory instead
});
//... factory object here
UserFactory.createFoo = function() {
require(['some_path/foo'], function(cls) {
new cls();
});
};
更多 "dynamic" 版本(只是一些伪代码)
array.forEach(arrayOfStrings, function(type) {
UserFactory.createWidget(type); // use the factory instead
});
//... factory object here
UserFactory.createWidget= function(type) {
require(['some_path/' + type], function(cls) {
new cls();
});
};
假设我们有三个小部件:Foo、Bar 和 Baz。现在我们有一个长度为 10 的数组,其中包含 'Foo'、'Bar' 和 'Baz' 个单词。我们想根据数组中的字符串元素实例化相应的Widget:
array.forEach(arrayOfStrings, function(arrayElement) {
require(['some_path/' + arrayElement], function(cls) {
new cls();
});
在 forEach()
循环中使用 require
是一种不好的做法吗?有没有什么好的方法可以改进这段代码(可能是存储已经使用过的元素)?
正如 Bergi 所建议的那样,循环中的 require 不一定是坏习惯,require
也会缓存您的 AMD 模块。
备选方案:
01) 您可以使用更具声明性的方法,例如使用循环来创建 HTML 标记并将结果附加到 DOM,示例:
<input type="text" name="field1" data-dojo-type="app/foo" />
并使用 dojo/parser
以便 Auto Require
模块 foo
more info on auto require here.
02) 使用简单的 factory。您可以 摆脱 循环中的 require
并在工厂中委托它的使用。一些伪代码:
array.forEach(arrayOfStrings, function(arrayElement) {
UserFactory.createFoo(); // use the factory instead
});
//... factory object here
UserFactory.createFoo = function() {
require(['some_path/foo'], function(cls) {
new cls();
});
};
更多 "dynamic" 版本(只是一些伪代码)
array.forEach(arrayOfStrings, function(type) {
UserFactory.createWidget(type); // use the factory instead
});
//... factory object here
UserFactory.createWidget= function(type) {
require(['some_path/' + type], function(cls) {
new cls();
});
};