How PikaCSS Works
從整體流程來看,PikaCSS 會把可靜態分析的 style 輸入轉成產生的 atomic CSS。
Source input
你會在支援的檔案中寫 pika() 呼叫:
ts
// pika() 是全域函式,不需要另外匯入
// 用 pika() 來處理樣式的按鈕元件
const buttonClass = pika({
padding: '0.5rem 1rem',
borderRadius: '0.5rem',
backgroundColor: '#0ea5e9',
color: 'white',
cursor: 'pointer',
})
document.querySelector('#btn')!.className = buttonClassBuild-time transform
Integration 會掃描原始碼檔案,抽出 style 輸入,再把它轉成 atomic class names。
ts
// 經過 build-time 編譯後,pika() 呼叫會被替換
// 成一般字串字面值,不會留下函式呼叫。
const buttonClass = 'a b c d e'
document.querySelector('#btn')!.className = buttonClassGenerated CSS
這些 class names 會對應到產生的 CSS declarations:
css
/* 由 @pikacss/unplugin-pikacss 自動產生 */
@layer preflights, utilities;
@layer utilities {
.pk-a { padding: 0.5rem 1rem; }
.pk-b { border-radius: 0.5rem; }
.pk-c { background-color: #0ea5e9; }
.pk-d { color: white; }
.e { cursor: pointer; }
}為什麼這裡的 atomic output 很重要
PikaCSS 不會把每個 component block 都壓成單一 class。它會把 style 內容拆成可重用的 atomic declarations。當同一個 declaration 再次出現時,engine 就能直接重用原本的 atomic class。
ts
// 兩個不同 component 使用相同的 CSS property-value 組合
// Button 元件
const btnClass = pika({
color: 'white', // → class 'a'
padding: '1rem', // → class 'b'
cursor: 'pointer', // → class 'c'
})
// Link 元件:會共用 `color: white` 和 `cursor: pointer`
const linkClass = pika({
color: 'white', // → 重用 class 'a'(相同的 property-value!)
fontSize: '14px', // → class 'd'(新的)
cursor: 'pointer', // → 重用 class 'c'(相同的 property-value!)
})css
/* 只有 4 個 atomic classes,不是 6 個!
重複的 property-value 組合會在整個應用程式中被去重 */
@layer preflights, utilities;
@layer utilities {
.pk-a { color: white; }
.pk-b { padding: 1rem; }
.pk-c { cursor: pointer; }
.pk-d { font-size: 14px; }
}PikaCSS 比許多 atomic systems 更謹慎的地方
重用並不總是安全的。
當兩個 declarations 在效果上彼此重疊時,真正決定結果的是 stylesheet 的順序,不是 markup 裡 token 的順序。PikaCSS 會偵測這些衝突,讓後續重疊的 declarations 對順序保持敏感,而不是盲目重用全域 cached class。
完整說明請讀 Atomic Order And Cascade。
plugins 改變的是什麼
Plugins 可以修改 config,也能擴充 selectors、shortcuts、variables、keyframes、autocomplete 與 preflights。它們會在抽取前與抽取過程中,改變 engine 能理解的內容。
也因為這樣,PikaCSS 才能對終端使用者保持精簡,同時又支援更豐富的 ecosystem。
哪些東西不會留在 runtime
應用程式 runtime 拿到的是 class names 與 CSS files,而不是一個會在瀏覽器裡持續解讀 objects 的 styling engine。