使用 Play 重用和维护 HTML!框架

Raa*_*tre 1 maintainability scala tiles reusability playframework

我们的产品开发团队一直在讨论 html 的可维护性和重用性。为了设置上下文,我们从 HTML5/CSS3 前端和 Play MVC 下的纯 JS 开始,而后者又使用 RESTful 后端。然后我们想到将 AngularJS 添加到旋转中并采用混合方法,结果却意识到两个强大的 MVC 框架不一定能一起工作,您必须选择一个。因此,出于性能和类型安全等问题,我们决定使用 Play 框架和基于 Scala 的模板。

挑战在于:我们希望创建可重用的 Web 组件,就像 Apache Tiles 一样,以便可以重用常见的元素,例如页眉、菜单、页脚等。这些组件已准备好进入 Play,可以向其中添加动态内容以提供整个页面。

这能做到吗?如果是,如何?

其次,播放模板似乎让您回到过去,因为它们不允许在 html 中分离关注点。因此,为了重新设计或改进 html 内容,html 开发人员将不得不处理模板或将新 html 与现有模板合并。如何使这个过程更容易?

mar*_*ira 5

我不知道 Apache Tiles 究竟是如何工作的,但如果我理解正确,它提供了一种使用较小组件(如页眉、菜单、页脚等)和某种包含机制将这些组件粘合在一起来创建页面的方法然后撰写页面。

也就是说,您可以使用Twirl实现相同的目的。您只需要声明可以在同一页面内使用的可重用块,或者您可以拥有可以在不同页面中重用的Rails 部分

让我们看一个例子。考虑您有以下文件:

文件app/views/partials/header.scala.html

<header>
  <h1>My Header</h1>
</header>
Run Code Online (Sandbox Code Playgroud)

文件app/views/partials/navigation.scala.html

<nav>
  <ul>
    <li><a href="/home">Home</a></li>
    <li><a href="/profile">Profile</a></li>
    <li><a href="/faq">FAQ</a></li>
  </ul>
</nav>
Run Code Online (Sandbox Code Playgroud)

文件app/views/partials/footer.scala.html

<footer>
  Some copyright info
</footer>
Run Code Online (Sandbox Code Playgroud)

文件app/views/main.scala.html

@(title: String)(content: Html)

<!DOCTYPE html>

<html lang="en">
    <head>
        <title>@title</title>
        <link rel="stylesheet" media="screen" href="@routes.Assets.versioned("stylesheets/main.css")">
        <script src="@routes.Assets.versioned("javascripts/hello.js")" type="text/javascript"></script>
    </head>
    <body>
        @partials.header()
        @partials.navigation()

        @content

        @partials.footer()
    </body>
</html>
Run Code Online (Sandbox Code Playgroud)

上面的文件不仅定义了一些可重用的部分模板(页眉、导航和页脚),还定义了一个通用布局(主),您的应用程序的所有页面都可以重用。现在,让我们看一个使用上述结构的页面:

文件app/views/users/profile.scala.html

@(user: models.User)

@main(title = "User Profile Page") {
  <h2>This is the profile page of @user.username</h2>
}
Run Code Online (Sandbox Code Playgroud)

还有更多:由于视图被编译为 Scala 代码,您可以导入用 Scala/Java 编写的代码并直接从您的视图中调用它,例如Rails 视图助手

文件app/views/helpers/DateHelpers.scala

package views.helpers

object DateHelpers {

  def formatToISO8601(date: Date) = {
    ??? // format the date
  }

}
Run Code Online (Sandbox Code Playgroud)

让我们在我们的app/views/users/profile.scala.html页面中使用这个助手:

@(user: models.User)
@import controllers.DateHelpers._

@main(title = "User Profile Page") {
  <h2>This is the profile page of @user.username.</h2>

  <p>User since @formatToISO8601(user.createdAt)</p>
}
Run Code Online (Sandbox Code Playgroud)

还有其他方法需要考虑:

  1. Ping-Play:Play 框架的大管道流
  2. 您可以创建一个与 Apache Tiles 集成的 Play 模块。我很确定这是可能的。