作者: Zeeko

  • 如何重新导出 antd

    因为种种原因,你可能想要将 antd 组件从另一个模块中重新导出,但是这么做并没有像看上去那么简单。

    导出类型

    重新导出 antd 的类型可能是整个需求中最简单的部分,因为我们只需要简单的使用 export type { xxx } from 'antd' 就行了。

    首先我们需要使用 require.resolve 获取 antd 的安装路径,然后用正则表达式解析一下 antd/index.d.ts 的内容,其中以 export type 开头的就是 antd 导出的类型。获取到这些类型名称后,就可以生成代码,在我们自己的模块中重新导出。

    导出组件

    与类型信息不同,想要重新导出组件还需要考虑支持「按需引用」功能。虽然目前的 antd 文档中写着 JS 组件默认支持基于 ESM 按需引用功能,但是组件对应的样式依赖 babel-plugin-import 实现按需引用。

    然而, babel-plugin-import 并不支持 export { xxx } from 'antd' 的语法,它甚至会报错

    考虑到 babel-plugin-import 目前并没有人在积极地维护,而且我个人也比较讨厌这种依赖 babel 魔改代码的手段,我决定迂回地解决这个问题——先导入,再导出。

    使用简单的 import 语句让 babel-plugin-import 正常地工作,然后再将导入的变量重新 export 出去。不过这里涉及到一个问题,如果我在同一个文件中将 antd 所有的组件全部导入的话,由于 babel-plugin-import 的原因,所有组件的样式将在加载这个文件的时候被加载。这样就破坏了按需加载的特性。

    为了避免上述问题,我们得把 babel-plugin-import 的副作用隔离到独立的模块中,以 Button 组件为例:

    import { Button as _Button } from 'antd';
    
    export const Button: typeof _Button = _Button;
    export * from './lib/button';

    如此一来, index.ts 就完全变成用来按需引用子模块的入口,在加载 index.ts 的时候就不会加载所有组件的样式了。

    除此之外,你可能还发现了我在导出组件的时候特意标注了变量的类型,这是因为 TypeScript 要求我们给导出的变量类型起一个稳定的名字,否则编译会报错。

  • Hello World

    我叒换博客平台了。

    我的博客之路是从博客园开始的,最早的一篇文章发表于 2015 年 7 月,那时刚刚高考结束,离大学开学还有不到两个月。现在的我只能从文章的标题来推测当时写博客的动机——应该是为了学习记录。就这么断断续续的记录了大概四年,持续到大学毕业,找到了人生中的第一份工作——博客园后端开发。

    虽然入职了一个开发博客平台的公司,但是写博客慢慢变少了,更多的是用来测试博客后台功能正确性的文章。也差不多是刚入职的这个时间,我写出了我的个人博客软件。这个项目是博客园的笔试题,但是笔试结束后我并没有把它丢到一旁,在上班的空余时间,慢慢地给它提交代码,一点点的丰富功能。直到我换两份工作,我的个人博客都是记录在自己的这个网站上的。

    在这个网站上,我实现了一些有意思的功能,比如「服务端高亮代码」、「服务端渲染数学公式」。不过这些小成就并没能继续推动我写博客,在这期间的博客很多都是在繁忙工作的喘息中写下来的。除了需要写博客之外,还得继续维护博客平台本身——服务商跑路了,想办法恢复数据,迁移博客;dotnet 更新了,得升级项目;不支持 RSS,得自己实现 RSS 功能,诸如此类。这些事务也像写博客一样,抢占着我的休息时间。让我的博客更新看起来就像便秘一样。

    同样也是这段时间,我也变得越来越沉默,不想在社交网络上发言,不再往感兴趣的论坛灌水,不再打开群组闲聊。闭而不言让我感到舒适,我不用思考该如何讲话,我只需要接收我喜欢的信息就好。但是最近我也发现了长久沉默带来的副作用——一旦看文字信息,就只想快速的扫视,马上了解大致内容,就像是大脑被训练出来了快速阅读的「肌肉记忆」。我想大概是我的大脑已经习惯了长时间开启的「只读」模式,针对这种情况进行了 JIT 优化吧。

    现在回想起来这种情况已经出现了很久,大概得有四五年了,但真正意识到这个问题却是在去年全职远程之后。全职远程在家,每天能够说话的人就更少了,连着十几个小时不说一句话可能并不夸张。不过一到线上会议,我总是能够感觉到自己已经不太会说话了,这让我感到了一丝不妙。会不会真的有某一天我完全丧失了口头交流的能力呢?

    不知道哪天,一个观点进入了我的脑子:无法向外输出内容,是因为没有经过自己的思考将输入的信息融会贯通。大部分常用的信息表达方式都是线性的,例如聊天工具中的一段对话、网站评论区的一段留言、博客里面的一篇文章,不管篇幅如何,其中蕴含的观点与知识都是文字这样线性的方式传递的。而知识在思维之中却是以复杂精巧的网状结构存在的,想要通过文字传递原创的、有价值的信息,就得先将输入的信息反序列化成自己知识脉络的一部分,然后再通过合适的技巧将自己的知识序列化成线性的结构通过文字表达出来。

    从这个角度来看的话,我遇到的问题其实是「看的太多,想的太少」。就像是 Epic 免费送的游戏一样,虽然可以很容易的加入到自己游戏库中,但是从来不会去玩,更不要说体验游戏的乐趣了「所谓的电子阳痿」。写作则是我准备进行的第一个康复训练,让大脑在编辑文字的过程中不断地整理之前输入的信息,不断地推敲文章的论述,不断地构思行文的思路,重新找回脚踏知识大地的坚实感觉。

    如同是游戏开启了新存档准备用全新的职业来攻略一般,我的新博客平台切换到了托管的 WordPress 这样我就不用总是给自己的博客做运维了。虽然并非新年伊始,但这于我个人的数字生活而言算得上是个新的开始,这一次就以每周三篇为目标吧,Hello World!