zzz6519003 / blog

My blog about coding
4 stars 1 forks source link

虚拟DOM已死? 2016年10月21日 by 杨博 9 Comments #115

Open zzz6519003 opened 5 years ago

zzz6519003 commented 5 years ago

notreami

2016年10月24日 at 下午1:41

为何不直接自己开发个Js库,使用Scala.js,意味着成堆成堆的scala语法概念。这么看来Binding.scala绝对比React或者Angular复杂,因为它除了js语法,还包含scala的大量语法糖,甚至为了兼容ng和react还要知道scala-react,scala-angular等等,瞬间变成万金油,PHP的高难度学习版。

纵观Scala开发人员为了节省几行代码,微弱的性能,往往要花费大量的时间去学习和思考如何书写,而且很难做到熟练使用Scala,最奇葩的是:基于其他语言之上,也就是说,如果使用Binding.scala,肯定要学习Reactjs,Angular,甚至ES5、6等等,这样再学习Binding.scala的意义只为了节省几行代码,微弱的性能。性价比非常低廉(不如省点时间照顾家人)。

回复 杨博

2016年10月24日 at 下午1:58

不用JavaScript的原因是因为JavaScript写不出来。JavaScript缺乏类型系统,对函数式编程的支持也很孱弱,没办法实现完整的Monad。Scala的类型系统虽然比idris弱,类型推断也比Haskell差。但在主流语言中,却是唯一能够实现 @dom 注解和 bind 语法的语言。

JavaScript 的生态环境碎片化,缺乏整套解决方案,开发者需要自己来组合gulp、npm、bower、webpack、babel,才能实现 Scala.js 和 Binding.scala 内置的很多很简单的功能。从节省时间照顾家人的角度讲,推荐你试一下 Binding.scala 的整套解决方案。

我可以推荐一套全栈Scala的项目模板。https://github.com/Algomancer/Full-Stack-Scala-Starter 对新手来说很容易上手。

回复 Zack

2016年10月25日 at 下午5:52

framework 的一揽子解决方案(如: Angular, 全家桶)和 library 的灵活组合方式 (如: React, 乐高)的争论, 是继”vim 好,还是 emacs 好”, “java 好, 还是 .net 好” 之后的又一个世纪难题.

回复 杨博

2016年10月26日 at 上午10:48

ReactJS并不能算灵活组合方式。

你可以看一下《React.Component损害了复用性?》( http://insights.thoughtworkers.org/react-component/ )。如果你看完你就知道ReactJS复用性不是很好,很难组合。

回复 王熊喵

2016年10月27日 at 下午3:11

那么使用typescript又如何? 另外vueJs用setter,getter解决绑定问题高到不知道哪里去了

回复 杨博杨博

2016年10月27日 at 下午5:11

TypeScript的类型系统还是太弱了,不支持type class,也就没办法支持monad;不支持monad,也就没办法用ThoughtWorks Each来做DSL。不用ThoughtWorks Each的话,就没办法在保证类型安全的前提下把“数据绑定”实现得很简洁。 总之TypeScript无论是语言本身还是生态环境,都不够完善,缺了太多typelevel编程的基本功能。

相比之下,Scala社区流行的函数式编程库,比如Scalaz、Shapeless、Cats等,几乎不用改一行代码就能在Scala.js运行。所以有了这些成熟框架的支持,如果要在前端开发中享受静态类型检查的好处,可能没有比Scala.js更好的生态环境了。

至于Vue.js……熊喵同学,你说这些时真的认真比较过Binding.scala和Vue.js吗? 我觉得你可以用二者写一下这几篇文章的示例代码,然后你就能体会到Vue.js和Binding.scala相比,差距有多大。

回复 杨博杨博

2016年10月27日 at 下午5:18

其实Reactive Programming在Scala这样的函数式编程语言中,可以直接套用范畴论中的概念,而这些概念,早在多年以前就有很成熟的实践了。所以我用monad实现Binding.scala就挺容易的。

相比之下,ReactJS受限于孱弱的JavaScript生态环境,就只能自己重写一个JSX编译器,再用虚拟DOM这种笨办法模拟FRP的效果,实现起来很费劲,代码比Binding.scala多了几十倍,却只支持Binding.scala一点零头的功能。我看着觉得挺心酸的。

wuhx

2016年10月31日 at 下午2:07

你不理解有一个强类型系统的好处所以才这么想,语言的问题不是加几个库就能解决的。 scalajs的核心概念并不多,入手应该不难。如果不考虑兼容现有项目,scalajs-react这些库完全不用去学,手动写scala代码就能更优雅的解决大部分问题。

回复 Evoque

2016年11月29日 at 下午8:35

没接触过scala,但是有强类型语言的功底, 就凭类型检查这点就喜欢上了Scala.js, 抽时间好好研究, 谢谢楼主的分享, 起码对前端的认识更深了一层, 希望能在研究一段时间之后可以和楼主进行相互受益的讨论!