精品欧美一区二区三区在线观看 _久久久久国色av免费观看性色_国产精品久久在线观看_亚洲第一综合网站_91精品又粗又猛又爽_小泽玛利亚一区二区免费_91亚洲精品国偷拍自产在线观看 _久久精品视频在线播放_美女精品久久久_欧美日韩国产成人在线

你了解 JSX,那你了解 StyleX 么?

開發(fā) 前端
從Meta內(nèi)部使用,到大會對外宣傳,這期間肯定已經(jīng)經(jīng)歷大量內(nèi)部項目的洗禮。而從做完宣傳到最終開源,又經(jīng)歷了快5年時間。那么,這款Meta出品、打磨這么長時間的「CSS-in-JS庫」,到底有什么特點呢?本文讓我們來聊聊。

大家好,我卡頌。

近日,Meta開源了一款「CSS-in-JS庫」 —— StyleX。看命名方式,Style - X是不是有點像JS - X,他們有關(guān)系么?當(dāng)然有。

JSX是一種「用JS描述HTML」的語法規(guī)范,廣泛應(yīng)用于前端框架中(比如React、SolidJS...),由Meta公司提出。

同樣的,按照Meta的設(shè)想,StyleX是一種「用JS描述CSS」的語法規(guī)范。

早在React Conf 2019[1],Meta工程師「Frank」就介紹了這種Meta內(nèi)部使用的「CSS-in-JS庫」。

從Meta內(nèi)部使用,到大會對外宣傳,這期間肯定已經(jīng)經(jīng)歷大量內(nèi)部項目的洗禮。而從做完宣傳到最終開源,又經(jīng)歷了快5年時間。

那么,這款Meta出品、打磨這么長時間的「CSS-in-JS庫」,到底有什么特點呢?

本文讓我們來聊聊。

為什么需要CSS解決方案

市面上有非常多「CSS解決方案」,比如:

  • BEM命名規(guī)范
  • CSS Module規(guī)范
  • 原子CSS(比如TailwindCSS)
  • CSS-in-JS(比如emotion)

為什么需要這些方案?原生CSS哪里不好?在這里,我們舉個小例子(例子來源于「React Conf 2019」)。考慮如下代碼:

CSS文件如下:

.blue {color: blue;}
.red {color: red;}

HTML文件如下:

<p class="red blue">我是什么顏色?</p>

請問p標(biāo)簽是什么顏色的?

從class來看,blue在red后面,p應(yīng)該是藍(lán)色的么?

實際上,樣式取決于他們在樣式表中定義的順序,.red的定義在.blue后面,所以p應(yīng)該是紅色的。

是不是已經(jīng)有點暈了?再增加點難度。如果.red和.blue分別在兩個文件中定義呢?

# css文件1
.blue {color: blue;}
# css文件2
.red {color: red;}

那p的樣式就取決于最終打包代碼中樣式文件的加載順序。

上面只是原生CSS中「選擇器優(yōu)先級相關(guān)的一個缺陷」(除此外還有其他缺陷,比如「作用域缺失」...)。隨著項目體積增大、項目維護(hù)時間變長、項目維護(hù)人員更迭,這些缺陷會被逐漸放大。

正是由于這些原因,才出現(xiàn)了各種「CSS解決方案」。

StyleX的基本使用

StyleX的API很少,掌握下面兩個就能上手使用:

  • stylex.create,創(chuàng)建樣式。
  • stylex.props,定義props。

比如:

import * as stylex from 'stylex';

// 創(chuàng)建樣式
const styles = stylex.create({
  red: {color: 'red'},
});

// 定義props
const redStyleProps = stylex.props(styles.red);

使用時:

<div {...redStyleProps}>文字顏色是紅色</div>

stylex是如何解決上面提到的red blue優(yōu)先級問題呢?其實很簡單,考慮如下代碼:

import * as stylex from 'stylex';

// 創(chuàng)建樣式
const styles = stylex.create({
  red: {color: 'red'},
  blue: {color: 'blue'}
});

// 使用
<p {...styles.props(styles.red, styles.blue)}></p>

樣式的優(yōu)先級只需要考慮styles.props中的定義順序(blue在red后面,所以顏色為blue),不需要考慮樣式表的存在。

有些同學(xué)會說,看起來和常見的CSS-in-JS沒啥區(qū)別啊。那stylex相比于他們的優(yōu)勢是啥呢?

相比其他CSS-in-JS的優(yōu)勢

首先要明確,stylex雖然以CSS-in-JS的形式存在,但本質(zhì)上他是一種「用JS描述CSS的規(guī)范」。文章開頭也提到,他的定位類似JSX。

既然是規(guī)范,那他就不是對CSS的簡單封裝、增強(qiáng),而是一套「自定義的樣式編寫規(guī)范」,只不過這套規(guī)范最終會被編譯為CSS。

作為對比,Less、Sass這樣的「CSS預(yù)處理器」就是對CSS語法的封裝、增強(qiáng)

那么,stylex都有哪些規(guī)范呢?

比如,stylex鼓勵將樣式與組件寫在同一個文件,類似Vue的SFC(單文件組件)。這么做除了讓組件的樣式與邏輯更方便維護(hù),也減少了stylex編譯的實現(xiàn)難度。

再比如,CSS中各種選擇器的復(fù)雜組合增強(qiáng)了選擇器的靈活性。但同時也增強(qiáng)了不確定性。舉個例子,考慮如下三個選擇器:

  • .className > *
  • .className ~ *
  • .className:hover > div:first-child

這些對.className應(yīng)用的選擇器將影響.className的某些后代。當(dāng)這樣的選擇器多了后,很可能會在開發(fā)者不知道的情況下改變某些后代元素的樣式。

遇到這種情況我們一般會怎么處理呢?正確的選擇當(dāng)然是找到上述影響后代的選擇器,再修改他。

但大家工作都這么忙,遇到這種問題,多半就是用新的選擇器覆寫樣式,必要的時候還會加!important后綴。久而久之,這代碼就沒法維護(hù)了。

為了規(guī)避這種情況,在stylex中,除了「可繼承樣式」(指「當(dāng)父元素應(yīng)用后,子孫元素默認(rèn)會繼承的樣式」,比如color)外,不支持這些「可以改變子孫后代樣式的選擇器」。

那我該如何讓子孫組件獲得父組件同樣的樣式呢?通過props透傳啊~

也就是說,stylex禁用了CSS中可能造成混淆的選擇器,用JS的靈活性彌補(bǔ)這部分功能的缺失。

有些同學(xué)可能會說:這些功能,其他「CSS-in-JS庫」也能做啊。

這就要談到「CSS-in-JS庫」最大的劣勢 —— 為了計算出最終樣式,在運(yùn)行時會造成額外的樣式計算開銷。

stylex通過編譯來減少運(yùn)行時的開銷。比如對于上面提到過的stylex的代碼:

import * as stylex from 'stylex';

// 創(chuàng)建樣式
const styles = stylex.create({
  red: {color: 'red'},
});

// 定義props
const redStyleProps = stylex.props(styles.red);

編譯后的產(chǎn)物包括如下兩部分:

JS的編譯產(chǎn)物:

import * as stylex from 'stylex';
const redStyleProps = {className: 'x1e2nbdu'};

CSS的編譯產(chǎn)物:

.x1e2nbdu {
  color: red;
}

所以,運(yùn)行時實際運(yùn)行的代碼始終為:

<div {...{className: 'x1e2nbdu'}}>...</div>

對于再復(fù)雜的樣式,stylex都會通過編譯生成「可復(fù)用的原子類名」。

即使是跨文件使用樣式,比如我們在另一個文件也定義個使用color: 'red'樣式的stylex屬性foo:

import * as stylex from '@stylexjs/stylex';

const styles = stylex.create({
  foo: {
    color: 'red',
  },
  bar: {
    backgroundColor: 'blue',
  },
});

會得到如下編譯結(jié)果,其中x1e2nbdu是一個原子類名,他是上一個文件中styles.red的編譯產(chǎn)物:

import * as stylex from '@stylexjs/stylex';

const styles = {
  foo: {
    color: 'x1e2nbdu',
    $$css: true,
  },
  bar: {
    backgroundColor: 'x1t391ir',
    $$css: true,
  },
};

隨著項目體積增大,樣式表的體積也能控制在合理的范圍內(nèi)。這種對原子類名的控制粒度是其他「CSS-in-JS庫」辦不到的。

相比于原子CSS的優(yōu)勢

stylex相比TailwindCSS這樣的原子CSS有什么優(yōu)勢呢?

這就要談到原子CSS的一個特點 —— 使用約定好的字符串實現(xiàn)樣式。比如,使用TailwindCSS定義圖片的樣式:

<img class="w-24 h-24 rounded-full mx-auto" src="/sarah-dayan.jpg" alt="" width="384" height="512">

效果如下:

由于樣式都是由不同的「原子類名字符串」組合而成,TS沒法分析,這就沒法實現(xiàn)「樣式的類型安全」。

什么叫「樣式的類型安全」?通俗的講,如果我實現(xiàn)一個組件,組件通過style props定義樣式,我只希望使用者能夠改變color與fontSize兩個樣式屬性,不能修改其他屬性。如果能實現(xiàn)這一點,就是「樣式的類型安全」。

「樣式的類型安全」有什么意義呢?舉個例子:設(shè)想開發(fā)基礎(chǔ)組件庫的團(tuán)隊使用stylex。那么當(dāng)業(yè)務(wù)團(tuán)隊使用該組件庫時,就只能自定義組件的一些樣式(由組件庫團(tuán)隊約束)。

當(dāng)基礎(chǔ)組件庫升級時,組件庫團(tuán)隊能很好對組件樣式向下兼容(因為知道只有哪些樣式允許被修改)。

在stylex中,由于stylex.create的產(chǎn)物本質(zhì)是對象,所以我們可以為每個產(chǎn)物定義類型聲明。比如在如下代碼中,我們限制了組件style props只能接受如下stylex樣式:

import type {StyleXStyles} from '@stylexjs/stylex';

type Props = {
  // ...
  style?: StyleXStyles<{
    color?: string;
    backgroundColor?: string;
    borderColor?: string;
    borderTopColor?: string;
    borderEndColor?: string;
    borderBottomColor?: string;
    borderStartColor?: string;
  }>;
};

總結(jié)

我猜想,當(dāng)更多人知道stylex后,他會收到比當(dāng)初TailwindCSS火時更多的兩級分化的評價。

畢竟,stylex的設(shè)計初衷是為了解決Meta內(nèi)部復(fù)雜應(yīng)用的樣式管理。如果:

  • 你項目沒有達(dá)到Meta這樣的體量
  • 你項目沒有多年的迭代周期
  • 你項目前前后后沒有多個工程師經(jīng)手

那大概率是不能接受stylex設(shè)計理念中的這些約束。

對于stylex,你怎么看?

參考資料

[1]React Conf 2019:https://www.youtube.com/watch?v=9JZHodNR184&t=270s。

責(zé)任編輯:姜華 來源: 魔術(shù)師卡頌
相關(guān)推薦

2016-09-26 14:45:46

微服務(wù)

2009-12-17 11:28:03

Linux系統(tǒng)開機(jī)

2011-08-08 15:14:11

PPPOE

2019-10-23 11:24:44

LinuxLinux目錄Linux系統(tǒng)

2023-09-19 07:19:46

2009-12-17 14:56:32

Linux程序設(shè)計

2022-01-05 21:54:51

網(wǎng)絡(luò)分層系統(tǒng)

2019-12-10 10:13:58

HTTPNginxRedirect

2021-11-02 11:35:17

通信進(jìn)程面試

2019-12-18 15:11:42

數(shù)組集合數(shù)據(jù)

2024-01-29 07:43:42

Java獨占鎖共享鎖

2009-12-24 16:51:54

Linux hosts

2018-06-29 08:36:50

2021-07-02 21:07:35

負(fù)載均衡模型nginx

2020-03-25 08:47:22

智能邊緣邊緣計算網(wǎng)絡(luò)

2021-01-13 07:34:31

Tomcat流程接口

2022-05-06 16:31:27

人工智能自然語言生物特征識別

2020-04-02 07:55:07

分析方法論研發(fā)

2014-04-17 16:42:03

DevOps

2021-06-06 18:22:04

PprofGopher邏輯
點贊
收藏

51CTO技術(shù)棧公眾號

www.久久久久爱免| 久久天堂电影| 日韩午夜高潮| 三级精品视频久久久久| 国内精品免费视频| 日本不卡一二三| 亚洲精品欧美激情| 美脚丝袜一区二区三区在线观看| 国产情侣av在线| 久久久噜噜噜| 欧美黑人极品猛少妇色xxxxx| 超碰97人人干| 99精品国产一区二区三区2021| 久久久pmvav| 久久久久91| 欧美精品一区二区免费| 精品无码人妻一区二区免费蜜桃| 日韩精品成人| 欧美日韩在线三区| 亚洲 欧美 日韩 国产综合 在线| 国产区在线观看| 久久久久9999亚洲精品| 国产成人精品一区二区三区福利| 最近中文字幕在线免费观看| 一区二区日本视频| 欧美黄色小视频| 午夜爽爽爽男女免费观看| 国产九一精品| 亚洲另类激情图| 一区二区免费在线观看视频| 日韩高清在线观看一区二区| 欧美精品少妇一区二区三区| 亚洲少妇久久久| 日韩毛片免费观看| 欧美日韩国产一中文字不卡| 成人免费在线视频播放| 黄色精品免费看| 国产精品久久午夜| 亚洲国产一区在线| av网站在线免费观看| 久久久精品2019中文字幕之3| 成人免费视频网站| 亚洲第一成年人网站| 国产精品66部| 亚洲xxxx在线| 精品人妻午夜一区二区三区四区| 国产做a爰片久久毛片| 国产精品久久不能| 国产日韩久久久| 青青青爽久久午夜综合久久午夜| 国产成人精品亚洲精品| 综合久久中文字幕| 久久精品国产99国产| 国产欧美日韩免费| 一级黄色免费片| 九色综合狠狠综合久久| 91久久嫩草影院一区二区| 国产精品无码久久av| 精品亚洲免费视频| 91成人免费在线观看| jizz中国少妇| 成人免费的视频| 久久av一区二区三区漫画| 日韩精品视频在线观看一区二区三区| 91美女片黄在线观看| 亚洲a∨一区二区三区| 欧美一区二区三区在线观看免费| 成人欧美一区二区三区视频网页 | 婷婷另类小说| 久久综合电影一区| 亚洲国产综合久久| 久久久久久一区二区| 国产精品毛片a∨一区二区三区|国| 中文字幕免费高清在线观看| 国产一区在线不卡| 韩国精品一区二区三区六区色诱| 免费人成在线观看网站| 国产精品精品国产色婷婷| 青青在线视频免费观看| 蜜桃av在线播放| 欧美午夜在线观看| 久久久久无码精品| 欧美18免费视频| 社区色欧美激情 | 免费一级肉体全黄毛片| 久久高清国产| 亚洲综合中文字幕在线观看| 神马电影在线观看| 中文字幕在线不卡一区| 九九热只有这里有精品| 成人日韩在线观看| 精品三级av在线| 亚洲天堂岛国片| 欧美理论在线| 国产精品免费小视频| www.午夜激情| 国产日韩欧美麻豆| 91动漫在线看| 欧美综合影院| 精品中文视频在线| 永久久久久久久| 日韩va亚洲va欧美va久久| 成人欧美一区二区| 日本蜜桃在线观看| 精品久久久久久国产| 五月天婷婷在线观看视频| 久久99青青| 欧美黑人性猛交| 国产精品老熟女视频一区二区| 波多野结衣在线一区| 中文精品一区二区三区 | 欧美日韩一区免费| 乱码一区二区三区| 日本不卡免费一区| 欧洲午夜精品久久久| 好吊色一区二区| 中文字幕一区二区三区在线观看| 日韩网址在线观看| 精品淫伦v久久水蜜桃| 蜜臀久久99精品久久久无需会员| 亚洲男人天堂网址| 久久网站最新地址| 国产妇女馒头高清泬20p多| 欧美特黄色片| 一区二区欧美激情| 永久免费无码av网站在线观看| 国产成人免费视| 国产精品夜夜夜爽张柏芝| av高清一区| 亚洲欧洲第一视频| 日本三级小视频| 成人av资源在线| 久久精品无码中文字幕| 天堂av一区| 欧美精品免费在线观看| 国产理论片在线观看| 中文字幕一区二区三区蜜月| 在线观看免费黄网站| 成人综合专区| 国产精品稀缺呦系列在线| chinese偷拍一区二区三区| 在线免费一区三区| 日本激情小视频| 久久婷婷av| 欧洲一区二区在线| 99亚洲伊人久久精品影院| 国产亚洲欧美日韩一区二区| 羞羞色院91蜜桃| 国产精品每日更新在线播放网址| 中国黄色片免费看| 久久久久久久久久久妇女| 91久久精品在线| 日韩免费影院| 日韩av网站大全| 中文字幕高清在线免费播放| 国产欧美一区二区三区在线老狼| 亚洲少妇第一页| 日韩电影二区| 亚洲bt欧美bt日本bt| 欧美寡妇性猛交xxx免费| 亚洲国产成人久久综合一区| 国产美女激情视频| 国产欧美一区二区三区在线看蜜臀| 国产3p在线播放| 欧美激情日韩| 久久一区二区三区av| 123成人网| 久久在线精品视频| 色屁屁草草影院ccyycom| 狠狠躁18三区二区一区| 999久久久国产| 国产91丝袜在线观看| 久久久久久久中文| 色中色综合网| av一区观看| 精品无人乱码一区二区三区 | 色在线观看视频| 成人精品国产一区二区4080| 无码无遮挡又大又爽又黄的视频| 四虎成人av| 国产伦精品一区二区三毛| 国产一区二区主播在线| 色综合五月天导航| 青青青手机在线视频观看| 7777精品伊人久久久大香线蕉超级流畅 | 我想看黄色大片| 中文字幕一区二区人妻| 精品三级av在线导航| 97avcom| 国产中文字幕在线看| 欧美日韩午夜在线视频| 伊人365影院| 中文乱码免费一区二区| 国产欧美日韩高清| 牛牛精品一区二区| 久久精品中文字幕一区| 日本a一级在线免费播放| 69久久夜色精品国产69蝌蚪网| 在线看成人av| 亚洲男人天堂一区| 高清国产在线观看| www.亚洲精品| 亚洲一二三av| 日韩av电影免费观看高清完整版| 日本黄色片一级片| 99精品视频在线观看播放| 麻豆亚洲一区| 波多野结衣欧美| 成人黄色免费网站在线观看| 美女100%一区| 海角国产乱辈乱精品视频| 日本在线观看| 国产一区二区激情| 深夜视频在线免费| 亚洲白虎美女被爆操| 国产熟女一区二区三区四区| 欧美一a一片一级一片| 国产一级做a爱片久久毛片a| 一区二区在线观看不卡| 中文字幕无码日韩专区免费| 国产欧美一区视频| 国精产品一区二区三区| 99精品一区二区三区| 无码人妻精品一区二区三| 精品一区二区av| 色婷婷综合网站| 日韩电影免费在线| 十八禁视频网站在线观看| 一区二区动漫| 男人揉女人奶房视频60分| 亚洲伦理精品| 九色自拍视频在线观看| 亚洲精选一区| 婷婷五月综合缴情在线视频| 激情亚洲成人| 97超碰人人澡| 亚洲国产裸拍裸体视频在线观看乱了中文 | 久久亚洲国产| 亚洲欧洲一区二区福利| 成人综合专区| 中文字幕剧情在线观看一区| 999久久久91| 熟女视频一区二区三区| 亚洲激情中文| 男女啪啪免费观看| 欧美国产专区| 欧美一级免费播放| 亚洲国产免费看| 男人日女人下面视频| 午夜在线一区二区| 日韩 欧美 高清| 日本va欧美va瓶| 亚洲欧美日本一区二区三区| 国产美女精品一区二区三区| 精产国品一区二区三区| 成人美女在线视频| 欧美深性狂猛ⅹxxx深喉| 久久久久久黄色| 林心如三级全黄裸体| 亚洲视频在线观看一区| 五月婷婷一区二区| 亚洲成av人片一区二区| 亚洲熟女综合色一区二区三区| 色激情天天射综合网| 国产又黄又粗又长| 精品国精品国产尤物美女| 台湾av在线二三区观看| 中日韩美女免费视频网址在线观看 | 在线免费看91| 日韩久久久久久| 天堂视频中文在线| 视频在线观看99| 久久五月精品中文字幕| 欧美在线视频免费| 久久久久毛片| 国产精品视频免费一区| 国产真实有声精品录音| 999久久欧美人妻一区二区| 性娇小13――14欧美| 黄色小视频免费网站| 成人av高清在线| 网站永久看片免费| 亚洲国产视频直播| 久久国产香蕉视频| 精品国产一区二区三区久久久蜜月 | 国产三级视频在线播放| 日韩麻豆第一页| 成人影欧美片| 国产999视频| 午夜日韩影院| 亚洲精品无人区| 99国产精品久久久久久久成人热 | 成人黄色网址在线观看| 亚洲国产日韩一区无码精品久久久| 亚洲精品国久久99热| 欧美日韩在线视频播放| 精品sm捆绑视频| 日本亚洲精品| 日本精品视频网站| 91在线一区| 亚洲无玛一区| 翔田千里一区二区| av漫画在线观看| 中文字幕制服丝袜成人av| 无码免费一区二区三区| 精品美女在线观看| 国产原创精品视频| 国产精品午夜一区二区欲梦| 久久av免费看| 91免费黄视频| 国产丶欧美丶日本不卡视频| 国产又粗又猛又爽又黄的视频四季 | 色偷偷av一区二区三区乱| 男女视频在线| 国产日韩欧美成人| 精品国产乱码久久久久久果冻传媒 | 国产日韩亚洲精品| 午夜电影亚洲| 奇米777在线| 欧美国产1区2区| 神马久久久久久久 | 不卡视频一区二区| 国产高清一区| 青青草原国产在线视频| 国产视频911| 久久久久久在线观看| 日韩精品一二三四区| sm性调教片在线观看| 国产综合色一区二区三区| 韩日成人av| 国产精品一级无码| 亚洲制服丝袜一区| 亚洲va天堂va欧美ⅴa在线| 免费99精品国产自在在线| 白嫩亚洲一区二区三区| 久久精品国产精品亚洲精品色| 麻豆视频一区二区| 任你操精品视频| 91麻豆精品国产91久久久更新时间 | 91theporn国产在线观看| 色先锋资源久久综合5566| 欧美在线se| 永久免费看av| 成人一区二区三区中文字幕| 国产亚洲精品码| 亚洲国产高清自拍| 蜜桃视频在线观看播放| 蜜桃臀一区二区三区| 首页国产欧美日韩丝袜| 美国美女黄色片| 制服丝袜一区二区三区| 18av在线播放| 国产精品视频福利| 一道本一区二区| 午夜影院黄色片| 69久久99精品久久久久婷婷| 日韩伦理电影网站| 久久久国产精品一区二区三区| 老司机精品福利视频| 国产三级aaa| 欧美videofree性高清杂交| 白浆在线视频| 三区精品视频观看| 国模一区二区三区白浆| 日韩成人一区二区三区| 一本色道久久88综合日韩精品| 日本精品久久| 福利视频免费在线观看| 26uuu国产日韩综合| 一级爱爱免费视频| 久久久久久久久91| 神马电影久久| 国产在线观看中文字幕| 亚洲第一主播视频| 成人综合影院| 成人av影视在线| 日韩精品五月天| 精品欧美一区二区久久久久| 日韩电影网在线| 亚洲图片小说区| 成人一对一视频| 中文字幕永久在线不卡| 无码国产精品一区二区免费16| 国产精品丝袜白浆摸在线| 激情丁香综合| 亚洲一级理论片| 亚洲国内精品在线| 亚洲综合视频| 激情六月丁香婷婷| 亚洲激情第一区| av在线电影院| 精品高清视频| 韩国一区二区三区| 在线天堂中文字幕| 欧美尺度大的性做爰视频| 久久99国内| 日本50路肥熟bbw| 欧美精品三级在线观看| 欧美片第1页| 国产真实老熟女无套内射|