Is it possible to stop requireJS from adding the .js file extension automatically?

Matt Andrews picture Matt Andrews · May 14, 2012 · Viewed 18.7k times · Source

I'm using requireJS to load scripts. It has this detail in the docs:

The path that is used for a module name should not include the .js extension, since the path mapping could be for a directory.

In my app, I map all of my script files in a config path, because they're dynamically generated at runtime (my scripts start life as things like order.js but become things like order.min.b25a571965d02d9c54871b7636ca1c5e.js (this is a hash of the file contents, for cachebusting purposes).

In some cases, require will add a second .js extension to the end of these paths. Although I generate the dynamic paths on the server side and then populate the config path, I have to then write some extra javascript code to remove the .js extension from the problematic files.

Reading the requireJS docs, I really don't understand why you'd ever want the path mapping to be used for a directory. Does this mean it's possible to somehow load an entire directory's worth of files in one call? I don't get it.

Does anybody know if it's possible to just force require to stop adding .js to file paths so I don't have to hack around it?

thanks.

UPDATE: added some code samples as requested.

This is inside my HTML file (it's a Scala project so we can't write these variables directly into a .js file):

foo.js.modules = {
    order               : '@Static("javascripts/order.min.js")',
    reqwest             : 'http://5.foo.appspot.com/js/libs/reqwest',
    bean                : 'http://4.foo.appspot.com/js/libs/bean.min',
    detect              : 'order!http://4.foo.appspot.com/js/detect/detect.js',
    images              : 'order!http://4.foo.appspot.com/js/detect/images.js',
    basicTemplate       : '@Static("javascripts/libs/basicTemplate.min.js")',
    trailExpander       : '@Static("javascripts/libs/trailExpander.min.js")',
    fetchDiscussion     : '@Static("javascripts/libs/fetchDiscussion.min.js")'
    mostPopular         : '@Static("javascripts/libs/mostPopular.min.js")'
};

Then inside my main.js:

requirejs.config({
    paths: foo.js.modules
});

require([foo.js.modules.detect, foo.js.modules.images, "bean"], 
    function(detect, images, bean) {
        // do stuff
});

In the example above, I have to use the string "bean" (which refers to the require path) rather than my direct object (like the others use foo.js.modules.bar) otherwise I get the extra .js appended.

Hope this makes sense.

Answer

Chris Eldredge picture Chris Eldredge · Mar 13, 2013

If you don't feel like adding a dependency on noext, you can also just append a dummy query string to the path to prevent the .js extension from being appended, as in:

require.config({
    paths: {
        'signalr-hubs': '/signalr/hubs?noext'
    }
});

This is what the noext plugin does.