RequireJS optimize do not load paths from external configuration?

advertisements

I'm using r.js through grunt-contrib-requirejs and haven't had any problems with it so far, until I wanted to split up my config into a separate file so that both testem and my app could share the same config. I haven't got any problems with having the separate config, except when it comes to the optimiser which can't find the paths any more.

My main file loads in require like so:

<script data-main="main" src="vendor/requirejs/require.js"></script>

In main.js I have:

require(['config'], function() {
    'use strict';
    require(['backbone', 'jquery'], function( Backbone, $ ) {
        // ...
    });
});

And in the config I have:

require.config({
    paths : {
        backbone                : 'vendor/backbone/backbone-min',
        jquery                  : 'vendor/jquery/jquery.min',
        underscore              : 'vendor/underscore/underscore-min'
    },
    shim : {
        'backbone'              : { deps: ['jquery', 'underscore'], exports: 'Backbone' },
        'underscore'            : { exports: '_' }
    }
});

My Grunt task looks like this:

compile : {
    options: {
        name: 'main',
        baseUrl: 'lib',
        mainConfigFile: 'lib/config.js',
        out: 'dist/js/master.js',
        optimizeAllPluginResources: true
    }
}

But all r.js can find is lib/config.js & lib/main.js, it doesn't find Backbone, jQuery etc. This all works OK if config is included in the same file as main, but the whole point of splitting these out is so that I don't have to maintain a different config for my test runner.

Any advice would be greatly appreciated.


Managed to solve this a couple of days ago. Now using Almond to load in my optimised r.js build and so I use a config like this:

compile: {
    options: {
        name: 'vendor/almond/almond',
        baseUrl: 'lib',
        include: ['main'],
        insertRequire: ['main'],
        mainConfigFile: 'lib/config.js',
        out: 'dist/js/master.js',
        optimizeAllPluginResources: true,
        wrap: true
    }
}

For the development version I had to include the config inside a different script below where I inserted require.js:

<script src="config.js"></script>

But for the optimiser I had to load config as a module: e.g.

require(['backbone','jquery','config'], function( Backbone, $ ) {

I couldn't get nested requires to work, so this is the solution that I came up with. Posting this for future Googlers.