252021.9

前端框架发展脉络与趋势预测

前两天做了一个视频,聊了前端框架的话题,包括上一期robust也聊了前端框架的话题。对前端框架的发展的梳理,我觉得已经做的不错了。

本文再简单总结一下。

我把整个前端框架的发展,分为3个大阶段,其中黄色的框是jquery为王的阶段,典型框架有angularjs, backbone等,这一阶段的框架实际上也是数据驱动,比如angularjs和backbone,所以,我们不能用数据驱动来划分它们和后来的react、vue的区别。

绿色的框这一阶段有两个特征,一个是react、vue大行其道,另一个是类似babel、webpack这样的工具是开发工作的基础。在16、17年时,流行起来一句话,叫“学不动了”,意思是前端发展太快,冒出来很多东西,其中包括了对新框架的谈笑。但是,从上图可以看出,其实在这一阶段(上图中没有列举出类似cyclejs这类框架),并没有像上一个阶段一样那么多框架林立,而是被react、vue、angular统治,所以,有的时候,我们的感觉和实际的情况有一些差别。和上一个阶段不同,这一个阶段react作为主导框架,追求的是某种极客层面的快发体验,特别是react,在runtime上探索出了时间切片等。但是,react持续在runtime上下功夫,或许会错过下一个阶段。

蓝色框是第三个阶段,也是我们当下正所处的阶段。这一阶段的特征是基于编译的框架开始大行其道。以svelte为典型,vue3跟进,框架们都在想办法,让开发者在源码中使用比较特殊且体验更好的语法来写组件,然后通过编译器,把这一写法转化为运行时放到浏览器中跑。甚至,像alpine这类框架,直接在运行时进行解析和运行。这种基于编译的模式(实际上,angular2+的模板语法也是这种模式),可能是接下来这段时间前端框架的主要方式。

09:25:33 已有0条回复
162021.9

windows10 C盘后面有一个恢复分区,无法扩展C盘的解决办法

今天公司给装了一个新的500G的盘,导致我电脑瞬间多出很大一块空间。而看着越来越小的C盘,想到我以前也有拿D盘补C盘的操作,这次我索性把整个D盘干掉,来一个500G的C盘,岂不是爽歪歪。网上搜索了一下方法,windows自带的磁盘管理工具就可以满足,于是开开心心的打开磁盘管理,把D盘删了,然后按照指示,右键C盘扩展卷,然后,M的,这个选项是灰色的,用不了……

这么尴尬吗?我一看,在C盘后面还有一个很小的分区,写着“恢复分区”,大概是系统故障的时候跑一个特殊的小系统来做引导的吧。这个我没意见,但是你为啥插在C盘和D盘之间??磁盘管理工具又不能把它和D盘调换个位置。难道就这么卡住了?

又搜索了一下,https://www.diskgenius.cn/ 这个工具可以调整磁盘,于是下载下来试试。折腾了一下,发现可以采用一种变通的方法来处理。它可以调整磁盘大小,而且很诡异的是,调整磁盘大小时使用拖拽的形式,两边都可以拖,这就可以直接通过这个能力,把哪个“恢复分区”搞到最后面,把空出来没有的部分和C盘连在一起。

通过上面这个地方调整“恢复分区”大小,进入之后可以看到如下界面:

通过拖动的方式,把这个分区搞到最后面去,这样把空的空间留了下来。

这样愉快的调整完“恢复分区”之后,我想,继续用这个软件调整C盘的大小,结果,同样的方法提示这个磁盘加密,没法搞。难道没办法了?

这时,我又突然想到,回磁盘管理工具试试,在磁盘管理工具中使用右键扩展卷功能,竟然成功了。于是,我就有了一个接近500G的C盘,爽歪歪~

23:29:48 已有0条回复
142021.9

搭建起自己的vscode在线版本

我有一台服务器,放在那里特别久了没怎么用,今天在下班地铁上突然想到,我可不可以在平板上写代码?搜了一圈发现还是要上vscode在线版才行。于是回来就开始撸。

code-server超级简单,一个安装脚本解决:curl -fsSL https://code-server.dev/install.sh | sh,完成后修改~/.config/code-server/config.yaml,再运行code-server命令,就可以开始在线写代码了。为了安全,该用export PASSWORD="xxx"来配密码。

之后解析了一个域名过去,nginx代理转发,这个也很简单。

然后用certbot搞定https,这样就完整搭建了整个vscode在线版本。

另外,在我的pad上,竟然发现edge打开一片空白,而华为自带的浏览器打开迅速。再使用“添加到桌面”,code-server提供了PWA,直接全屏玩,真挺用心了。

00:21:00 已有0条回复
132021.9

JS角度看什么是多态?

多态的简单解释是,调用相同的接口传入相同的参数,由于被调用的设备不同产生了不同的副作用/效果。例如同样是console.error,在chrome浏览器里面和在nodejs的command inline interface里面,效果就不同。基于这一特性,我们可以对接口进行抽象,简单的例子如下:

interface Person {
sing(song: object): string;
}

function sing(person: Person, song: object): string {
return person.sing(song)
}

上面的代码里面,我们创建了一个sing函数,它接收person这个对象,并调用它的sing方法。由于类型的约束,接收的person一定会有sing方法。但是,这个person.sing这个方法会做什么事呢?对于sing这个函数它并不知道,它只是调用了person的sing方法而已。所以,我们基于多态实现person。

class Person1 implement Person {
sing(song: object) {
const { lyric } = song
console.log(lyric) // 打印到屏幕上
return lyric
}
}

class Person2 implement Person {
sing(song: object) {
const { lyric } = song
Audio.paly(lyric) // 播放声音
return lyric
}
}

两个类实现了相同的Person接口,但是在实现的时候,又使用了不同的副作用,这就是多态。

那么,多态有什么用呢?对前端有什么影响呢?

第一点,是代码写法上的变化。

以前我们喜欢extends来得到一个具体的类,比如 class Person 有一个 sing 方法,我们通过 extends 来覆盖这个方法。这也就意味着,你的代码里面,一定会引入原来的 Person,并且原来的 Person 里面的 sing 方法一定会在最终打包的代码里面,虽然它永远都用不到。而新的写法是在调用函数的时候,把类的实例传入进去,这把引入模块的工作交给函数外部去做,这就让到处这个函数的模块的代码瞬间减少了。

第二点,是架构设计上的变化。

以前我在架设react项目时,会以View作为入口,应用的一切都是先有View,在View中去引入需要用到的Model等其他模块,这也就意味着,应用以View为顶层入口,所有的代码层层引入,绑定在了一起。现在,我们利用多态,换一个角度。我们让开发者自己写入口,这个入口我们称为Controller,我们提供的框架不是让View去使用Model,而是反过来,让Controller去使用View,让Model去使用View。这个场景下面,View必须按照接口约束提供接口给Model使用,这个时候,我们写Model就可以反过来考虑控制View(这里的Model是指ViewModel)。这种转变非常神奇,从框架层面,它颠覆了传统前端的开发方式。

10:39:36 已有0条回复
082021.9

之前一直想买一个Pad,但老婆觉得太贵没必要就一直没有买。昨天实在没忍住,在得到老婆允许后,一咬牙就买了这一台matepad。我主要的想法是想基于手写笔做一些事情,例如记笔记,上网课。昨天拿到手后开始调教,现在已经感觉差不多了。手写笔非常有感觉,可以随便涂涂画画,但实际上用来写作的话,速度比较慢,因为辩识手写肯定有一个误差,而且写完一个字的速度没有打字来的快,所以在需要大量字的时候我还是倾向全键盘输入。

07:10:14 已有0条回复
022021.9

《软件方法(上)》

自己团队的难处与众不同,奇特的困难降临在他们身上,偏偏别人得以幸免。

--http://www.umlchina.com/book/softmeth_pre.htm

14:12:11 已有0条回复
292021.8

过去半年用Edge替换了Chrome,在运行上,感觉和chrome没有差别,甚至还有一些特别的功能,以及没有墙的感觉,挺好。但是,这两个月陆续发现Edge占用内存上升,CPU占用增加,另外还有一个微软的software update在那里一直跑,依依不舍,用回了chrome,瞬间电脑不卡了。。。卧槽,不卡了。。。今天还看到一个消息,Edge新标签页强制广告关不掉,真垃圾,作恶多端。

22:20:31 已有0条回复
272021.8

我写了一个vue全局状态管理器,被喷的五体投地

在知乎上看到一个问题,问“vue3下vuex是不是就没意义了”,便随手回答了一下,调侃自己对vuex本身的设计就表示不认同,主要的理由是vue本身支持直接修改属性完成响应式,而vuex却要学redux那一套定义mutation、action之类的,过于复杂,真正简单的方法,应该像vue本身一样,直接修改属性。于是写下了自己的想法:

const store = new Store({ a: 1 })
app.use(store)

然后在组件里面修改:

this.$state.a = 2

这样看上去多舒服,思路上和vue一致,定义全局状态时,也不需要复杂的mutation, action,只需要一个对象。这才是最符合直觉的vuex使用方式吧。

简单写完上面的想法之后,我就没管了,没想到过了两天,这问答下面都积累了50条评论,点赞也蹭蹭蹭的在增加,感觉要火呀

但是,当我看完这些评论之后,却高兴不起来,因为在这么纯粹的想法面前,各种抖机灵的评论都出来了。其中一个重要的讨论点在于,基于dispatch('SOME_NAME'的方式有利于调试,找到状态被修改的位置。我对这种辩解嗤之以鼻,大部分人根本没搞懂redux里面dispatch的设计思想,就在这里各种吹捧,他们无非把dispatch当一个带字符串标记的update看,而人家真正的设计是send(message)的理念,躺在两条河里还说洗的一个澡,我也是有点服。

不就是想追踪状态被修改的位置吗?我想,既然都已经提出来了,不妨实现吧,毕竟我造轮功力还是挺强的。简单翻阅了vue的文档,花了2个多小时,写了一个stupid-vue库。

https://github.com/tangshuang/stupid-vuex

使用方式如下:

不得不说,vue3的api设计比vue2合理了非常多,在vue2时代,我做相关工具的时候,非常吃力,但是到了vue3,所有api都是顶级暴露的,想要什么能力都可以组装出来,很厉害。

一通操作下来,这个包就这样发布了。

等一下,状态修改追踪呢?我利用了Error的特性,抓取它的stack,直接可以得到状态修改时,是由哪一行代码造成的。

看上图,通过点击浏览器里面的调试代码,就可以直接定位到源码的位置,这比所谓vue devtool给的一大串跳来跳去,只能看数据流,最后你还是不知道具体哪个位置带来的变化来的更直接吧。

多好。

故事就结束了

....并没有。“你这不符合单向数据流的理念”,WTF??在vue里面你跟我讲单向数据流的理念,入魔了吧。

我大部分时间都是用react来写项目,没曾想vue发展这么快,vue3真的很好用,唯一的不足在于它强依赖构建工具,如果能做到vue2一样直接浏览器引一个库,在运行时编译,那就很方便了。不过随着前端发展,这种依赖工具的框架慢慢成主流,也是正常的。

网络上会喷的人很多,但是,看一个人行不行还是要看他的行动力,只会喷不会造,这种人不必理会,提升自己的内功才是王道。

08:46:25 已有1条回复
  1. 确实直接new一个Vue拿来用其实就挺好
    #1085 1188 2021-08-27 15:39 回复
252021.8

certbot依赖版本低导致https自动续费失败

今天登陆博客时,直接被浏览器拦截,ssl证书过期了。很奇怪,因为我已经有快一年多没有理会了,certbot renew --dry-run 会自动帮忙续费证书,为啥现在突然无法访问了呢?然后准备登陆服务器,额。。。太久没有登,用户名密码全部忘的干干净净,哎。折腾了很久,终于登进去了,然后各种折腾,忘记了certbot的命令,幸好自己有写博客的习惯,当时开https的时候记了一笔,顺藤摸瓜,找到certbot的官网,才找出命令。跑完renew之后还是报错,这就让我很尴尬了。再经过一番搜索和折腾之后,原来是之前的版本不再支持,所以证书到期之后,自动续费机制失效了,但是这个我并不知道。搜了一大圈,最后在国外的一个网站上找到一句话,yum update certbot,启发了我,想是不是要升级certbot,于是折腾升级完毕,再renew,果真可以了。世界上真的没有一劳永逸的东西。

23:09:23 已有0条回复