unocss 究竟比 tailwindcss 快多少荒叶?

tailwind-v-uno.jpg

unocss 究竟比 tailwindcss 快多少惋嚎?

前言

我們知道 unocss 很快,也許是目前最快的原子化 CSS 引擎 (沒有之一)。

unocss 解釋它為什么這么快的原因续崖,是因為它不用去解析 CSS 抽象語法樹敲街,直接在 content 里面通過正則表達式從內(nèi)容中提取 token,然后生成樣式严望。

這點從 unocss 官方提供目前最新的測試結(jié)果可以看到(2023-08-11 版本):

11/8/2023, 3:53:41 PM
1656 utilities | x200 runs (75% build time)

none                             33.99 ms / delta.      0.00 ms
unocss       v0.57.2            359.46 ms / delta.    325.47 ms (x1.00)
tailwindcss  v3.3.5            1238.25 ms / delta.   1204.26 ms (x3.70)
windicss     v3.5.6            1742.45 ms / delta.   1708.46 ms (x5.25)

可以看到 unocsstailwindcss3.7 倍左右多艇。

其中官方的 unocss 測試素材,使用的是 vite + @unocss/vite著蟹,tailwindcss 測試素材則是 vite + postcss + tailwindcss墩蔓。

可是假如我們以 vite / webpack 插件的方式去使用 unocss 的話,默認是不支持 tailwindcss 那些 @apply, @screen, theme() 這些 CSS 指令的萧豆。

這時候我們就需要額外去安裝 @unocss/transformer-directives 這個包奸披,并在 uno.config.ts 文件中注冊來支持這些功能。

可是涮雷,當(dāng)我們查看這個包的依賴的時候阵面,發(fā)現(xiàn)它其實也是去使用一個 CSS AST 工具:css-tree 去解析操作抽象語法樹的。

也就是說洪鸭,unocssvite/webpack 插件的方式样刷,去實現(xiàn)的那些在 tailwindcss 內(nèi)置的 css 指令不免也要解析成 AST

那么這種時候览爵,它又能比 tailwindcss 快多少呢置鼻?

開始測試

這里我做了一個基準測試,unocss 只加載 @unocss/preset-uno@unocss/transformer-directives蜓竹,tailwindcss 為默認注冊安裝箕母。

測試素材以及代碼 forkunocss 官方 bench,和官方 bench 不同的是俱济,我為了同時為了模擬平常的開發(fā)場景嘶是,我還加入了等量的 @apply 指令,這樣它們都免不了要去解析 CSS 抽象語法樹蛛碌。屬于是給 2 者增加負重了聂喇。

測試設(shè)備都為 Mac Book M1 (2021), 跑 200 次,取 75%

源代碼鏈接

運行后蔚携,測試結(jié)果如下所示:

2024/3/5 00:19:14
1656 utilities | x200 runs (75% build time)

none                             19.92 ms / delta.      0.00 ms 
unocss       v0.58.5            328.39 ms / delta.    308.47 ms (x1.00)
tailwindcss  v3.4.1             798.42 ms / delta.    778.49 ms (x2.52)

可以看到在 1656 utilities 個工具類提取 + @apply 的場景希太,作為 vite 插件使用的 unocss 速度差不多是 tailwindcss2.52 倍左右。

相比 unocss 原先的測試結(jié)果跛十,對比 tailwindcss 的速度從 3.7 倍 降低到了 2.52 倍。

可見 CSS 抽象語法樹的解析芥映,還是顯著的降低了 unocss 的速度,不過成績依然是可喜的奈偏,非常厲害坞嘀。

postcss 方式

當(dāng)然,想要支持 tailwindcss@apply , @screen , theme() 這些 CSS 指令惊来,不止上面這一條路。

我們也可以使用 @unocss/postcss 這個 postcss 插件去達成這樣的目的裁蚁。

另外我也做了一個同樣基于 postcss 插件的基準測試,unocss 只加載 @unocss/preset-uno枉证,測試環(huán)境也和上一個一樣矮男。

源代碼鏈接

測試結(jié)果如下:

2024/3/5 00:08:25
1656 utilities | x200 runs (75% build time)

none                             16.75 ms / delta.      0.00 ms 
unocss       v0.58.5            679.51 ms / delta.    662.77 ms (x1.00)
tailwindcss  v3.4.1             712.55 ms / delta.    695.80 ms (x1.05)

不出所料,果然在都需要在解析抽象語法樹情況下室谚,它們的性能差距是非常小的。因為大家操縱 CSS AST 的方式和手段都是差不多的秒赤,這點上不會有什么差距。

而相差的那 30ms 左右陈瘦,其實關(guān)鍵點就在于潮售,雙方引擎中甘晤,正則表達式匹配的數(shù)量和質(zhì)量了饲做。但是遏弱,相差這點時間其實已經(jīng)沒有意義了,畢竟我們都知道泪姨,正則寫的越多饰抒,越復(fù)雜,執(zhí)行就越慢袋坑。

在我看來 @unocss/postcss 其實就是一個更加自由,可自定義的 tailwindcss 版本,你可以自定義里面匹配和生成 CSS 的規(guī)則吃环。

2 個庫洋幻,其實實現(xiàn)思路其實還是比較相似的,但是這個世界上好唯,并沒有必要存在 2tailwindcss

unocss vs tailwindcss

就像我一向的觀點骑篙,unocss 在幫助我們探索原子化 CSS 更多的上限权旷。

unocss 在各個方面相比來說都更加的進取,而使用 @unocss/postcss 這種方式拄氯,相比它推薦的其他使用方式來說,有一點點失去了它的一部分靈魂镣煮,你知道我指的是哪一部分(笑~)鄙麦。

tailwindcssunocss 都可以通過 plugin / preset 去添加更多的匹配規(guī)則。

所以最終決定用什么的胯府,還是取決于自己項目的需求,以及具體技術(shù)的生態(tài)吧炎咖,也就是中國的那句古話:前人栽樹寒波,后人吃瓜

結(jié)尾

這個測試其實也變相的提供了一個 unocss 的最佳實踐俄烁,即只要盡可能少的解析 CSS ASTunocss 提取 token 的速度絕對比 tailwindcss 快很多粹胯。

然而,最近我看 X 看到 tailwindcss@4.x 版本也快出了渊抽,官方放出了一張圖片:

tw4.jpg

X上鏈接

感覺性能相當(dāng) Ok议忽,屬于是用 rust 實現(xiàn)了一波彎道超車?狠狠地期待一波:

最后栈幸,期待 unocsstailwindcss 它們之間相互卷起來,未來給我們開發(fā)者帶來更多的驚喜玩焰!

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末芍锚,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子默刚,更是在濱河造成了極大的恐慌逃魄,老刑警劉巖,帶你破解...
    沈念sama閱讀 206,968評論 6 482
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件邪锌,死亡現(xiàn)場離奇詭異癌瘾,居然都是意外死亡,警方通過查閱死者的電腦和手機妨退,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,601評論 2 382
  • 文/潘曉璐 我一進店門碧注,熙熙樓的掌柜王于貴愁眉苦臉地迎上來糖赔,“玉大人,你說我怎么就攤上這事放典』穑” “怎么了壳影?”我有些...
    開封第一講書人閱讀 153,220評論 0 344
  • 文/不壞的土叔 我叫張陵,是天一觀的道長根灯。 經(jīng)常有香客問我掺栅,道長,這世上最難降的妖魔是什么氧卧? 我笑而不...
    開封第一講書人閱讀 55,416評論 1 279
  • 正文 為了忘掉前任沙绝,我火速辦了婚禮,結(jié)果婚禮上闪檬,老公的妹妹穿的比我還像新娘。我一直安慰自己强饮,他們只是感情好为黎,可當(dāng)我...
    茶點故事閱讀 64,425評論 5 374
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著铭乾,像睡著了一般。 火紅的嫁衣襯著肌膚如雪斗蒋。 梳的紋絲不亂的頭發(fā)上笛质,一...
    開封第一講書人閱讀 49,144評論 1 285
  • 那天,我揣著相機與錄音跷究,去河邊找鬼敲霍。 笑死丁存,一個胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的解寝。 我是一名探鬼主播艘儒,決...
    沈念sama閱讀 38,432評論 3 401
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼嘉抓!你這毒婦竟也來了晕窑?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 37,088評論 0 261
  • 序言:老撾萬榮一對情侶失蹤敞斋,失蹤者是張志新(化名)和其女友劉穎疾牲,沒想到半個月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體阳柔,經(jīng)...
    沈念sama閱讀 43,586評論 1 300
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 36,028評論 2 325
  • 正文 我和宋清朗相戀三年济锄,在試婚紗的時候發(fā)現(xiàn)自己被綠了霍转。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 38,137評論 1 334
  • 序言:一個原本活蹦亂跳的男人離奇死亡低滩,死狀恐怖岩喷,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情纱意,我是刑警寧澤,帶...
    沈念sama閱讀 33,783評論 4 324
  • 正文 年R本政府宣布,位于F島的核電站腾它,受9級特大地震影響瞒滴,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜虏两,卻給世界環(huán)境...
    茶點故事閱讀 39,343評論 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望旁瘫。 院中可真熱鬧,春花似錦酬凳、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,333評論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至拉队,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間秩彤,已是汗流浹背事哭。 一陣腳步聲響...
    開封第一講書人閱讀 31,559評論 1 262
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留降盹,地道東北人。 一個月前我還...
    沈念sama閱讀 45,595評論 2 355
  • 正文 我出身青樓蓄坏,卻偏偏與公主長得像,于是被迫代替她去往敵國和親结蟋。 傳聞我的和親對象是個殘疾皇子渔彰,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 42,901評論 2 345

推薦閱讀更多精彩內(nèi)容