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
模板方面,我应该考虑如何将Scala
与JavaScript
结合起来,将参数从一种语言传递到另一种语言。使用一些技巧,例如在处理 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 模型。
为每个控制器(list
、create
、show(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(可用于谷歌搜索),我们将把 view 和 routes 放在那里。
更新 2:
现在我正在处理一些PlayFramework
项目。而且我发现使用 just plain request-response + little JQuery 或 JScala 一点也不差。
我的观点是(我应该说这是众所周知的观点,但很容易忘记):您不确定您的应用是否会流行。您是否会有每秒 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 世界中,事情对我来说过于复杂。
似乎:人们应该首先考虑使用html
、css
和node
/ 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