我可能是全中国最了解 tailwindcss 的开发者

我可能是全中国最了解 tailwindcss 的开发者

前言

首先,我要对起这样的标题感到抱歉,本来想起一个 "我的2年开源之旅" 这样的标题,但是我知道,这种标题太普通,肯定就没啥人感兴趣看,就像我写的大部分文章一样。

于是索性做了一回标题党(坏笑~)。不过这个标题也不是空穴来风,我也确实比较了解 tailwindcss,围绕着它的生态,我陆陆续续开发了:

预设

tailwindcss-miniprogram-preset (小程序预设,已废弃)

tailwindcss-rem2px-preset (rem转px/rpx预设)

小工具

inline-tailwindcss (内联tailwindcss)

tailwind-css-variables-theme-generator (css 变量生成器)

转化器

weapp-tailwindcss (小程序使用 tailwindcss 全方面解决方案 官网链接 )

tailwindcss-mangle (tailwindcss 混淆器)

UI 组件库

icestack (CSS UI 库生成器,可以生成类似 daisyui 这样的库 官网链接)

开源起始

开发了这么多库,自诩已经对 tailwindcss 运作原理以及源码滚瓜烂熟了,不过我的开源最初并不是从 tailwindcss 开始的。

早前工作的时候,我经常使用 serverless 相关的技术来部署 nodejs 项目,尤其常用 serverless framework 来进行部署。

当时也主要是兴趣使然,也挺想要加入某一个开源生态的,于是就选中了它,并围绕着它开发了很多的垃圾 npm 包(笑~)。

后来你也知道的 serverless 在国内一直是不温不火的。而我从之前那家公司离职之后也找不到下一家有这个场景的了,遂作罢。

后面也陆续发布了一些 vue 相关的包和UI组件,不过这种前端圈太卷了,vue团队里就有几个卷王(你知道我重点想说的是谁),每每看他们代码总是觉得望尘莫及,同时也很羡慕他们。

后来在大抵 2021 年的时候,我接触到了 tailwindcss, 那时候 windicss 还没死,托尼小哥的 unocss 还没发布出来。

当时就觉得这东西很好啊,原子化的样式生成器,所写即所得,可读性好,还能 shake 掉用不到的样式,同时也可以通过插件和预设提炼项目公共的样式部分。

于是在很多自己的项目里开始尝试使用它,但是我自己的项目很多都是小程序,于是就衍生出了一个想法,想做一个 tailwindcss 小程序兼容版本,于是我的 tailwindcss 开源之旅正式启程了!

上下求索

为了达到tailwindcss在小程序里使用的目标,一开始我尝试使用 tailwindcss preset 的方式去解决问题,于是就开发了 tailwindcss-miniprogram-preset

然而,它并没有给我带来很好的开发体验。核心原因在于 preset 的功能太弱了,它无法去转化用户写的代码,只能让用户手动去转义,部分写法与原始的 tailwindcss 不同,这造成了比较大的心智负担,更不用说它还阉割了许多 tailwindcss 本身的功能。

在阅读许多的文档之后,于是我打算写一个 webpack plugin 在编译时,来同时转义用户的所有代码,这就是 weapp-tailwindcss-webpack-plugin 的雏形了。

开发之始

可是,当时的我就只会写一些 vue/react/nodejs 的业务代码,webpack plugin,vite plugin,babel plugin,postcss plugin 个个都不会写。而且我还非要打肿脸充胖子,要用 typescript 来写,还要用 rollup 去打包。

所以果不其然,受限于自身的水平,写的非常痛苦。那时候经常下班回到家就开始在 Github 上直接去搜索类似的代码,看看是怎么写的。然后就是不断的调试,理解。抽空我还去学习了一下 jest 并设计了一些单元测试用例用来回归测试。

终于经过不断的调试和测试,我在 2022/2/3 号终于发布了 weapp-tailwindcss-webpack-plugin 的第一个版本!当然那时候还只支持 uni-app cli vue2 项目,因为我自己的项目就是这个搭建的。

更多的平台

后来我兴致勃勃的去知乎等等平台去发文章,介绍我这个项目。吸引来了一些用户来使用,随即,多框架的问题接踵而至。

那时候小程序开发框架 uni-app,taro,rax,kbone,mpx,remax 等等各立山头,都有一定的用户基数,它们各自之间的编译方式,产物都不同,如何去兼容它们呢?

为此我创建了大量各个框架的示例进行测试,测试过程中也做了很大的努力去兼容所有的框架。比如 uni-apptaro 的产物就有很大的不同,要去找到一个通用的方式,在 webpack 恰当的时机去进行转化。各个框架之间也还有 webpack4/5postcss7/8 版本的不同,为此也要去兼容等等。

解决了这些问题之后,我为此还创建了 e2e 测试,来保证每个框架的示例都是可运行,且产物在预期内的。

就这样缝缝补补的过了1年左右,后来也比较懒,用户没提 issue 就懒得去更新了。

继续突破

不过当时 1.x 版本有个大问题没有解决,那就是 postcss 插件应该如何和 webpack plugin 进行通信的问题。因为当时,插件只能转化产物中 wxmlwxss 和部分 js 动态的部分,少部分类似于:

const className = 'bg-[#123456]'

<>
  <div className={className}>无法被检测</div>
  <div className="bg-[#654321]">可以被检测</div>
<>

这种在 jsx 代码外的声明的是无法被插件检测到的,除非插件能从 postcss 里直接拿到上下文。于是我研究了一下 tailwindcss 的源码,用了不太优雅的方式解决了这个问题。

随即 2.x 版本发布,而用 tailwindcss 开发小程序的人也渐渐变多了,后面逐渐出现了 vite,glup 插件和暴露原始的 Nodejs API 做二次封装的需求。

把这些功能实现之后,我感觉项目名称 weapp-tailwindcss-webpack-plugin 已经有点不妥了,索性改名叫 weapp-tailwindcss,同时也发布了对应的 npm

顺便看了一些文章和其他开源项目,把 GithubCI/CD 给加上了,同时还顺手搭建了个粗糙的 官网 。现在做的也不过是根据需求把用户想要的功能填入 weapp-tailwindcss 肚子里。

兴趣还是生计?

当然一开始开发肯定是出自于兴趣,作为生计是我想要达到的目标,不过我知道,现在自己还远远达不到。开发这些东西可能能帮到一些人,也有一些用户会给我些赞助,这些总共加起来应该还不到我一天的工资。

当然我也借助它认识了国内许许多多的开源朋友,大家都是为爱发电,所以心理上早有准备。而我也很高兴我可以和开发朋友们吹牛说: 看!这是我开发的,厉害吧!

当然我也是一个俗人,也需要激励。你的 star 和赞助对我来说都是莫大的鼓励,假如你有 Github 账号,给我点个免费的 star 可好?

收获和结语

实际上现在回过头想想,自己不过只是做了一件很小的事情,我的那些开源项目又不是那种有开创性的全新项目,而是寄宿于某一个生态,跟着生态潮涨潮落,早晚有一天会被遗弃。

不过这段旅程中,我各个方面还是收获了很多,起码我再去面试的时候,人家问我懂不懂 ast,写不写 plugin,我能罗列展示一堆东西。

在今年8月份的时候,由于公司欠薪长达3月,我和一些同事离职了,想想也是挺遗憾的,当然不是为公司感到遗憾,而是我在那里遇到了非常好的 Boss,顶住上面的压力为我们着想,不像我以前遇到的大部分都是疯狂压榨的类型。可惜由于资金流问题,团队散了。而现在也已经12月了,在我休息了将近4个月之后,我也要继续去找工作来养活自己了。

以上就是一条开源小杂鱼近2年一些感悟,如果你能把这篇流水账一样的文章看到这,我也对你表示感谢。

最后,希望中国开源事业越来越好!

附录

我的Github

weapp-tailwindcss

icestack

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 220,192评论 6 511
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 93,858评论 3 396
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 166,517评论 0 357
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 59,148评论 1 295
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 68,162评论 6 397
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 51,905评论 1 308
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 40,537评论 3 420
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 39,439评论 0 276
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 45,956评论 1 319
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 38,083评论 3 340
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 40,218评论 1 352
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 35,899评论 5 347
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 41,565评论 3 331
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 32,093评论 0 23
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 33,201评论 1 272
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 48,539评论 3 375
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 45,215评论 2 358

推荐阅读更多精彩内容