在 Play 2.3.x 应用程序中使用 sbt-rjs 从 WebJars 优化 JS

Posted

技术标签:

【中文标题】在 Play 2.3.x 应用程序中使用 sbt-rjs 从 WebJars 优化 JS【英文标题】:Optimizing JS from WebJars using sbt-rjs in a Play 2.3.x app 【发布时间】:2015-04-08 17:23:53 【问题描述】:

是否可以通过 WebJars 将 Play 2.3 应用程序 concat/optimize JS(使用 sbt-rjs)包含在我的应用程序中?举一个具体的例子:我正在尝试创建一个 核心.js 模块,它包含我所有的第 3 方库,在单个文件中连接和缩小,然后可以指定为其他 AMD 模块的依赖项。通过 WebJars 包含这些库而不是下载会很棒“手动”来源。

这是我的 build.sbt 文件中的一个 sn-p,我在其中指定了我的 webjar 依赖项:

// 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")
)

这是我的 requireJS 构建配置

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'
    
  ]
);

最后,这是我的 core.js 模块:

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

从命令行运行 activator clean stage 后,我希望构建的 core.js 文件将包含我指定的所有依赖项,并连接并缩小到一个文件中,但它不包含任何他们。如果我指定一个非 WebJar 文件作为 core.js 的依赖项,它确实会正确优化。

我正在尝试做的事情可能吗?我一直在谷歌上搜索,但无论哪种方式都找不到明确的答案。

谢谢!

【问题讨论】:

我现在不确定sbt-rjs 是否可行。您可能想提出问题:github.com/sbt/sbt-rjs/issues 【参考方案1】:

我正在使用 Play 2.4.3。

在 plugins.sbt 中添加了addSbtPlugin("com.typesafe.sbt" % "sbt-rjs" % "1.0.7")

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

这在我的 build.sbt 中完成了所有的收缩工作等,用于 bower JS 和 webjars。

【讨论】:

以上是关于在 Play 2.3.x 应用程序中使用 sbt-rjs 从 WebJars 优化 JS的主要内容,如果未能解决你的问题,请参考以下文章

似乎无法在 SBT 中的分叉 JVM 中运行 Play 应用程序

如何使用 SBT 原生打包器部署 Scala Play 框架 API

sbt-native-packager 插件在 Play 项目的 rpm 构建中出错

播放框架 SBT 导入 play.api.libs.streams

为啥在 Play 2.3 项目中 sbt 编译后 sbt 失败并显示 NoClassDefFoundError: play/Play$ in Play 2.2.x 项目?

Play Framework 作为 SBT 非根模块