1

天无卷人之路

 3 years ago
source link: https://zhuanlan.zhihu.com/p/382313553
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.
neoserver,ios ssh client

天无卷人之路

✅趴在床上娇喘,❎隔着网线叫唤

这三天真的过得超级痛苦,高烧 40°,强拖着几乎没有知觉的身体到急诊,但是流程实在太多了,因为我是高烧,大半时间都是在排除新冠o(╥﹏╥)o

然后好不容易开始注水了,竟然没有任何好转,尤其是我本身就有血液病,可能一次感染就能要了我的小命

迫不得已,注射了激素,好在现在是退烧了,但是等激素几轮半衰期过去,不知道会不会反弹,只能,听天由命了……

诱因

其实诱因还是很明确的,因为我端午节跑去公司加班了,也就是说我连续工作了整整两周加一个双休日……

因为我在搞携程小程序v3,真的压力好大好大,因为小程序的细节实在太多了,除了白天在公司里写代码,晚上做梦我都在想着这里那里的最佳安排

这是我能预料到的,因为我每次都这样,每次遇到短时间没办法搞定的东西,我都会扛不住压力,然后焦虑,失眠,生病……

但唯独,没有这么严重过

但是大多数调节方法我都试过没有用,唯一的解决方法就是——搞定它

微信小程序的一些奥秘

在写小程序的时候,我还是会结合微信的实现去安排我们的实现,微信是一个历史包袱堆叠的标准,很多时候是在偿还历史债务,但是我们是一次完整的重构,所以恰当安排非常重要

  1. 微信使用 web-component 实现自定义组件(树)

这是在微信中的实现,我加了一个单位,微信的自定义组件是有嵌套关系的,但 template 是没有的,我猜测他们应该是搞了一个类似 stencil 的框架,用了描述 web-component 的结构

但是我们小程序,在编译阶段就构建好了一棵完整的树,runtime 只是这棵树的一次递归的结果,所以不需要用一套额外的一个框架来做这些事情

但是对于小程序的 runtime 来说,也必须要有颗组件树才可以,我使用 id 来生成

Page(1, {})
Component(2, 1, {})
Component(3, 2, {})
...
//这堆函数执行完,就生成一棵树了
Page1
  Component2
    Component3

2. 微信的 wxs 竟然位于渲染层

我竟然被他的外表迷惑了,以前我以为 cjs 什么的,都是在逻辑层的,直到舍友告诉我,wxs 可以用来做 js 动画,可能只是实现了个 require 函数

function toCjs(code, exportsObjName, exports) {
	code = code.replace(/^(\s*)export\s+default\s+/m, (s, before) => {
		exports.default = true;
		return `${before}${exportsObjName}.default=`;
	});
	code = code.replace(/^(\s*)export\s+((?:async\s*)?function(?:\s*\*)?|const|let|var)(\s+)([a-zA-Z$_][a-zA-Z0-9$_]*)/mg, (s, before, type, ws, name) => {
		exports[name] = true;
		return `${before}${exportsObjName}.${name}=${type}${ws}${name}`;
	});
	return `var ${exportsObjName}={};\n${code}\n${exportsObjName};`;
}

嘿嘿嘿,这样我们就可以用 export 了,既然 wxs 位于渲染层,那么它能做的事情就多了去了

比如操作 dom,计算位置,逐帧动画,一切的一切,在 jscore 很难做到的事情,统统可以让 wxs 来做,这解决了我们之前的一个很大的痛点

3. 微信的 template 竟然是独立作用域

<template name="aaa">
  <view>
    <text>{{ddd}}</text>
  </view>
</template>

<template is="aaa"/>

提问,这段代码微信能跑起来吗?答案是不能。。。它得透传 data

<template is="aaa" data="{{ddd}}"/>

我怀疑他们直接将 template 编译成独立的组件了

我特么,要不是微信你是老大,我都要砍人了,wxml 这套标准你设计成这样也就算了,你自己的实现都无敌鸡肋,先是不支持递归,又是不在同一作用域……

我们的实现则是在纯编译器中做 block 级别的替换,这是一种很常见的编译技巧,比如 rollup 的 tree shaking 也是这样做的

好处是支持递归,支持无限引用,不会产生独立作用域,坏处是……我还得兼容微信(哭了)

总结

总之,在写新版小程序的过程中,因为架构和之前的完全不同(主要是两个线程的工作安排的不同),困难总比办法多

可是我又有点心急,我想尽快做出来,最终还是把自己卷生病了……

害,我该如何是好了?


About Joyk


Aggregate valuable and interesting links.
Joyk means Joy of geeK