从 GWT 开发人员的角度看 Scala.js

位置:首页>文章>详情   分类: Java教程 > 编程技术   阅读(237)   2023-12-07 07:14:57

本博客严重偏向于 GWT(和基于 GWT 的框架),但我们牢记 GWT 将来可能会被其他技术接管,因此我们始终对探索其他平台/框架持开放态度。正如他们所说,多元化可以降低风险。每种编程语言,即使是最奇怪的语言,都有它们的“to javascript”编译器:https://github.com/jashkenas/coffeescript/wiki/List-of-languages-that-compile-to-JS,因此 GWT 可以尝试向他人学习,以便在未来进行改进。 Scala.js 总是与 GWT 进行比较,因为它们都使用基于 JVM 的语言,这意味着在语法和语义上有一些相似之处。 Scala.js 是一个 Scala 到 javascript 的编译器,其工作方式与 GWT 类似。 Scala.js 具有使 GWT 具有吸引力的等价物,如 JsInterop、开发模式、修剪、草稿编译、元素等。我们计划在即将发布的一篇文章中对 Scala.js 与 GWT 进行比较,但在此之前我们想简要介绍一下 Scala.js,以及如何编写一个简单的程序。

这是 Scala,不是 Java

Scala 是一种面向对象的 JVM 语言,它以面向函数式编程和内置的不变性而大肆宣传。就个人而言,我从来没有用 Scala 编写过任何“真正的”应用程序,所以我真的不知道这门语言的所有来龙去脉。似乎任何你可以用 Scala 做的事情,你都可以用 Java 8 做,反之亦然。在检查语法差异时引起注意的一件事是 Scala 具有动态类型推断,因此不会声明变量的类型。这可能看起来更像 javascript,并且可能给人一种直接在 javascript 中编程的感觉。 Scala.js 文档提供了 Scala 和 Es6 之间的比较:https://www.scala-js.org/doc/sjs-for-js/es6-to-scala-part1.html

项目设置

初始设置非常简单。只有一种用于 scala 的构建工具 (sbt) 和一种用于 Scala.js 的插件,所以没有问题。 Scala.js 项目不需要任何特殊的结构,一个简单的项目结构就足够了。使用 Scala.js 的一个要求是 NodeJs。然后,可以通过运行以下命令来初始化项目:

sbt new scala/scala-seed.g8

从命令行。然后系统会提示您输入项目名称、版本和组织名称(相当于 Maven 中的 groupId)。然后,我们需要将 Scala.js 依赖项和配置添加到我们的 build.sbt 文件(相当于 pom.xml)。我们的 build.sbt 文件看起来像这样:

enablePlugins(ScalaJSPlugin)

name := "scalajsdemo"

version := "0.1-SNAPSHOT"

scalaVersion := "2.11.8"

libraryDependencies ++= Seq(
  "org.scala-js" %%% "scalajs-dom" % "0.9.1"
)

scalaJSUseMainModuleInitializer := true

配置是最小的,所以不需要很大的努力。

使用框架

设置项目后,我们需要做的就是创建一个扩展 JSApp 对象的入口点类。

object MyForm extends JSApp {
  override def main(): Unit = {

  }
}
    <李>
    1. 与 DOM 交互:Scala.js 有一个非常全面的 API,用于以与 vanilla JS 相同的方式交互和操作 DOM。事实上,这是 Scala.js 的核心焦点:默认情况下没有自定义 ui 组件来构建 ui。例如,使用事件侦听器创建按钮的代码如下所示:
      val button = document.createElement("button")
          button.textContent = "Click button"
          button.addEventListener("click", { (e0: dom.Event) =>
            println("clicked")
          }, false)
           document.body.appendChild(button)

      要使用 XmlHttpRequest 执行 HTTP 请求,代码如下所示:

      $ 

      假设我们要解析 G-Widgets Rss 提要并创建一个包含所有标题的列表,然后我们将执行如下操作:

      val req = new XMLHttpRequest()
          req.open("GET", "http://www.g-widgets.com/feed/")
          req.setRequestHeader("Access-Control-Allow-Origin", "*")
  1. 导出到 Javascript 或从 Javascript 导出(等效于 JsInterop): Scala.js 还可以使用注释将类导出/导入到 Javascript。假设我们想在我们的代码中使用 JSON 实用程序对象,一种导入它的方法是:
    @js.native
    @JSGlobal
    object JSON extends js.Object {
      def parse(data: String): js.Object = js.native
      def stringify(anobject :js.Object): String = js.native
    }

    以同样的方式,我们可以导出一些对象以从 javascript 脚本中使用使用注释:

    @JSExportTopLevel("DummyJs")
    class DummyJs(val dummyValue: String) {
    
      @JSExport
       def getTheDummyValue(): String = dummyValue
    }

编译和开发模式

Scala.js 的一大优点是编译时间短。代码更改后,编译不会花费超过 9 秒(对于这个简单的应用程序)来重建 .js,这非常令人鼓舞并且不那么令人沮丧。 Web 服务器的选择(如果需要)保持打开状态。例如,带有实时重新加载扩展的服务器可能会派上用场。 Scala.js 提供了两种编译模式 fastOptJS 和 fullOptJS。当运行 fastOptJS(相当于 GWT 中的草稿模式)时,编译器做的优化更少,因此编译时间更短。这是开发的理想选择。另一方面,fullOptJS 使用 Google 的闭包编译器生成高度紧凑和优化的 .js 文件。

包起来

这是对 Scala.js 的自以为是的介绍。 Scala.js 可以提供的主要优势是无样板项目设置和快速编译时间。 GWT 比 Scala.js 更成熟,使用也更多,但是 GWT 可以在减少编译时间和设置项目的样板方面向 Scala.js 学习。另一方面,一些 Scala.js 的拥护者并没有意识到 GWT 的发展,有时对 GWT 的能力给出了不准确的评估。例如,Greg Dorell 在他最近的 Devoxx talk 中表示“GWT 不起作用”,因为它没有提供良好的 js 导入/导出功能。他显然忽略了 GWT 还引入了 JsInterop。 GWT 仍然在生态系统和社区方面获胜。我们将在接下来的帖子中进行更详细的比较。总而言之,Scala.Js 是开发 Web 应用程序的一个有吸引力的替代方案。对于 Java 开发人员来说,可能存在语言障碍,但学习曲线不会非常陡峭,因为 Java 和 Scala 都是 JVM 语言并且具有相似的概念。

完整代码可以在这里找到:https://github.com/zak905/scalajsdemo

标签2: Java教程
地址:https://www.cundage.com/article/jcg-overview-scala-js-gwt-developer-perspective.html

相关阅读

Java HashSet 教程展示了如何使用 Java HashSet 集合。 Java哈希集 HashSet 是一个不包含重复元素的集合。此类为基本操作(添加、删除、包含和大小)提供恒定时间性...
SpringApplicationBuilder 教程展示了如何使用 SpringApplicationBuilder 创建一个简单的 Spring Boot 应用程序。 春天 是用于创建企业应...
通道是继 buffers 之后 java.nio 的第二个主要新增内容,我们在之前的教程中已经详细了解了这一点。通道提供与 I/O 服务的直接连接。 通道是一种在字节缓冲区和通道另一端的实体(通...
课程大纲 Elasticsearch 是一个基于 Lucene 的搜索引擎。它提供了一个分布式的、支持多租户的全文搜索引擎,带有 HTTP Web 界面和无模式的 JSON 文档。 Elasti...
解析器是强大的工具,使用 ANTLR 可以编写可用于多种不同语言的各种解析器。 在这个完整的教程中,我们将: 解释基础:什么是解析器,它可以用来做什么 查看如何设置 ANTLR 以便在 Java...
Java 是用于开发各种桌面应用程序、Web 应用程序和移动应用程序的最流行的编程语言之一。以下文章将帮助您快速熟悉 Java 语言,并迈向 API 和云开发等更复杂的概念。 1. Java语言...
Java中的继承是指子类继承或获取父类的所有非私有属性和行为的能力。继承是面向对象编程的四大支柱之一,用于提高层次结构中类之间的代码可重用性。 在本教程中,我们将了解 Java 支持的继承类型,...
Java Message Service 是一种支持正式通信的 API,称为 网络上计算机之间的消息传递。 JMS 为支持 Java 程序的标准消息协议和消息服务提供了一个通用接口。 JMS 提...
之前,我介绍了spring 3 + hibernate 集成 示例和struts 2 hello world 示例。在本教程中,我将讨论在将 spring 框架与 struts 与 hibern...
Java 项目中的一项常见任务是将日期格式化或解析为字符串,反之亦然。解析日期意味着你有一个代表日期的字符串,例如“2017-08-3”,你想把它转换成一个代表 Java 中日期的对象,例如Ja...