5

正如所宣传的那样,rjs在 Play 中可以

确保从 WebJar 中引用的任何 JavaScript 资源都会自动从 jsdelivr CDN 中引用。此外,如果找到任何 .min.js 文件,则将使用该文件代替 .js。这里的一个额外好处是您的 html 不需要更改!

但是,我似乎无法让这些工作。

  1. 我尝试在生产模式下运行我的 Play 应用程序,我的所有 webjar javascripts 仍然被引用为本地。
  2. 我没有看到.min生产中使用的 javascript 文件的版本。
  3. 我无法让依赖注入在生产模式下工作。例如,当我想像这样注入jquery我的代码时

    define(['jquery'], function ($) { 'use strict'; console.log($.grep); return { sum: function (a, b) { return a + b; } }; });

我可以让它在开发模式下正常工作,但在生产模式下,rjs失败的说法

[info] Error: ENOENT, no such file or directory '/Users/khanguyen/Desktop/rjsdemo/target/web/rjs/build/js/jquery.js'
[info] In module tree:
[info]     main
[info]       app
[info] 
[info] Error: Error: ENOENT, no such file or directory '/Users/khanguyen/Desktop/rjsdemo/target/web/rjs/build/js/jquery.js'
[info] In module tree:
[info]     main
[info]       app
[info] 
[info]     at Error (native)

显然,尽管 Webjar 生成了配置设置,但它正在寻找 jQuery 的错误位置

requirejs.config({"paths":{"jquery":["/webjars/jquery/1.11.1/jquery","jquery"]},"shim":{"jquery":{"exports":"$"}},"packages":[]})    }

有正确的位置jquery

我正在使用 Play 2.4.0,并pipelineStages := Seq(rjs, digest)在我的 build.sbt 中进行了设置。

请让我知道我在哪里弄错了。

谢谢!

4

1 回答 1

4

事实证明,RequireJS 优化支持并不适用于所有 Webjar,而是仅限于 Classic Webjar。 在此处输入图像描述

即使这样,webjar 构建文件也必须包含在常规模块中才能使 rjs 工作。 在此处输入图像描述

例如,如果您查看 jQuery 经典 webjar,您会看到其中包含一个特殊的 webjar 构建指令。查看该文件以获取信息。 在此处输入图像描述

一旦你确定了一个准备好 RequireJS 的 webjar,你就可以让 sbt-rjs 来做这件事。这是我的设置供参考:

/** javascripts/main.js **/
'use strict';

requirejs.config({
    paths:{
        'jquery': ['../lib/jquery/jquery'],
        'react': ['../lib/react/react'],
        'bootstrap': ['../lib/bootstrap/js/bootstrap'],
        'react-bootstrap': ['../lib/react-bootstrap/react-bootstrap']
    },
    shim: {
        'bootstrap': {
            deps: ['jquery']
        },
        'react-bootstrap': {
            deps: ['react']
        }
    }
});

记得有方括号,否则不会发生 CDN 替换。

对于非 requirejs 就绪的脚本,在声明paths. 否则, rjs 将拒绝构建错误path fallback not supported。当然,您不会获得 CDN 的好处。顺便说一句,RequireJS css 优化也有效。但仅限于内联 css,就像常规的 Requirejs 一样。

于 2015-06-06T13:56:47.670 回答