Scala PlayFramework 和 Angular JS - 在重复和混合方面投入了太多精力

Scala PlayFramework and Angular JS - too much effort in terms of duplication and mixing concetps

本文关键字:方面投 混合 太多 Angular PlayFramework JS Scala      更新时间:2023-09-26

我试图在 playframework + scala + Angular JS 上编写一个应用程序。目的是创建一个Web应用程序,当JavaScript在浏览器中关闭或打开时,该应用程序可以正常工作。这是编写公共网站时的通常要求(这对人们和谷歌来说应该是有好处的,谷歌会索引它)

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

另外,由于JS代码应该使用Ajax调用,我不得不再创建一个返回json的scala控制器,但不html返回客户端的请求。 而且......这都是我不喜欢的。这似乎太费力了。

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

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

然后似乎我要复制所有内容,例如有两个不同的应用程序 - 用于谷歌。常见的(仅)是我的数据库中的数据本身,我不必复制数据。但。。在那里,我们可能会对该数据的格式有不同的问题(并且很可能是基于 JSON 的 [因为我不会浪费处理器时间来做表对象转换],但不是基于表 - NoSQL..然后我们再次来到像数据库一样的 JS - 就像 MongoDB 一样),JS原生地与 JSON 配合得很好。

然后问题,为什么不使用 100% 的JS来处理简单的事情,例如:请求-响应形成页面布局。服务器端JS控制器可以形成我的模板 - 这样我就不需要从一种语言切换到另一种语言,从这个意义上说,效率更高。

问题:你有什么建议吗?这方面的最佳实践?我不是那种想最终使用 NodeJSJavaScript用作所有语言的人 - 用于服务器和客户端。但是,让我们谈谈生产力和业务需求。

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

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

我想

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

  1. 编写你的 HTML。这样做,请随意使用任意数量的JavaScript框架和库(虽然种子是AngularJS)。

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

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

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

  5. 插入一个(而且只有一个!播放路由以将样式化的 HTML 提供给客户端框架。

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

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

你看过这篇博文吗 - AngularJS 和 Play Framework?

目前,这似乎可以帮助我:

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

没有应用

/视图目录的播放应用。此外,"routes"文件几乎是空的 - 因为Angular在客户端关心它。所以我们不需要它们。

有点像俄新社的方式。因此,如果有一天我们决定让这个应用程序可供Google使用(可谷歌搜索),我们将在那里放置视图路线

更新 2:

现在我正在做一些PlayFramework项目。而且我发现只使用普通的请求-响应 + 小 JQueryJScala 一点也不差。

我的观点

是(我应该说,这是众所周知的观点,但很容易忘记):你不确定你的应用程序是否会受欢迎。您是否每秒有 1K 用户。如果是 - 那么您(将)在性能方面存在问题,您可以通过在客户端转移应用程序的某些部分来改善(或在服务器端使用手牌 Akka Actor)。所有人(像我一样)都应该考虑开发生产力的观点(这是PlayFramework最初创建的目的),当你的想法可以放在你的模板/html上以立即看到结果时。关于AngualrJS的噪音太多了,以至于人们(甚至我:))不假思索地失去了你的思想跳到那里。

仅加载文件还是从服务器端加载200k of json文件200k + 5k html(比较请求-响应与休息 - json)是否有意义/关键?应该不会。对于像stackoverflow这样的网站/应用程序以及许多其他网站/应用程序来说,这并不重要。开发生产力很重要。

"点",这很重要。 "跟随亮点,继续前进(C)":)

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

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

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

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

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

更新 4:

有趣的片段

  1. https://github.com/greencatsoft/scalajs-angular
  2. https://github.com/greencatsoft/scalajs-angular-todomvc
  3. 相关问题: Scala-JS for Real Web 项目

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

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

应该有一些粗糙的边缘,但我相信能够在Scala中编写所有内容(包括AngularJS部分)可以吸引一些人。

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

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

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