4

wean 太致郁了叭

 3 years ago
source link: https://zhuanlan.zhihu.com/p/360212731
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.

wean 太致郁了叭

俺,只想跪在床上娇喘,不想隔着网线叫唤

放假了,又可以休息啦,上周搞 wean 搞得我都抑郁了-_-||

但我还是觉得有戏,所以我准备继续卧薪尝胆!

重构数据结构

真的,搞完 wean 之后,我开始尝试跑我们公司的一个超级头大的小程序,然后遇到很多问题,大多数问题都是 wean 自身的

为此,我重构了 n 次,包括 ADT 的重构,wxml compiler 重构,虽然重构次数有点多,但不得不说,结构越来越棒了

我一直以来的战斗信念就是来自于 wean 优秀的结构设计

因为 wean 的 runtime 依赖 fre 和 berial,这俩其实相对比较稳定,但也暴露出来一些问题,所以我也适当维护了一下

(berial 现在能跑了,之前一直没管它)

我是一个很重视架构的人,我造了这么多轮子的经验就是,只要你能构建出来一个好的数据结构,那么就成功了一半

v2-0982083b0be25cc10e0827856a96d235_720w.jpg

如图,看着是不是很舒服,但就这个结构,我重构了好几次

wean 整个构建过程主要有两个阶段

  1. bundle 阶段,负责将小程序项目构建成 ADT
  2. package 阶段,负责将 ADT 的内容收集到 Page 上

然后 runtime 就可以将构建出来的 page 跑到 berial 和 fre 上了,可谓完美

抽象或概括

尽管我有在精心设计 wean,但很多时候,难免 case by case

最为明显的是 wxml 的 expression 解析

// 这样是可以的
{{aaa}}
// 这样也是可以的
{{aaa}} bbb
// 这样也是可以的
{{a.length>0?'a':'c'}} bbb
// 这样也是可以的
{{a.length>0?'a':'c'}} {{bbb}}

我真的是,能不能饶了我,当一个东西无法用一个规则去抽象的时候

唯一能做的,就是去概括它,case 越少月安全

所以最终你可以看到,wean 的 wxml compiler 我用的代码量非常少,但 case 也难免覆盖不全……

除了 expression 之外,还有 template 和 slot

因为 wean 是集中写入的,就是你在编译 wxml 的时候,是没有办法进行文件操作的,所以跨文件就成了大坑

//template
<template is="a"/>
<template name="a"/>
//slot
<slot name="b"/>
<view slot="b"/>
//import
<import src='./c.wxml'>

这些跨文件的东西真的烦死了,呜呜呜

解决它有两个办法

1. 实现 module federation 机制,将它们的编译结果放到全局变量上,然后在 runtime 拿 vdom

2. 分块编译,最终拼起来

我希望能用一种机制,去概括这些 case,不想胡来

if 联动

<view wx:if={{a}}>
<view wx:elseif={{b}}>
<view wx:else>

我真的是醉了,微信竟然还要这种联动,呜呜呜

这些骚操作,我真的很想知道微信是怎么处理的,有没有一个很骚的概括方式

runtime 很欠缺

实际上,无论是组件还是api,都很欠缺,这个只能说我在处理我们公司业务的时候,添添补补

另外,关于 runtime 的封装,其实也缺乏一个很好的方式去抽象

我这周会尝试用 class 去重构 runtime,争取能找到一个结构

总结

https://github.com/ctripcorp/wean/

最后放一下 wean 的 github 地址,真的,不管你是对小程序感兴趣,还是对打包编译感兴趣,都要来调试一下 wean 呀

因为 wean 有好几处值得推敲的地方,需要思考怎么去概括

同时这也是我写的轮子中,比较常规的了,可以学到很多

至少给个 star 呀!


About Joyk


Aggregate valuable and interesting links.
Joyk means Joy of geeK