是否可以使用require.js为文件夹设置依赖项?

时间:2013-07-19 10:26:02

标签: javascript requirejs

是否可以使用require.js设置整个文件夹的依赖关系?

我知道您可以使用填充程序配置来设置文件的依赖关系:

require.config({
    shim: {
        'plugin/backbone/xyz': {
            deps: ['lib/backbone'],
            exports: 'Backbone'
        }
    }
});

在上面的示例中,我定义了插件骨干/ xyz的依赖关系,但我想定义所有骨干插件的依赖关系:

require.config({
    shim: {
        'plugin/backbone/': { // I would like to specify a folder here but it doesn't work.
            deps: ['lib/backbone'],
            exports: 'Backbone'
        }
    }
});

我认为我曾经在GitHub上找到了一个关于它的要点,但我似乎无法再找到它。


澄清:这不是要求整个文件夹,而是为它设置依赖关系 - 文件夹中的所有文件在准备初始化之前需要的是什么,每个文件都是其中之一。这可以通过为所有文件添加填充程序来实现,但我只想为整个文件夹添加一次填充程序:

shim: {
    'lib/backbone': {
        exports: 'Backbone' // <- No use of .noConflict() so all plugins can be required and export Backbone as well.
    },
    'plugin/backbone/a': {
        deps: ['lib/backbone'], // <- Require backbone
        exports: 'Backbone' // <- Export backbone
    },
    // Same requirement and folder for these files:
    'plugin/backbone/b': {
        deps: ['lib/backbone'],
        exports: 'Backbone'
    },
    'plugin/backbone/c': {
        deps: ['lib/backbone'],
        exports: 'Backbone'
    }
}

2 个答案:

答案 0 :(得分:2)

不,您无法轻松创建通配符以将依赖项添加到配置本身的文件夹下的所有文件中。但是,您可以在配置之前创建一个循环,并添加您想要的任何依赖项。

var config = {
    shim: {
        'plugin/backbone/xyz': {
            deps: ['lib/dependency'],
            exports: 'Backbone'
        }
    }
};
for(var shim in config.shim) {
    if(shim.indexOf('plugin/backbone/') == 0) {
        if(config.shim[shim].deps == null) {
            config.shim[shim].deps = [];
        }
        config.shim[shim].deps.push('lib/backbone');
    }
}
require.config(config);

这是我能想到的唯一方法,而不必自己覆盖require的一个函数。我承认,这不是优雅,但它会起作用。

答案 1 :(得分:1)

@J_A_X's answer启发

您可以创建一个应该共享相同依赖项的文件数组,并动态创建填充程序:

var config = { shim: { /*...*/ } }

var plugins = ['a', 'b', 'c', 'd'],
    plugin_shim = {
        deps: ['lib/backbone'],
        exports: 'Backbone'
    };  

plugins.forEach(function(file) {
    config.shim['plugin/backbone/' + file] = plugin_shim;
});

require.config(config);

但是,如果有人使用r.js

进行minuglify,这将无法正常工作