如何在Play框架中使用RequireJS优化器?

时间:2015-06-03 02:07:04

标签: requirejs webjars requirejs-optimizer playframework-2.4

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

  

确保从WebJar中引用任何JavaScript资源   从jsdelivr CDN自动引用。另外如果有的话   然后找到.min.js文件,代替.js。一个补充   这里的奖励是你的html不需要改变!

然而,我似乎无法让任何这些工作。

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

    define([' jquery'],function($){     '使用严格的&#39 ;;     的console.log($ grep的);     返回{         sum:function(a,b){             返回a + b;         }     }; });

  4. 我可以让它在开发模式下正常工作,但在生产模式下,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)
    

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

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

    获取jquery的正确位置。

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

    请告诉我哪里弄错了。

    谢谢!

1 个答案:

答案 0 :(得分:4)

事实证明,RequireJS优化支持不适用于所有Webjars,而是仅限于Classic Webjars。 enter image description here

即使这样,一个webjar构建文件也必须包含在常规模块中,以便rj工作。 enter image description here

例如,如果你看一下jQuery经典的webjar,你会看到包含一个特殊的webjar构建指令。请查看该文件以获取您的信息。 enter image description here

一旦你确定了一个准备好了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 ready脚本,在声明paths时不应使用方括号。否则,rjs将拒绝构建错误path fallback not supported。当然,你没有获得CDN的好处。 请注意,RequireJS css优化也适用。但仅限于内联css,就像常规的Requirejs一样。