一区二区三区在线-一区二区三区亚洲视频-一区二区三区亚洲-一区二区三区午夜-一区二区三区四区在线视频-一区二区三区四区在线免费观看

服務(wù)器之家:專注于服務(wù)器技術(shù)及軟件下載分享
分類導(dǎo)航

PHP教程|ASP.NET教程|Java教程|ASP教程|編程技術(shù)|正則表達(dá)式|C/C++|IOS|C#|Swift|Android|VB|R語(yǔ)言|JavaScript|易語(yǔ)言|vb.net|

服務(wù)器之家 - 編程語(yǔ)言 - 編程技術(shù) - CSS in JS 新秀:Vanilla-Extract 淺析

CSS in JS 新秀:Vanilla-Extract 淺析

2022-01-12 00:48Tecvan江江 編程技術(shù)

2021年,vanilla-extract 作為黑馬登頂了 css-in-js 滿意度榜首(雖然使用率僅為1%),號(hào)稱是一個(gè)類型安全、高度兼容 TS 場(chǎng)景的庫(kù),國(guó)內(nèi)相關(guān)討論還很少,稍微看了一下還挺好用的。

CSS in JS 新秀:Vanilla-Extract 淺析

前言

2021年,vanilla-extract 作為黑馬登頂了 css-in-js 滿意度榜首(雖然使用率僅為1%),號(hào)稱是一個(gè)類型安全、高度兼容 TS 場(chǎng)景的庫(kù),國(guó)內(nèi)相關(guān)討論還很少,稍微看了一下還挺好用的。

CSS in JS 新秀:Vanilla-Extract 淺析

介紹

官方文檔:https://vanilla-extract.style/documentation/

打開(kāi)vanilla-extract官網(wǎng)文檔,里面已經(jīng)羅列了他的那些優(yōu)點(diǎn)。作為一個(gè)如果使用 css-in-js 會(huì)首選styled-components的我來(lái)說(shuō),比較關(guān)注的點(diǎn)主要是:

  • All styles generated at build time
  • Type-safe styles via CSSType.

這兩點(diǎn)說(shuō)白了就是,零運(yùn)行時(shí)且支持typescript。

零運(yùn)行時(shí):vanilla-extract會(huì)在編譯時(shí)期,編譯出 css modules值和css內(nèi)容,不需要帶任何運(yùn)行時(shí)內(nèi)容到生產(chǎn)環(huán)境,相對(duì)來(lái)說(shuō)運(yùn)行速度更高,產(chǎn)物體積更小;

typescript:支持typescript類型檢查,CSS安全;

目前,業(yè)界大多數(shù)相關(guān)競(jìng)品如 styled-components就是一個(gè)運(yùn)行時(shí)方案且基于標(biāo)簽?zāi)0暹M(jìn)行書寫,主要基于stylis解析器解析,如果頻繁更新props還會(huì)造成style標(biāo)簽大量插入到head里。

安裝

Webpack 環(huán)境下,需要同時(shí)安裝 @vanilla-extract/css 與 @vanilla-extract/webpack-plugin 插件:

  1. yarn add @vanilla-extract/css @vanilla-extract/webpack-plugin 

安裝完成后,修改 Webpack 配置:

  1. const { VanillaExtractPlugin } = require('@vanilla-extract/webpack-plugin'
  2.  
  3. module.exports = { 
  4.   entry: './src/index.js'
  5.   // .... 
  6.   plugins: [new VanillaExtractPlugin()] 
  7. }; 

這里可以看見(jiàn),當(dāng)我們使用 vanilla-extract 時(shí),需要安裝兩個(gè)庫(kù):

  • @vanilla-extract/css:開(kāi)發(fā)核心庫(kù),基于該庫(kù)進(jìn)行項(xiàng)目業(yè)務(wù)樣式開(kāi)發(fā);
  • @vanilla-extract/webpack-plugin:webpack插件。前面也提及了vanilla-extract是一個(gè)零運(yùn)行的庫(kù),主要是通過(guò)該插件處理。
    • 通過(guò)增加webpack配置項(xiàng),對(duì)相關(guān)后綴文件使用自定義的@vanilla-extract/webpack-plugi/loader進(jìn)行處理。
    • 在其內(nèi)部通過(guò)eval庫(kù)在編譯時(shí)先執(zhí)行得到className結(jié)果,避免在運(yùn)行時(shí)執(zhí)行過(guò)程;
    • 再移除@vanilla-extract/css庫(kù),使其不會(huì)影響到生產(chǎn)環(huán)境下js包體大小;

構(gòu)建樣式API

這里只會(huì)對(duì)vanilla-extract比較核心的構(gòu)建樣式相關(guān)幾個(gè)API提及,其他API可以直接前往官網(wǎng)查看。

style

  1. import { style } from '@vanilla-extract/css'
  2.  
  3. export const parentClass = style({ 
  4.   background: 'red'
  5.   ':hover': { 
  6.     background: 'blue'
  7.   }, 
  8. }); 
  9.  
  10. export const childClass = style({ 
  11.   selectors: { 
  12.     '&:nth-child(2n)': { 
  13.       background: '#fafafa'
  14.     }, 
  15.     [`${parentClass} &`]: { 
  16.       color: 'pink'
  17.     }, 
  18.   }, 
  19. }); 
  20. import { childClass, parentClass } from './index.styles.css'
  21.  
  22. const Demo = () => ( 
  23.   <div className={parentClass}> 
  24.     <div className={childClass}>DEMO1</div> 
  25.     <div className={childClass}>DEMO2</div> 
  26.     <div className={childClass}>DEMO3</div> 
  27.   </div> 
  28. ); 
  29.  
  30. export default Demo; 

這個(gè)簡(jiǎn)單的demo我相信,看幾下就已經(jīng)明白是怎么使用了。但是需要理解的地方是,為了提高可維護(hù)性,「每個(gè)樣式塊只能針對(duì)某個(gè)元素(或者說(shuō)是使用這個(gè)樣式塊的元素)」。那么在上述代碼里的selectors而言,「其目標(biāo)必須是」**&**(也就是自身元素)而不能是其他元素。例如:`${parentClass} &`是OK的,但是`& div`是不允許的。這樣的設(shè)計(jì),我覺(jué)得更是一種職責(zé)分離吧,每個(gè)樣式塊都針對(duì)某個(gè)元素,那么對(duì)于項(xiàng)目而言,樣式的可維護(hù)性就大大提高了,相比于其他css in js(styled-components)就不容易出現(xiàn)樣式冗余的問(wèn)題。對(duì)于一些特殊情況,比如:在寫styled-components我們會(huì)利用其包裹arco組件(或是其他組件),然后對(duì)其內(nèi)部元素樣式進(jìn)行覆寫或是新增。

  1. const StyledSelect = styled(Select)` 
  2.     div { 
  3.         color: red; 
  4.     } 

那么在vanilla-extract樣式塊里是不能直接做到的,因?yàn)槊總€(gè)樣式塊都是針對(duì)某個(gè)元素,是不能直接通過(guò)該樣式塊,直接對(duì)其兄弟元素、子元素進(jìn)行樣式調(diào)整。但是,對(duì)于這種情況,是可以使用另一個(gè)APIglobalStyle進(jìn)行開(kāi)發(fā)。

globalStyle

顧名思義,就是全局樣式API。但是因?yàn)楸旧韛anilla-extract走css module,每個(gè)className都是獨(dú)一無(wú)二,那么通過(guò)globalStyle來(lái)對(duì)其子元素進(jìn)行樣式調(diào)整覆蓋完全是可行的。

  1. import { style, globalStyle } from '@vanilla-extract/css'
  2.  
  3. export const parentClass = style({}); 
  4.  
  5. globalStyle(`${parentClass} > div`, { 
  6.   color: 'red' 
  7. }); 
  8.  
  9. const Demo = () => ( 
  10.     <div className={parentClass}> 
  11.         <Select/> 
  12.     </div> 
 

相比于 Styled-components 的優(yōu)點(diǎn)

  • 零運(yùn)行時(shí);
  • 樣式開(kāi)發(fā)走Typescript安全類型;
  • style設(shè)計(jì)職責(zé)分離;(當(dāng)然,styled-components也是可以的,只是完全取決于看開(kāi)發(fā)者)
  • ...

總結(jié)

目前了解下來(lái),vanilla-extract是一個(gè)總體還不錯(cuò)的css in js庫(kù),雖然目前使用率比較低,但是后續(xù)廠商平臺(tái)項(xiàng)目會(huì)考慮在一些地方使用看看效果(畢竟不會(huì)增大js體積)。

原文鏈接:https://mp.weixin.qq.com/s/ysjP4JoCDOIXLSXIf3WRpg

延伸 · 閱讀

精彩推薦
主站蜘蛛池模板: 亚洲欧美日韩特级毛片 | 成人在线视频在线观看 | xxxxxx日本处大片免费看 | 欧美5g影院 | 午夜私人影院在线观看 | 性欧美金发洋妞xxxxbbbb | 免费观看www视频 | 爱福利视频一区二区 | www.国产一区二区三区 | 青青草原国产一区二区 | 麻豆网站视频国产在线观看 | 好男人资源免费播放在线观看 | 俄罗斯性高清完整版 | 亚洲第一区在线观看 | 好男人免费高清在线观看2019 | 操闺蜜| ckinese中国男同gay男男 | 91大神在线精品视频一区 | japanese厕所撒尿 | 午夜福利理论片高清在线 | 私人影院在线免费观看 | 国内精品露脸在线视频播放 | 欧美男男xxx激情做受 | 国产在线观看91精品一区 | 拔插拔插.com | 国产精品免费久久久久影院小说 | 国产成人精品福利色多多 | 人人爽人人香蕉 | 亚洲第一福利网 | 国产精品亚洲片在线观看麻豆 | 风间由美一区二区av101 | 隔壁老王国产精品福利 | 国产在线观看99 | np高h疯狂黄暴宫口 narutomanga玖辛奈之乳 | 日本在线www | 日本a在线天堂 | 亚洲精品国产精品麻豆99 | 无码11久岁箩筣 | 黑帮大佬与我的365天2标清中文 | 校花在公车上被内射好舒 | 视频一区二区三区在线 |