Scala Play Framework 和 Angular JS - 在重复和混合概念方面付出了太多努力

Posted

技术标签:

【中文标题】Scala Play Framework 和 Angular JS - 在重复和混合概念方面付出了太多努力【英文标题】:Scala PlayFramework and Angular JS - too much effort in terms of duplication and mixing concetps 【发布时间】:2013-09-18 09:23:02 【问题描述】:

我尝试在playframework + scala + Angular JS 上编写应用程序。 目的是创建一个在浏览器中关闭或打开 javascript 时都能正常工作的 Web 应用程序。这是编写公共网站时的常见要求(这对人们和将其索引的谷歌应该是有益的)

所以我最终得到了 ~50%JavaScript 编写的代码,有两 (2) 个名为 "controller" 的文件夹 - 一个用于 Scala 代码,一个用于JS 代码(因为AngularJS 也使用控制器概念)。

另外,由于JS 代码应该使用Ajax 调用,我必须创建另一个 scala-controller,它返回json,但不返回html 返回客户的请求.而且..这都是我不喜欢的。这似乎太费劲了。

playframework 模板方面,我应该考虑如何将ScalaJavaScript 结合起来,将参数从一种语言传递到另一种语言。使用一些技巧,例如在处理 JS 时显示 that,在应该关闭时显示 that

这一切都让我的模板难以理解,而且有一天,当我拥有庞大的代码库时,我可能会想出一个解决方案来复制我的模板(js 模板 + scala 模板) -在JS 关闭/打开时使用正确的模板。那么 JS 代码的数量可能会上升到 60%。

然后我似乎要复制所有内容,例如拥有两个不同的应用程序 - Google。常见的(仅)是我的数据库中的数据本身,我不必复制数据。但是..我们可能对数据的格式有不同的问题(并且很可能是基于 json 的 [因为我不会浪费处理器时间来进行表对象转换],但不是基于表的 - NoSQL .. 然后再次,我们像 DB 一样来到 JS - 像 MongoDB),JS 非常适合 Json,本机

那么问题来了,为什么不将 100% 的 JS 用于 简单 事情,例如:request-response形成页面、布局。服务器端 JS 控制器可以形成我的模板 - 然后我不需要从一种语言切换到另一种语言,并且在这个意义上更加高效。

问题: 你有什么建议吗?关于这个的最佳实践?我不是那种想最终使用NodeJS 来使用JavaScript 作为所有事物的一种语言——用于服务器和客户端的人。但让我们谈谈生产力和业务需求。

有一个 AnjularJS 控制器的例子(不是我的),我要写多少 JS: https://github.com/tastejs/todomvc/tree/gh-pages/architecture-examples/angularjs/js

想象一下,我必须同时保留 PlayFramework 控制器 - 对于 HTML 和 AJAX 调用,将 scala/playframework 模板中的内容与 JavaScript 混合。

【问题讨论】:

AngularJS 是一个 RIA。您的问题与 flex 前端相同。我认为的第一个问题是:我需要什么?它是 RIA 吗? 这篇文章真的让我很困惑。如果你害怕混淆概念,那就不要。不要使用 Play! 的模板引擎。使用播放!只是为了服务资产和 RESTful 端点。使用 Angular 在 JS 中构建您的 MVC 应用程序。 我只是相信 Play 可以提供的解决方案(最终)。这更像是一个信息而不是一个问题。 【参考方案1】:

我想分享最终种子中使用的收据 (https://github.com/angyjoe/eventual):

    编写您的 HTML。这样做,请随意使用尽可能多的 JavaScript 框架和库(尽管种子是 AngularJS)。

    确定控制器遵循的 Play 模型。

    为每个控制器(listcreateshow(id)update(id)delete(id))确定操作(仅限您需要的操作!)。将这些操作实现为 Scala 操作。

    插入 Play 路由以将每个已实现的操作提供给客户端框架。

    插入一个(也是唯一一个!)播放路由,将样式化的 HTML 提供给客户端框架。

    将剩余的开发时间和精力花在客户端上...

【讨论】:

【参考方案2】:

对于您的情况来说,角度似乎太大了。也许你可以在 js 方面坚持使用更简单的 Ajax,比如 jQuery,并使用 Rest 端点作为播放路由来将 json 提供给你的页面。

【讨论】:

【参考方案3】:

您是否看过这篇博文 - AngularJS and Play Framework?

【讨论】:

在该博客中,该应用程序使用套接字。那里的游戏被用作休息服务器。再次是 Scala 的 20%,70% - JS。【参考方案4】:

现在这似乎对我有帮助:

https://github.com/nau/jscala

或者这个:https://github.com/lampepfl/scala-js

但这不是必须的答案。

更新:

对于不想在 JS 中跳得太深的 scala 开发人员,我看到的唯一一种方法是:

等到 JScala 或 Scala-JS 等解决方案准备好使用(或贡献)以替代 CoffeScript in Play2。在那一天之前,我们只需要忍受它。

在这里我们可以看到:https://github.com/typesafehub/angular-seed-play

其中没有 app / view 目录的播放应用。此外,“路由”文件几乎是空的——因为 Angular 在客户端关心它。所以我们不需要它们。

一种 RIA 方式。因此,如果有一天我们决定将这个应用程序提供给 Google(可用于谷歌搜索),我们将把 viewroutes 放在那里。

更新 2:

现在我正在处理一些PlayFramework 项目。而且我发现使用 just plain request-response + little JQueryJScala 一点也不差。

我的观点是(我应该说这是众所周知的观点,但很容易忘记):您不确定您的应用是否会流行。您是否会有每秒 1K 用户。如果是 - 那么您(将)遇到性能问题,您可以通过在客户端移动应用程序的某些部分来改进(或在服务器端使用手工 Akka Actors 的轿跑车)。当您的想法可以放在模板/html 上以立即看到结果时,所有人(像我一样)都应该考虑 开发效率(这是 PlayFramework 最初创建的目的)。关于AngualrJS 的噪音太大了,以至于人们(甚至是我 :))都会不假思索地跳到那里。

您是否只加载200k of json 文件或从服务器端加载200k + 5k html(比较请求-响应与休息-json)是否有意义/关键?可能不是。对于像*** 和许多其他网站/应用程序,这并不重要。开发效率很重要。

“点”,这很重要。 “跟随亮点继续(C)”:)

更新 3:(基于实际需求的演变)

现在我有一个包含 2 个模块的应用程序:

    "web" - nodejs 客户端带有 angularjs 的应用 “服务器” play 应用程序没有视图也没有服务器端模板。但我很失望,在 IntelliJ 想法中使用 Scala 和 SBT 插件它只会无缘无故地杀死我的笔记本电脑启动所有 8 个内核(人类发明量子计算机可能需要一些时间。我不有时间等待)。

我现在需要的只是简单的休息。 所以我最终可能会拥有 NODE JS 服务器(用于使用 MongoDB 之类的东西)和 Play 1.3 服务器(java)! (在需要时将其连接到 scala 库/逻辑)。毕竟我只需要 REST 层 - 无论如何它都不是火箭科学。所以要创建一个简单的网站 - 我将使用 10% 的 Play 和 90% 的 JS 直到有额外的逻辑可以在 scala 上使用 strong 创建有意义键入和功能方法,并在我需要时与现有的 java api 连接。 尽管我是 java 人(从历史上看),但我发现在 java 和现在的 scala 世界中,事情对我来说过于复杂。

似乎:人们应该首先考虑使用htmlcssnode / js 创建东西,然后在创建基于站点的应用程序时进一步思考他需要什么。在逻辑需要时使用type-safety

更新 4:

有趣的部分

    https://github.com/greencatsoft/scalajs-angular https://github.com/greencatsoft/scalajs-angular-todomvc 相关问题:Scala-JS for real web project

【讨论】:

【参考方案5】:

我刚刚做了一个示例项目,展示了如何使用 Scala.js 编写 AngularJS/Play 应用程序:

https://github.com/greencatsoft/scalajs-angular-todomvc

应该有一些粗糙的边缘,但我相信能够用 Scala 编写所有东西(包括 AngularJS 部分)会吸引一些人。

【讨论】:

这是一个很棒的举措,期待尝试一下! 我想我必须选择一些答案(以防止试图回答它)。而且由于我倾向于使用 scala-js,但对于 angular 来说不是必需的。 IDE 和 sbt 使之成为可能 - 非常愉快的体验。【参考方案6】:

这是一个很好的混合项目示例(angularjs 玩 mongodb 和 scala)和很棒的教程,它展示了如何构建一个现代 Web 应用程序,包括一个使用 AngularJS 构建的客户端 JavaScript 应用程序,用 CoffeeScript 编写,服务于Play Framework 并通过 Reactive Mongo 使用文档持久性,这是 MongoDB 的非阻塞 Scala 客户端:

https://github.com/lashford/modern-web-template#master

http://typesafe.com/activator/template/modern-web-template

【讨论】:

以上是关于Scala Play Framework 和 Angular JS - 在重复和混合概念方面付出了太多努力的主要内容,如果未能解决你的问题,请参考以下文章

在 Play Framework 2.4 中为 Scala 实现 CORS

Scala Play Framework Slick 会话不起作用

Netbeans + Scala + play-framework:找不到 index.html

如何使用 Scala 登录 Play Framework?

Play framework + Scala:使用动作组合注入依赖

Scala Play Framework 2.6密封特征格式给Json