Optimizing JS from WebJars using sbt-rjs in a Play 2.3.x app

PlayframeworkRequirejsWebjarsSbt WebSbt Rjs

Playframework Problem Overview


Is it possible to have a Play 2.3 app concat/optimize JS (using sbt-rjs) that's included in my app via WebJars?
To give a concrete example: I'm trying to create a core.js module which contains all my 3rd party libraries concatenated and minified in a single file which can then be specified as a dependency for other AMD modules.
It would be great to include these libraries via WebJars instead of downloading the source "manually".

Here's a snippet from my build.sbt file where I'm specifying my webjar dependencies:

// Webjars
libraryDependencies ++= Seq(
  "org.webjars" % "requirejs" % "2.1.15",
  "org.webjars" % "underscorejs" % "1.7.0",
  "org.webjars" % "jquery" % "1.11.1",
  "org.webjars" % "bootstrap" % "3.3.1" exclude("org.webjars", "jquery"),
  "org.webjars" % "angularjs" % "1.3.4-1" exclude("org.webjars", "jquery")
)

Here's my requireJS build config

requirejs.config({
  baseUrl: '/assets/javascripts',
  shim: {
    'jsRoutes': {
      deps: [],
      exports: 'jsRoutes'
    },
    'angular': {
      deps: ['jquery'],
      exports: 'angular'
    },
    'underscore': {
      exports: '_'
    },
    'angularRoute': ['angular'],
    'angularCookies': ['angular'],
    'bootstrap': ['jquery']
  },
  paths: {
    'requirejs': '../lib/requirejs/require',
    'jquery': '../lib/jquery/jquery',
    'underscore': '../lib/underscorejs/underscore',
    'angular': '../lib/angularjs/angular',
    'angularRoute': '../lib/angularjs/angular-route',
    'angularCookies': '../lib/angularjs/angular-cookies',
    'bootstrap': '../lib/bootstrap/js/bootstrap',
    'jsRoutes': '/jsroutes',
    'core': './core'
  },
  modules: [
    {
      name: 'core'
    }
  ]
});

And finally, here's my core.js module:

define(['angular', 'angularRoute', 'underscore', 'bootstrap'], function() {
  // core dependencies are loaded...
});

After running activator clean stage from the command line I was hoping the built core.js file would include all my specified dependencies concatenated and minified into a single file, but it doesn't include any of them. If I specify a non-WebJar file as a dependency for core.js, it does optimize that correctly.

Is what I'm trying to do possible? I've been googling quite a bit and haven't been able to find a clear answer either way.

Thanks!

Playframework Solutions


Solution 1 - Playframework

I am using Play 2.4.3.

Added addSbtPlugin("com.typesafe.sbt" % "sbt-rjs" % "1.0.7") to plugins.sbt

// rjs = RequireJS, uglifies, shrinks to one file, replaces WebJars with CDN
client accepts them
pipelineStages := Seq(rjs, digest, gzip)

This in my build.sbt does all the shrinking work etc. to bower JS, and webjars.

Attributions

All content for this solution is sourced from the original question on Stackoverflow.

The content on this page is licensed under the Attribution-ShareAlike 4.0 International (CC BY-SA 4.0) license.

Content TypeOriginal AuthorOriginal Content on Stackoverflow
QuestionDylan HughesView Question on Stackoverflow
Solution 1 - Playframeworkf7oView Answer on Stackoverflow