我正在尝试编写一个 RequireJS 插件,它接受请求的模块的名称,动态地计算出它的路径,然后加载它。确定这些路径的逻辑是基于一些特定的业务逻辑,所以任何现有的做类似事情的插件都不太可能对我有用。
我最初尝试使用插件的 normalize 方法,但发生了奇怪的事情: normalize 被调用了两次,之后调用了 load 方法,名称为空字符串。
使用 load 的配置参数,我得到了一切正常工作,无需标准化。这是一个没有任何隐藏副作用的合适解决方案吗?
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 配置对象,可以添加到。 而我看到的结果确实表明情况确实如此。 但是文档对配置对象的作用有相当不同的解释:
配置:对象。一个配置对象。这是优化器和 Web 应用程序将配置信息传递给插件的一种方式。i18n! 如果 web 应用程序想要强制使用特定的语言环境,插件使用它来获取当前的当前语言环境。如果此插件(或 pluginBuilder)作为优化器构建的一部分被调用,则优化器会将配置中的 isBuild 属性设置为 true。
该解释的部分内容确实暗示了我的建议,但我希望专家可以更肯定地回答。
对于它的价值,这就是我的规范化方法所拥有的。我对我目前拥有的解决方案非常满意,但如果下面的内容有明显问题,我很想听听:
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 ""