3

wepack 之 dependency tree

 3 years ago
source link: https://zhuanlan.zhihu.com/p/345800597
Go to the source link to view the article. You can view the picture content, updated content and better typesetting reading experience. If the link is broken, please click the button below to view the snapshot at that time.

halo,大家好,我是西天小如来 132,米娜好久不贱,真的好久好久

最近状态特别不好,工作上做了一个短期不会产生收益的项目,加上最近老被质疑,有点怀疑人生了……

其实,我在公司里,写的是一个叫 wepack 的轮子,就是将微信小程序,一键打包成 spa

说来轻巧,市面上也有一些竞品,比如 taro,但……

我最初的冥思雏形,是很美好的

case => 数据结构

如题,如果只是编译一些文件,然后 casebycase 的修改 ast,那么这个轮子就会很愚蠢,事实上,taro 也吃了这个大亏,taro3 也完全放弃了编译路线

但是如果我们能找到一个数据结构,去抽象,概括业务 case,如果真的可以找到,我们将彻底摆脱 casebycase 的处境

实际上,几乎所有的轮子都是这么做的

比如 webapck 的dependency graph,rollup 的 module graph ,parcel 的bundle tree

所有的打包工具,套路都是一样的,说白了就是构建一张图(或树),如果一个不够,那就构建两个

也就是说,wepack 作为微信打包器,它理应非常非常简单地,只做一件事

那就是我也构造一棵树

漫漫建树路

于是,我就开始做梦冥思,这颗树,长啥样,然后写了很多个版本代码

因为微信小程序是个多页面应用,我一开始企图将每个 page 构建一颗小树,然后最终再用微前端的 server 跑起来

事实上这个思路完全可行,我马上就写了一个很 ok 的 demo 并封装了组件和 api

但和我想象中的 一树走天下 差太远了

所以我开始想办法大重构,我一定要用一棵树彻底概括整个小程序多页

Asset {
  type: root
  path: 'E:\\wepack\demo\app.json',
  siblings: Map[ Asset, Asset, Asset ],
  parent: Asset
  dependences: Map[ Asset ],
  isComponent: false,
  generator: ()=>{},
  parser:()=>{}
}

抄袭 parcel,将每个文件都抽象为 asset,每个 asset 都对应自己的 parser 和 generator,还包含了这个 asset 的基本信息

碰到循环依赖,则依赖应该上移到他们共同的父亲中

像 rollup 这种只需要处理 js 的轮子,它可能就只有一个 js 的事,parcel 和 rollup 更进一步,除了 js 还有 css 等,单位变成了 asset

小程序比较坑的是,它的单位不只是 asset,它其实是这样的

[ App ]
[ Page Page ]
[ Component Compnent Component ]
[ Asset Asset Asset Asset ]

别提有多坑爹了,真特么鬼才,所以

我。不。同。意。

我希望将它们全部高度抽象为 asset,但这也是卡我最久的地方没有之一,我还在冥思中

小程序标准

今天 w3c 的一个公告,大致上说的是百度,阿里的程序员联合搞了一个小程序标准

说实话打心底里我觉得不可取,我在写 wepack 的过程中,感觉微信小程序很多设计上的问题,可以说完全继承了 web 发展以来所有的缺点

小程序底层双线程的架构我还是很看好的,但它用户层的这一整套,真的一点都不高明,这种东西成为了标准简直是灾难

再者说,之所以要搞 wepack,将微信小程序转译成其他端

本质上也是为了无论如何,保住微信,其他小程序嘛,可有可无

这玩意真的没办法,微信就是标准,再辣鸡也是标准

总结

基佬名言:数据结构乃造论之道

说实话,这就是我写这么多轮子,唯一悟透的真谛

国内 90% 的造轮师还停留在 casebycase 的阶段,这种轮子是非常可怕的,祸害业务线同学罢疗

其实这是一个鸡和蛋的问题,先有鸡再有蛋还是先有蛋再有鸡

现有业务,再有数据结构和算法,还是先积累数据结构,再应用到合适的场景上

我主张后者,但前提是积累,必须积累足够的认知才行

以上,这就是我最近的一些困惑和思考……

我最近被知乎大 v 喷的挺多的,我希望大家都能理性对待这些事,我回答的那些问题,基本上没什么营养,无非就是有人邀请了,我就去鸡同鸭讲一波

而且,我写文章就是用来放顶图的,我写回答也是专门用来招基的,这是我的个人爱好

所以你们懂了吧,我为什么不乐意去掘金发文章,就是因为掘金的顶图不够大!!!

以上,差不多就这些啦,我今天继续做梦冥思去


About Joyk


Aggregate valuable and interesting links.
Joyk means Joy of geeK