04-04 微信群聊天记录整理

#1

工业聚 09:12 https://twitter.com/ryanflorence/status/981179212147998721

工业聚 09:13 把 context 的 data 和 updateData 通过组件的 setState 封装,传递下去

司徒正美 09:44 这个怎么这么有才

工业聚 09:48 这个就是声称替代 redux 的做法吧

工业聚 09:48 把 changeVal 分成多个函数,称之为 action

工业聚 09:48 再套上 immer,走 ContextCustomer(相当于 react-redux 的 connect)

工业聚 09:53 就是一个 redux-like 状态管理

工业聚 09:55 而且这个 store 还可以 combineReducers 和分形,再创建一个 StoreContext 组件,让它成为另一个 StoreContext 的 Customer,把它的状态变化,同步到 ParentContextProvider 里

工业聚 09:55 不过这样也复杂化了,未必好 卢泰安 10:01 据说是手写了object assign提升性能

司徒正美 10:02 在调试时

司徒正美 10:02 不用for循环

司徒正美 10:02 不用Object.assign

司徒正美 10:02 全部 =

司徒正美 10:02 [晕]

司徒正美 10:02 朴素就是高效

chenyong 10:14 手写 XD

Heaven 10:14 不应该呀,他们认识v8的人,应该去问问的

Heaven 10:15 那个讨论貌似是没有结论的,全是猜测

工业聚 16:53 webpack 对动态 url 在有限程度上支持

工业聚 16:54 require(’./test’ + xxx) 把 text 目录下的所有模块都打包

工业聚 16:55 require(url) 里 url 难以预测,webpack 很难知道应该把哪个 module 打包进来 当爱变成,如。果 16:56 我现在是用import先把他引进来 然后再去动态加进去,没用require了[捂脸]

工业聚 17:18 「2018 年我的学习方向主要围绕几块:1)函数式编程(主要是 Haskell);2)人工智能(主要是 Machine Learning);3)下一代前端开发范式。」

工业聚 17:19 前两个,也部分出于第三个目的而去做的

工业聚 17:20 别我们前端哼哧哼哧地搞,结果隔壁 AI 领域跨行业碾压了我们都还不知道[捂脸]

工业聚 17:20 提前了解一下,比较安全~ 暗影浅‮ 17:21 问个无关sb的问题url-loader的别名设置居然要./开头的?

chenyong 18:36 我有个不成熟的想法,

chenyong 18:37 既然可以 proxy 了,我们能不能对 immutable-js 做一个封装,正常 js 的写法,运行的时候就是 immutable-js 的数据结构,甚至是 compare 的时候 [捂脸] soda 18:38 immerjs 不就是?

chenyong 18:38 https://github.com/facebook/immutable-js/issues/440

chenyong 18:39 immer 似乎没把底层的数据结构弄得那么复杂,

chenyong 18:39 比如说拷贝一个很长的数组, 其中一个改了, 看上去应该是最粗暴地复制一遍.

chenyong 18:40 但是 immutable-js 可能做了复杂的事情来优化

工业聚 18:43 immer 里的复制是跟着访问路径走的

工业聚 18:44 在返回时,会保留共享结构

chenyong 18:45 通常是够用的. 我是在想 [1,2,3…1000] 这种数据, 如果修改了一个, 他应该是直接拷贝了一份,

chenyong 18:45 而 immutable-js, 如果是用了 Clojure 这边的算法, 其实不用拷贝那么多,

工业聚 18:46 都得这样

chenyong 18:47 不是啊, 我是说 Clojure 还有针对这种优化啊

chenyong 18:47 http://www.hypirion.com/musings/understanding-persistent-vector-pt-1

chenyong 18:47 子树有办法复用的

zwhu 18:57 immutable 有 list 吗

zwhu 18:58 那你对比的应该是 immutable 的 list 而不是 js 的 array

zwhu 18:58 只是从 immutable 的 list 转到 array 的时候会有性能损耗

chenyong 18:59 嗯, 我在比两个不同语言的不同数据类型了

zwhu 19:00 如果所有操作都只是用 list ,我猜也不会 copy 一份吧

chenyong 19:01 Clojure 的 List 是从头部开始操作的, 如果操作头部, 后面的都可以直接引用, 如果操作尾部, 那么所有的数据都 copy 一份了.

工业聚 19:01 明白了,immutable.js 背部可以做更多优化

chenyong 19:01 对随机读写非常不友好的数据结构

chenyong 19:02 js 的 array 对比起来简直万能…

工业聚 19:02 finger tree 的优化就是把列表做成一种树形结构,访问,修改,添加和删除都很快

工业聚 19:03 immer 优化空间不多

工业聚 19:03 用户修改的写法是原生风格的

chenyong 19:04 https://en.wikipedia.org/wiki/Finger_tree 算法略高端, 还没动

工业聚 19:04 不管是劫持还是 copy-on-write ,都有固定开销

工业聚 19:04 适合 reducer 这种小范围修改的场景 叶子 19:04 还没有

工业聚 19:09 immer 其实是 copy-on-read + copy-on-write + dirty-check

工业聚 19:09 当访问某个属性时,拷贝一份添加代理机制

工业聚 19:11 等待用户修改后,跟原版进行浅对比的脏检查,发现有修改,再浅拷贝一份,更新状态

chenyong 19:11 我翻了下源码,大致看到用了那些函数,但是没看明白具体怎么生效的,[捂脸]

工业聚 19:11 访问路径越深越广,生成的代理对象越多,脏检查的范围越广,性能越低

chenyong 19:12 比我想象的短太多了

工业聚 19:16 callbag 更短:joy:

chenyong 19:19 Clojure 好歹长一点…

chenyong 19:36 https://gist.github.com/jiyinyiyong/14a28ce845e24c0d638ecbf20ddaa14e @工业聚 我试了下各种劫持

工业聚 22:20 尝试用 haskell 实现一个简单的 todo list,使用 redux-style

工业聚 22:20 state 类型和 initialState

工业聚 22:21 aciton-type 和 action-creator

工业聚 22:21 reducer

工业聚 22:21 手动 dispatch~~

工业聚 22:26 用 guards 语法糖,消除 if else 语句的样子

工业聚 22:38 再挪出函数定义,腾空 reducer 代码,减少细节

工业聚 22:41 再把 map 换成替换为 list comprehension 的语法糖,reducer 里的代码看起来,更加一致

工业聚 22:42 不需要搭一个 redux 的库,用语法糖糊一糊,视觉效果看起来还不错~

bailnl 22:44 感觉没法看 博深 22:47 redux 没法 scale, 可以研究下 ECS, https://github.com/jonascarpay/apecs

工业聚 23:13 Discussion: componentWillReceiveProps vs getDerivedStateFromProps https://github.com/reactjs/reactjs.org/issues/721