2021年,22岁架构师在干什么

1,266 阅读5分钟

halo,大家好,我是 132,在 2020 年最后一天,写一篇总结……那个,据说在掘金写文章,必须得要标题不要脸,才有人看,我信了

搞架构之前

今年七月份,我拿着一张学位证,一张毕业证,正式离开学校,开启了真正的职业生涯

我妈泪奔:别人家的妈妈都抱孙子三世同堂了,而我却成留守老人了……

就这样,我先是入职了一家音频公司,决心为爱发电,没想到遭到了毒打,歧视应届生工资低都没啥,主要是人家直接告诉我:没爱

我大概也就伤心了一二三四秒吧,就……请看第二段

提出想法

我终于入职了新公司,感谢 leader 的信任,让我一个“年轻人”做架构方面的内容

真的入职了架构组,我才意识到现实和脑补之间的差距……公司中的架构,往往不是你写个啥框架,更多的是业务架构,是各种轮子的组合与封装

我分析了我们公司原有的小程序架构,发现真的很复杂,整个工程的开发链路实在太长了

我和 leader 说,我想写一个打包器,移除掉所有 webpack 和 rollup 的打包过程,一次性解决链路问题

github.com/facebook/me…

其实大家都发现了类似的事情,RN 团队也单独写了一套打包工具叫 metro,我认为我的想法是足够理智和靠谱的

设计

真的很感谢 leader 的信任,我可以正式开工了

这一张图中,包含了太多的东西,每一个环节都可以详细说

总体思路差不多是这样的:

1. 将 wxml/wxss/wxs 转译为 jsx/css/js
2. 使用 fre 作为渲染框架,打包出 umd
3. 使用 berial 跑起来多个 umd

可以看到,整个链路非常流畅,一句命令就可以将微信小程序源文件,打包成能跑在 h5 端的项目

你可以理解为,我写了个 metro,但具体的细节有所不同,继续看

Compiler

对应第一步,也就是需要将 wxml/wxs/css 编译成可以被识别的 jsx/css/js

其实最主要的是 wxml 转 jsx,这块我单独写了一个 wxml-parser

这一步背后涉及到一些编译原理的知识

其中,parser 部分,我用了一次大遍历,直接从字符串生成 AST,没有经过 token 的步骤,这么做也是为了缩减维护量

generator 的部分,我借鉴了 jsx-lite 的思路,将其编译为 jsx 而不是 h 函数

github.com/BuilderIO/j…

这么做的目的是为了能够走到第二步的 babel 中

Builder

经过第一步编译,我们有了 jsx/css/js 文件,接下来就是很重要的打包了

打包这块其实套路也是固定的,如果你看过 webpack,rollup 等打包工具的代码,你会发现它们其实只做了一件事:构建依赖图

webpack.js.org/concepts/de…

在构建这张图的过程中,还要做一件事,那就是对文件的转译,为此,需要使用 babel/postcss/posthtml 进行转译

是的你没看错,上一步的编译器只是对 wxml 进行编译,而 css 和 js 是经过 babel 和 postcss 做修改的

与此同时,我花了一周时间研究 parcel 源码,因为它很巧妙地使用了这个结构,而不是

parceljs.org/how_it_work…

这一步是整个项目最核心的部分,这也是同类框架比如 taro 所没有的部分

我们经过 babel、postcss 不是未来直接改 js、css,而是“分析”内容,然后将有用的信息放到树上

之后我们操作的是树,而不是直接操作 ast

runtime

经过打包,我们得到了可以运行的文件了,然后整个 runtime 其实包括了两个框架:fre 和 berial

这俩框架都说我写的,如果我没写它们,可能就要使用 react 和 single-spa 了

现在想来,我还是很适合做架构的,需要的东西很多,而我恰好,全都有

github.com/yisar/fre

fre 是我写的前端框架,前天我发布了 fre2,它在算法,尺寸等方面都比 react 好得多

github.com/berialjs/be…

berial 是我写的微前端框架,它不需要封装 single-spa,所以更加可控

这部分其实只是 runtime 的封装,就没啥好说的啦

问答时刻

问答时刻,我脑补几个问题:

  1. 和 taro 等同类轮子有啥不同?
  • 业务层面的不同,taro 是 react 转小程序,我是小程序转 fre,是相反的,意思是无论如何你都可以保证微信小程序一个端,在保住微信的前提下,再去转其他端

  • 从源码层面,上面说到的 taro 是直接修改 ast,没有构建依赖树的过程,完全的 case by case,而我写轮子一般更注重数据结构,因为无论什么轮子,都有一个特点,那就是将实际问题转化为数据结构,然后用算法思维去思考和解决

  1. fre 和 berial 敢在生产阶段使用吗?

请注意,微信转 h5,无论如何,你都可以保住微信这一端,而 h5 端是你一句命令得到的,是白捡的一个端……它只要能跑,你就赚了

其实你用 react 和 qiankun 啥的也阔以,这部分 runtime 不是很重要,只是 fre 和 berial 对我来说更可控

  1. fre2?

fre2 发布,确实是我今年最开始的事情,我一般是上班时间搞公司的轮子,下班时间就继续优化 fre,两不耽误

总结

以上,这就是我在架构组做的事情,这整个思路说实话需要的东西蛮多的,上面列举的轮子我都研究了一番,说实话一个人搞压力山大

集大家所长,看得多,想得多,写得多,才能临危不乱