昨天参加了沪江网的沙龙,分享了一下最近研究 Redux 的心得和想法
结束以后还听贺老讲了好多东西,回来很累,所以回顾的笔记拖到今天了@H_404_2@
单向数据流的分享
我分享的内容主要关于 React 数据层的一些想法,都是网上拼凑起来的
其实演讲的核心内容,我尝试写过博客的,主要是归纳了 Kafka 的文章一些想法
In Flux and SSOT,Store is not the Truth,Actions is!
包括近期对简聊的数据层做调整,也添加了很多的思考和代码
对我而言单向数据流这个未来的方向已经很明确了,MVC 都过时了
单向数据流基于不可变数据,或者说是 FRP(函数式响应式编程)@H_404_2@
然后 actions-recorder 对我来说其实是很重要的项目
觉得 Redux 引入概念太多,于是自己山寨的方案,并且计划在简聊运用
实际上在单页面应用的调试中,前面几天确实已经起到作用了的
我用 recorder 查看 store 数据,查看 action 操作内容,梳理加载逻辑
对照 Redux 在国外的轰动效果,我原本对这个期待是挺高的@H_404_2@
从反馈来看,现场做单页面应用的同学并不多的样子
活动中聊过的同学也都很年轻,对 React 的具体使用会挺关心
比起去前在蘑菇街那次分享,确实热闹多了. 当然毕竟都不是 React 专门的会
有问到 React 在 Teambition 的情况,实际只是简聊团队的 Web 前端而已
相比淘宝和 Strikingly 那样的投入,我们只是在专心对付单页面应用
但是呢,那么多人对 React 感兴趣还是很开心的@H_404_2@
数据层
React 带来的冲击,我觉得一定程度上就是 FRP 带来的冲击
virtual dom 进入大众的视野是从 React 开始,然而马上跟 FRP 紧密结合
其他的 React 当中的不可变数据,全局状态,在 Clojure 社区早已尝试
以及 React 组件主要的性能优化的方式,都受到 Om 影响很大
最近的 Time Travelling Debugger 就完全是走在 Elm 和 Om 的后面@H_404_2@
React 作为一个 view library,几乎影响到 Web 上各种渲染框架和方案
同时不可变数据和 Actions 的概念没有悬念地成为了标配
接下来,就是对于 Model 这一层开始施加影响了
之前的 Flux 我认为是权宜的方案,发挥了作用,也正在渐渐淡出
Facebook 推出 Relay,Netflix 推出 Falcor,社区发布 Redux
加上各种琐碎的实现,目前没有呼声一致的一个方案@H_404_2@
数据层涉及的方面太广了,浏览器内存,网络同步,服务器接口,数据库
单单 Relay 就提出了 GraphQL Server 的概念需要大量的代码去实现
至于前端用了不可变数据,之后呢,怎样是最合适的办法? 不清楚
有的人用 React 渲染界面,后边是 Backbone 或者 Angular
有的人用 JSON 对象存储数据,有的用 immutable-js,但是具体结构又多种多样
更重要的是要把前后端数据打通,简直又是一场破坏 Best Practice 的行动
然而这一次 React 社区提供的方案并没有那么顺利,也不能覆盖所有场景@H_404_2@
比如简聊来说,前端用 immutable-js,跟后端用 Restful 形式的 API
API 分成两部分,一部分是请求,一部分是推送,需要精确的数据更新
而且更多的情况是后端数据更新,前端跟着做出响应,类似数据同步
首先我们切换话题抓取消息的结构,并不是和组件绑定的,不像 GraphQL
其次服务器推送更新的机制,并没有看到 GraphQL 给出明确的方案
我们在单页面应用上希望做到增量更新,falcor 似乎接近一些,但也未必能用@H_404_2@
再有一点,当我们的应用,在前端保存较多的数据之后,数据就需要有效的管理
首先,为了方便 React 渲染和性能优化,我们不会去用 IndexedDB 异步管理数据
其次,我们要考虑数据界面分离,甚至尝试服务端渲染的方案,需要独立的数据层
再者,前端缓存了数据,怎样和服务器更新保持同步也是问题,而且两者结构不同
我的判断是,前端要么完全从后端同步数据,要么模拟一遍数据库,再做考虑
前者是我个人项目的 Cumulo,目前看来太过粗暴,走向实用难度很大
后者同样是一个缺乏经验的领域,大概需要大神为我们开路@H_404_2@
Best Language
对了,被贺老黑了 Haskell 的事情,Monad 的梗,果然还是应付不了
我现在大致能明白 List Monad 和 IO Monad 基本的用法和目的了
主要是在 Haskell 里的类型类,定义了 join
>>=
>>
等几个函数
复杂的情况比如 Reader Monad Writer Monad 就用不起来了嗯
至于九瓜老师没事在微博上发的神作 Free Monad 怎么怎么更搞不明白@H_404_2@
当然我依然认为 Haskell 是最好的语言,JavaScript 只能算最好的平台
编程语言本身需要支持数据抽象,操作抽象,模块抽象,语言抽象等等
...大致按照 SICP 的目录,对应编程当中需要的一些抽象能力
除此之外,类型系统,编译工具,语法糖,总之有各种被人挑剔的方面
而 JavaScript 从语言本身的设计,并不能看到很漂亮的内容在里边
而且语言很容易把人引入歧途.. 虽然大部分语言这都是很正常的事情..@H_404_2@
而函数式编程语言的研究给我们带来的就不仅仅是语言了
而且还会指引我们程序应该怎样设计,复杂度通过怎样的方式控制等等
结果就是 Haskell 很多人就不能学到能写代码的程度
即便只是这样,这已经能让人对程序的理解带来一些改观和提升了
再者 JavaScript 委员会纵然好,我被 Rob Pike 大神的演讲打动了怎么办@H_404_2@
结尾
沪江的沙龙跟 Teambition 的氛围挺像的,但大公司毕竟麦克风好一点 :P
中间茶歇还有会后的聚餐,也聊了一会见了挺多朋友.. 还有是加微信..
活动合照已转微博,其他的照片在微信群里有,我不想转了,官方怎么没发下活动的视频,活动期间有网上直播的,稍后可能放出视频吧,等微信群消息@H_404_2@