2

我正在尝试编写一个 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 ""
4

0 回答 0