Menu Explicit/Hidden

Scala.js的诱惑


通过NBN访问Google翻译自:http://blog.ramnivas.com/technology/2016/02/09/the-allure-of-scalajs.html 无法忍受机器翻译的童鞋直接移步E文


 

最近,当我开始了我的工作启动时,我需要选择一组技术,这将使我们的小团队有效。从一个高层次的架构的角度,我们的产品是一个相当典型的现代应用程序:它有一个API后端,单页Web应用程序,并为iOS和Android移动应用程序。曾使用的Scala成功了许多年,在后端的选择是显而易见的。但是,当它来到前端(Web和移动应用程序),我们决定通过使用Scala的Scala.js为好。鉴于Scala.js是一个相当新的技术(目前的版本是0.6.6),我有选择它的一些心中无数。在,我很乐意几个月已经取得了这样的选择。所以,想和大家分享我找到Scala.js如此大的吸引力。

总之Scala.js

Scala.js提供了一种方法来编译Scala代码为JavaScript。您可以使用大多数Scala语言(约除了大部分的运行时反射的所有语言功能)的。您可以整合现有的JavaScript库和框架提供方便(我们使用作出反应,通过scalajs反应的,例如)。在开发,编译在“快速优化”模式的项目,这有利于更快地建立在较小的代码大小的时间。对于生产版本,使用“全面优化”模式,这需要更长的时间,但会产生有利于较小的输出代码大小(我们的应用程序所产生的JS文件,因为它代表今天的代码,是约180 KB gzip压缩,但不包括外部库,如作出反应)。既然你用Scala编写代码,您将获得斯卡拉的所有优点:静态类型,函数式编程,漂亮的集合库,理智的方式来处理异步计算,等等。

事情去为Scala.js

如果工具是成为成功,目标社区必须是已经渴求所带来的好处。否则,它可能是在错误的时间,合适的工具。面临着发展的前端将的任务Scala的开发者,没有太多的推动下,看到Scala.js是一个显而易见的选择。但是,一个真正的有趣的问题是会JavaScript开发看Scala.js作为落实前端更好的方法。为此,我感知如何JavaScript开发人员积极看待许多属性,使斯卡拉摆在首位的吸引力的转变。由于Scala.js实质上是在斯卡拉JS,这可能是一个非常及时的发展。

静态类型是由JavaScript的拥抱

作为单页应用程式增益突出,人们越来越认识到,在JavaScript的动态类型可能不是在维护的方式各具特色的大型应用的最佳方法。我看到这种认识在很多地方。

  • 反应允许表达类型的属性。此功能更像基于类型的运行时断言。通过此功能所提供的保障是相当薄弱,检查是晚期(开发模式下的实际执行过程中),但它是有利于静态类型的方向迈出的一步。
  • 流通过批注和推断类型提供静态分析中构建时,显示类型错误。类型注解,你可以提供并不像斯卡拉的表现,但它可以从几个硬盘为您节省调试类型错误。
  • 角2.0是使用打字稿,而不是JavaScript的,这样的代码可以包括和框架可以利用类型。
  • SoundScript的目标是在打字稿在理念,提高并主要侧重于类型的流。
  • 不包括在代码本身类型即使当,有一种被类型的至少文档中意识到的倾向。例如,Falcor文档描述了很详细的类型。

即使看着一般的语言,很显然,被认为有必要对静态类型:类型化Clojure的,类型化的Lua等。“走路像鸭子,叫起来像鸭子,那么它一定是鸭子”也改为“如果这是一个鸭子,就这么说!”。

所有这些指向一个明确的认识,即某种形式的静态类型的开发复杂应用程序时是有帮助的。Scala的类型系统是远远更具表现力和久经沙场的,所以应该允许跨越式前进其他方法。在另一面:有几个会看Scala的类型系统过于表现和/或太复杂!这是不是开玩笑点。静态语言,斯卡拉在内,仍在努力寻找易用性和安全性的最佳组合。

在我们的产品开发中,我们每天看到静态类型的好处。例如,最近,我们不得不通过合并几级,并增加了一些其它改变树状实体。随着Scala.js编译器看我的背,我可以很容易地重构它。基本上,我根据需要更改模型,然后不停地处理由编译器发出的错误。当我得到了整个应用程序编译的时候,我也有应用程序再次合作。我记得沿我的脊椎,当我不得不做类似的任务单独使用JavaScript当寒意。

静态类型还帮助我们什么,我们已经建立信心。由于这是测试是很难的。测试前端更是如此。虽然不能代替正确的测试,静态类型已经极大帮助,提供甚至在我们测试应用中的一些保证。

函数式编程是越来越多的JS更多的支持

函数式编程,一般来说,越来越突出; 有他们在普及和不具有语言上涨语言中加入朝它一些支持的过程。虽然JavaScript的包括函数式编程的一些支持,ES6需要再进一步以更简单的函数语法带来并添加常用预计收集操作,如地图和的forEach无需外部库,如下划线或lodash。

Scala的函数式编程的支持更全面更彻底。异步编程- -在前端开发特别关注的一个领域使用变得很自然的未来 S和承诺在斯卡拉秒。映射和flatmapping过期货的心理模型比回调遍布代码库的方式更加自然。在这里,JS世界正在朝着正确的方向移动的API,如取。

Scala是一种这里有点独特的定位,它也融合了面向对象与函数式编程。随着ES6包括班适当的支持,开发人员应该得到那个熟悉的感觉。

我们有很多的代码,最好表示为数据转换和出借以及函数式编程。整体功能编程的概念一直保持干净的东西,可测试,和可维护性。

不变性开始被公认的好东西

几年前,前端发展意味着变异的对象和应对变化。AngularJS 1.0,例如,依赖于观测数据和DOM突变,并通过一双向绑定机制使它们保持同步。这种面向可变性的思想导致Object.observe在ES7建议。

所有这一切正在改变。REACT为促进各方面的永恒性。2.0角也被推广不可变对象。凭借努力,如immutable.js,很容易让JavaScript开发人员与一成不变的数据结构的工作。这样可以减少开发商谁已经倾向于采用不变性斯卡拉摩擦。而Object.observe ES7的建议可能不会毕竟发生。

在我们的产品中,我们使用一种改进的流量模式,并限制可变性的几个专卖店(我们正在考虑改用二极管)。这减少的认知负担极大,因为我们知道在哪里看时,事情改变或预期不改。由于采用一成不变的模式的一个直接的好处,我们得到不计成本撤销/重做功能。

JavaScript开发人员已经使用构建工具

对使用纯JS的好处是迅速变化保存重装模式。但是,一旦你开始使用任何编译成JS语言(包括ES6),您必须添加一个生成步骤使用一饮而尽,的WebPack等。实际上,你需要一个生成步骤,甚至当你开发使用普通的JavaScript来处理资产管道等斯卡拉是一个编译语言显然需要一个构建工具(Scala.js,最无摩擦的工具是SBT)。既然你需要一个构建工具,不管你去哪个方向,在SBT抛来编译Scala代码不觉得作为一个大的交易。

对我们来说,这要归功于Scala.js增量构建支持,每一个变化大约需要5秒钟建设(一岁的MacBook Pro)。虽然不是太糟糕了,这是一些地方Scala.js可以改进对,还有人认为这样一个增量链接这个时候,应该削减到一个较小的数字的一些想法。

Scala.js已经支持同构的属性

同构,在Web应用程序的情况下,意味着有表演服务器或客户端的一些工作的选择。例如,渲染在服务器上的初始页面,然后在客户机增强它(与事件处理程序等),以改善在初始加载时间的常用方法。

我们利用同构上取决于上下文或服务器或客户端上运行的几种算法。这让我们写几个相当复杂的算法只有一次,让他们跑他们的地方最为合适的 – 在JVM上的后端或JS前端。

斯卡拉生态系统的背后是Scala.js

似乎在斯卡拉社区扪及能量周边配套Scala.js。基本上,斯卡拉社区开始看到JS为斯卡拉第二个平台。一些库专门针对Scala.js(upickle,boopickle,自动装配等)。那些最初主要提供更早的唯一平台- JVM -正在发生变化,使他们的JS平台(上工作Scalatest,scalaz,不成形,单片眼镜等),在适当情况下。新库看到支承Scala.js作为共同的要求(猫,镜片,瑟茜等)。围绕Scala.js这种能量有助于应用相同的库和技术运行良好的在服务器端对客户端。

是不是合适的时机?

新的编程语言,框架,工具和方法 – 但伟大的 – 风风火火,只有当目标受众已经准备好由他们提供的东西。对于Scala.js,UI的设计社会似乎催芽现在拥抱在斯卡拉提供多方面的相当长一段时间。所有这些因素都让我感受到Scala.js可能被证明是一个强大的候选人,当涉及到前端的发展。当然,还有许多其它因素,如果Scala.js是要实际获得成功,这将在决定发挥作用。这似乎是一个没有脑子对于已经熟悉斯卡拉开发商给试图Scala.js了一枪,但只有时间才能告诉我们,如果其他开发商会接受斯卡拉使用Scala.js。

就我们而言,使用Scala.js一直在努力奇妙!

标签