吹 React Hooks,垃圾!
React Hooks 中不乏一些优秀的思想,例如通过第二个参数告知 hooks 函数依赖,当依赖发生变化的时候,才会执行对应的处理。这在之前使用 reselect 中早就体验过,不是什么高深的技术。但莫名其妙的,Hooks 被吹上了天,认为它是下一代数据管理方式,我只想送一个字:呸!
我唯一觉得 Hooks 有些价值的,是官方博客中提到一点:有利于打包时,让产出物文件体积更小。这是个事实,因为压缩程序可以用 a() 替换一个命名超长的函数,比方 IwillFuckYouReactHooksFunction(),而如果这个函数名是一个 class 的方法名,则无法被优化(理论上是可以被优化的,对于私有方法,如果确保知会在当前 class 中使用,那么优化成 _a() 也完全没有问题,因为外部不可能用到嘛)。而 React.Component 的生命周期函数莫名其妙整那么长,刚入门的同学背都要背半天,就是罪魁祸首。
除此之外,Hooks 一无是处。
在一些情况下,确实让写的代码量减少了。但是你确定在撰写代码阶段节省的时间,没有在调试阶段还回来?Hooks 是一个异类,遵循其思想创建的函数叫“状态函数”,就像 Date.now() 一样,鬼知道它会返回什么结果。你自认为能控制被隐藏起来的状态,因为社区告诉你“你不需要关心状态,而是关心什么时候需要产生影响”。我就想说,你确定你不需要关心状态?摸着黑心问一问自己吧。当你需要关心一下的时候,你的状态在哪里?在 React 内部的堆栈中,你根本摸都摸不到。
而 React 是什么?基于状态的 UI 渲染引擎。社区总结的一句话是“一个状态对应一个界面”,你现在控制不了状态,然后跟我说,你可以完全掌控界面的变化。拉倒吧。
我可以不负责任的说:状态是函数的天敌!
我从来不在一个暴露的函数中使用状态(例如在函数中引用函数外的变量),虽然偶尔会在函数内创建一个私有函数使用函数内部的一个状态来加快写码,但是我很清楚,这个状态和函数都是用两下就会销毁的。React Hooks 反其道而行,又开心的说,我们拥抱函数式组建,又诡异的宣称,你可以在函数式组件里面操作和使用状态(但是你拿不到状态)。如果你不是经常去看源码,你会严重怀疑自己是不是进入了童话世界当起反派,明明理想那么美好,为啥我总是干坏事……
吹吧!下一代主流!
吹吧!最理想的 React 编程方式!
吹吧!……
git 撤销上一个 commit
在一些时候,我们不小心提交了一个 commit,在 push 之前,我们希望将这个 commit 撤销,重新提交。这个时候,你可以使用下面这条命令:
git reset --soft HEAD^
--soft 和 --mixed 都可以使用。这样就可以撤销上一条 commit,而且我们还可以利用类似都命令撤销前几条,例如:
git reset --soft HEAD~2
表示撤销 2 条。~ 后面都数字就是撤销的 commit 数。
linux 下以二进制的方式安装 nodejs
在一些linux环境下,安装最新的nodejs比较麻烦,因为受到linux源的影响,往往直接通过yum/apt安装的都不是想要的版本,因此,必须自己去选择对应的版本来安装。但是,nodejs官方又不会为所有的操作系统打包,而编译安装常常又会遇到依赖问题。所以在一些情况下,我们需要在linux机器上,直接下载官方构建好的产出结果来运行。
例如,我们现在需要安装v10.x版本,我们通过wget下载对应的-linux-x64.tar.gz文件,然后通过tar命令将其解压到/usr/local目录下,/usr/local 目录是用于存放各种软件程序的地方。然后将文件夹重命名为 /usr/local/node10 这样的文件夹名字。
tar zxvf node-v10.9.0-linux-x64.tar.gz // 解压文件夹 sudo mv node-v10.9.0-linux-x64 /usr/local/node10 // 移动+重命名
接下来,我们要将 node 的可执行文件目录加入到环境变量中:
## /etc/profile export PATH=$PATH:/usr/local/node10/bin
接下来,是将路径加入到 sudo 中:
## /etc/sudoers secure_path = ...:/usr/local/node10/bin
这样处理之后,就可以使用 sudo npm i -g 等命令了。
如果你的 sudo 需要代理,还需要:
## /etc/sudoers Defaults env_keep += "http_proxy https_proxy no_proxy"
这样 sudo npm i 才能通过代理进行安装。
完成上面步骤之后,重启服务器(重启是为了让配置对所有用户生效,也可以不用重启,在 bashrc 中增加环境变量,并通过 source 命令使之生效)。
因为疫情,只能窝在家里,体验了小姨子的 MacBook Air 11,特别小,屏幕边框还是特别宽那种,虽然小是小了些,但是真的特别小巧,而且特别轻,这才是我理想中可以随身携带的手提电脑,和一本书的大小差不多,重量上还不及一些厚书。放在书包里可以方便办公。当初我买了一台 18 年 MacBook Pro 13 寸,现在想来,其实不值,如果追求性能,应该选 15 寸,如果追求轻薄,应该选 11 寸 air。
在切换至 ubuntu 之后,本来有意打算使用 firefox 作为默认浏览器,毕竟是开源的亲儿子,甚至有想把 firefox 作为常用浏览器的打算。但是在挣扎一段时间之后,还是放弃了。原因有两个:1. 慢,和 chrome v8 比,确实慢。2. 标准支持,和 chrome 相比,还有一些标准不支持,导致我的程序无法运行,而且因为是正则,还没有办法 polyfill。另外,从开发者工具的使用体验上,chrome 的开发者工具显然要优秀一些。所以,最后,只能抛弃 firefox,再投入 chrome。
-
我也想拿 Firefox 来当平常的浏览器使用,但是真的不争气啊。
标准,速度方面倒还不说,我最在意的是进程内存占用不释放,使用时间长了内存越升越高,就算你把标签页差不多都关了,尤其是主进程内存一直不下去。
第二点就是同样的情况下,CPU占用就是比Chrome高。
其它的都不说,毕竟都是一会儿的事,但是内存一直不释放是持续的问题,我经常是浏览器一打开几天都不关,这种情况下无法忍受。
真的是不争气,一直升级一直这样。
而且按你的想法,solid.js 也是不可取的?
要不还是写原生吧 webcomponent 也有一些公司在实验性的用了
现在弃用virtual dom已经是大势所趋了,包括vue3实际上也不是完全的virtual dom了。
至于web component,怎么说了,它还是component,不是application,想要做应用,还需要更高层的设计,可以看下我写的框架 sfcjs https://github.com/tangshuang/sfcjs
用hook寫的程式碼根本不是人看的,由他們繼續吹吧。