从 Play 2.3 迁移到 Play 2.4 后 requirejs (js) 停止工作

Posted

技术标签:

【中文标题】从 Play 2.3 迁移到 Play 2.4 后 requirejs (js) 停止工作【英文标题】:require.js (rjs) stopped working after migrationg from Play 2.3 to Play 2.4 【发布时间】:2015-08-17 11:00:36 【问题描述】:

我在过去的工作中遇到 404 错误。

10:35:40.588 [warn] application - [onHandlerNotFound] GET /assets/javascripts/require.js?v=807475 - 127.0.0.1

我查看了 sbt-rjs 插件的配置指南: https://www.playframework.com/documentation/2.4.x/RequireJS-support

但一切都已经在我这边设置好了 - 因为它在 2.3 上运行良好

plugin.sbt:

// The Typesafe repository resolvers += "Typesafe repository" at "http://repo.typesafe.com/typesafe/releases/"

// Use the Play sbt plugin for Play projects addSbtPlugin("com.typesafe.play" % "sbt-plugin" % "2.4.0")

// BuildInfo available in java addSbtPlugin("com.eed3si9n" % "sbt-buildinfo" % "0.2.5")

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

addSbtPlugin("com.typesafe.sbt" % "sbt-digest" % "1.0.0")

addSbtPlugin("com.typesafe.sbt" % "sbt-gzip" % "1.0.0")

addSbtPlugin("com.typesafe.sbt" % "sbt-stylus" % "1.0.1")

addSbtPlugin("de.johoop" % "jacoco4sbt" % "2.1.6")

addSbtPlugin("com.typesafe.sbt" % "sbt-play-enhancer" % "1.1.0")

build.sbt:

...
// Asset building pipeline
pipelineStages := Seq(rjs,gzip)
...

html 模板: 要求 = urlArgs: 'v=@Urls.ASSETS_VERSION', 等待秒数:180 ;

<script data-main="@Urls.assetWithoutVersion("javascripts/main.js")" src="@Urls.asset("javascripts/require.js")" type="text/javascript"></script>

呈现的 HTML:

<script>
    require = 
        urlArgs: 'v=807475',
        waitSeconds: 180
    ;
</script>

<script data-main="//local.prizeo.com:9000/assets/javascripts/main.js" src="//local.prizeo.com:9000/assets/javascripts/require.js?v=807475" type="text/javascript"></script>

其他人遇到过这个问题吗?

谢谢!

编辑:

可能不是重要的信息,但为了完整起见添加它。 我们使用自定义 Urls 类来使用云前端:

public static String assetWithoutVersion(String path) 
    if (Protocols.HTTP.isUsed(path) || Protocols.HTTPS.isUsed(path)) 

        if(Protocols.HTTP.isUsed(path)) 
            //this should be avoided, since some browsers may refuse o load unsecured content
            DLogger.warn(TAG, "Asset file '" + path + "' has the protocol specified");
        

     else if(Protocols.NONE.isUsed(path)) 
        //this is fine
     else 
        if (USE_CLOUDFRONT_ASSETS) 
            path = Protocols.NONE + getCloudfrontUrl() + "/assets/" + path;
         else 
            //strip the http or https
            String domain = Play.application().configuration().getString("page.url.base");
            domain = domain.substring(domain.indexOf('/') + 2);
            path = Protocols.NONE + domain + "/assets/" + path;
        
    

    return path;



public static String asset(String path) 
    //no need to include version on s3 assets
    if (path.contains("static-assets-")) return path;

    return assetWithoutVersion(path) + "?v=" + ASSETS_VERSION;

编辑 2:

添加 route.conf 行(注意:我没有将路由器更新到“注入”版本)。会不会是个问题?

GET         /assets/*file                                                              controllers.Assets.at(path="/public", file: String)

【问题讨论】:

@Urls.assetWithoutVersion 是自定义类/方法吗? 它是自定义类,为了完整性,我添加了实现 - 它用于处理 CDN。 【参考方案1】:

事实证明我必须改变两件事:

呈现的 HTML 必须是:

<script data-main="//local.prizeo.com:9000/assets/javascripts/main.js" src="/assets/lib/requirejs/require.js" type="text/javascript"></script>

注意“lib”前缀而不是 javascripts

我还必须补充:

RjsKeys.paths += ("jsRoutes" -> ("/jsroutes" -> "empty:"))

到 build.sbt

如果您知道它的作用,请发表评论 - 我在示例游戏项目中找到它,但没有找到任何文档。

【讨论】:

以上是关于从 Play 2.3 迁移到 Play 2.4 后 requirejs (js) 停止工作的主要内容,如果未能解决你的问题,请参考以下文章

迁移到 2.4.x (Java) 后在 Play Framework 中运行测试时出错

如何在 play 2.4 中使用 CommonsMailerPlugin

迁移到 anorm2.4(使用 play 2.4):ToStatement[T] 和 ToStatement[Option[T]]

Play 2.4 添加模块而不是插件

在启动时向 Play 2.4 中的演员注入服务

Play Ebean 从 2.4 升级到 2.5 后不生成 Id