Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

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

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.

like image 619
Matt Andrews Avatar asked May 14 '12 14:05

Matt Andrews


People also ask

Should I use RequireJS?

Generally you only use RequireJS in its loading form during development. Once the site is done and ready for deployment, you minify the code. The advantage here is RequireJS knows exactly what your dependencies are, and thus can easily minify the code in the correct order.

What is RequireJS config JS?

RequireJS is a JavaScript file and module loader. It improves perceived page load times because it allows JavaScript to load in the background. In particular, it enables asynchronous JavaScript loading.

What is the main purpose of the RequireJS framework?

RequireJS is a JavaScript library and file loader which manages the dependencies between JavaScript files and in modular programming. It also helps to improve the speed and quality of the code.

What is the correct file extension for JavaScript files?

JavaScript files have the file extension .js.


1 Answers

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.

like image 114
Chris Eldredge Avatar answered Oct 05 '22 23:10

Chris Eldredge