我正在尝试编写一个RequireJS插件,它接受所请求模块的名称,动态地计算出它的路径,然后加载它。确定这些路径的逻辑是基于某些特定的业务逻辑,因此任何现有插件都不太可能对我有用。
我最初尝试使用插件的normalize方法,但是发生了奇怪的事情:normalize被调用了两次,之后调用了load方法,名称为空字符串。
使用load的config参数,我在没有规范化的情况下完美地工作。这是一个没有任何隐藏副作用的合适解决方案吗?
define('module-loader', {
load: function(name, req, onload, config){
var nameParts = name.split('-'),
langFile = nameParts.length === 3 && nameParts[2] === 'langs',
indFiles = CR_DEBUG;
if (nameParts.length > 3){
//allow for helper names with a dash in them
nameParts[2] = nameParts.slice(2).join('-');
}
var resolvedName = resolve.apply(null, nameParts);
config.paths[name] = resolvedName;
req([name], function (value) {
onload(value);
});
}
});
我认为配置对象只是当前的requireJS配置对象,可以添加到该对象中。 我看到的结果确实暗示了这种情况。但是文档对配置对象的作用有不同的解释:
config:对象。配置对象。这是一种方式 优化器和Web应用程序将配置信息传递给 插入。 i18n!插件使用它来获取当前当前的语言环境, 如果Web应用程序要强制使用特定的区域设置。优化器会 如果这个插件(或者),则将配置中的isBuild属性设置为true pluginBuilder)被称为优化器构建的一部分。
部分解释确实暗示了我的建议,但我希望专家可以更肯定地回答。
对于它的价值,这就是我对normalize方法所拥有的。我对目前的解决方案非常满意,但如果下面的内容显然有问题,我很想听听:
normalize: function (name) {
//weird - normalize getting called twice - hack fix for now
if (/^\//.test(name)) return name;
var nameParts = name.split('-'),
langFile = nameParts.length === 3 && nameParts[2] === 'langs',
indFiles = CR_DEBUG;
if (nameParts.length > 3){
//allow for helper names with a dash in them
nameParts[2] = nameParts.slice(2).join('-');
}
var resolvedName = resolve.apply(null, nameParts)
//alert('returning:' + resolvedName);
return resolvedName;
},
//and after this there was just a regular load method loaded
//the name it was passed, but name was coming in as ""