国产av日韩一区二区三区精品,成人性爱视频在线观看,国产,欧美,日韩,一区,www.成色av久久成人,2222eeee成人天堂

目錄
為什麼需要另一個(gè)CIJ庫(kù)?
最小的運(yùn)行時(shí)
原子輸出
如何使用它
定義樣式
解析樣式
組合樣式
總結(jié)
致謝
鏈接
首頁(yè) web前端 css教學(xué) 樣式9:構(gòu)建時(shí)間CSS-In-JS

樣式9:構(gòu)建時(shí)間CSS-In-JS

Apr 03, 2025 am 09:28 AM

style9: build-time CSS-in-JS

Facebook去年四月發(fā)布了其重大改版。這是一個(gè)雄心勃勃的項(xiàng)目,是對(duì)一個(gè)擁有海量用戶的龐大網(wǎng)站的重建。為了實(shí)現(xiàn)這一目標(biāo),他們使用了自己創(chuàng)建並開源的幾項(xiàng)技術(shù),例如React、GraphQL、Relay和一個(gè)名為stylex的新CSS-in-JS庫(kù)。

這個(gè)新庫(kù)是Facebook內(nèi)部使用的,但他們分享了足夠的信息,使得開源實(shí)現(xiàn)style9成為可能。

為什麼需要另一個(gè)CIJ庫(kù)?

現(xiàn)已存在大量的CSS-in-JS (CIJ)庫(kù),因此可能不清楚為什麼還需要另一個(gè)庫(kù)。正如Christopher Chedeau所闡述的那樣,style9具有與所有其他CIJ解決方案相同的好處,包括作用域選擇器、死代碼消除、確定性解析以及在CSS和JavaScript之間共享值的能力。

然而,有一些方面使style9獨(dú)樹一幟。

最小的運(yùn)行時(shí)

儘管樣式是在JavaScript中定義的,但它們由編譯器提取到常規(guī)的CSS文件中。這意味著最終的JavaScript文件中不會(huì)包含任何樣式。唯一剩下的就是最終的類名,最小的運(yùn)行時(shí)將有條件地應(yīng)用這些類名,就像您通常所做的那樣。這將導(dǎo)致代碼包更小、內(nèi)存使用減少以及渲染速度更快。

由於值是在編譯時(shí)提取的,因此無(wú)法使用真正動(dòng)態(tài)的值。幸運(yùn)的是,這些值並不常見,而且由於它們是唯一的,因此不會(huì)因?yàn)閮?nèi)聯(lián)定義而受到影響。更常見的是有條件地應(yīng)用樣式,當(dāng)然這是支持的。多虧了babel的path.evaluate,局部常量和數(shù)學(xué)表達(dá)式也是支持的。

原子輸出

由於style9的工作方式,每個(gè)屬性聲明都可以成為具有單個(gè)屬性的獨(dú)立類。例如,如果我們?cè)诖a中多個(gè)地方使用opacity: 0,它在生成的CSS中只會(huì)存在一次。這樣做的好處是,CSS文件的大小隨著唯一聲明的數(shù)量而增長(zhǎng),而不是隨著聲明的總數(shù)而增長(zhǎng)。由於大多數(shù)屬性被多次使用,這可以導(dǎo)致CSS文件大幅縮小。例如,F(xiàn)acebook舊的首頁(yè)使用了413 KB的gzip壓縮CSS。改版後,所有頁(yè)面的CSS大小為74 KB。同樣,較小的文件大小會(huì)導(dǎo)致更好的性能。

有些人可能會(huì)抱怨這一點(diǎn),認(rèn)為生成的類名不是語(yǔ)義化的,它們是不透明的,並且忽略了級(jí)聯(lián)。這是真的。我們將CSS視為編譯目標(biāo)。但這是有充分理由的。通過(guò)質(zhì)疑以前被認(rèn)為最佳的實(shí)踐,我們可以改善用戶和開發(fā)人員的體驗(yàn)。

此外,style9還有許多其他強(qiáng)大的功能,包括:使用TypeScript進(jìn)行類型化樣式、消除未使用樣式、使用JavaScript變量的能力以及對(duì)媒體查詢、偽選擇器和關(guān)鍵幀的支持。

如何使用它

首先,像往常一樣安裝它:

 <code>npm install style9</code>

style9有針對(duì)Rollup、Webpack、Gatsby和Next.js的插件,它們都基於Babel插件。關(guān)於如何使用它們的說(shuō)明可在存儲(chǔ)庫(kù)中找到。在這裡,我們將使用webpack插件。

 <code>const Style9Plugin = require('style9/webpack'); const MiniCssExtractPlugin = require('mini-css-extract-plugin'); module.exports = { module: { rules: [ // 這將轉(zhuǎn)換style9調(diào)用{ test: /\.(tsx|ts|js|mjs|jsx)$/, use: Style9Plugin.loader }, // 這是正常的Webpack CSS提取的一部分{ test: /\.css$/i, use: [MiniCssExtractPlugin.loader, 'css-loader'] } ] }, plugins: [ // 這將對(duì)最終的CSS文件中的聲明進(jìn)行排序并刪除重復(fù)的聲明new Style9Plugin(), // 這是正常的Webpack CSS提取的一部分new MiniCssExtractPlugin() ] };</code>

定義樣式

創(chuàng)建樣式的語(yǔ)法與其他庫(kù)非常相似。我們首先使用樣式對(duì)象調(diào)用style9.create:

 <code>import style9 from 'style9'; const styles = style9.create({ button: { padding: 0, color: 'rebeccapurple' }, padding: { padding: 12 }, icon: { width: 24, height: 24 } });</code>

因?yàn)樗新暶鞫紝a(chǎn)生原子類,所以諸如flex: 1和background: blue之類的簡(jiǎn)寫將不起作用,因?yàn)樗鼈冊(cè)O(shè)置了多個(gè)屬性??梢哉归_的屬性,例如padding、margin、overflow等,將自動(dòng)轉(zhuǎn)換為它們的完整形式。如果您使用TypeScript,則在使用不受支持的屬性時(shí)會(huì)收到錯(cuò)誤。

解析樣式

要生成類名,我們現(xiàn)在可以調(diào)用style9.create返回的函數(shù)。它接受我們要使用的樣式鍵作為參數(shù):

 <code>const className = styles('button');</code>

該函數(shù)的工作方式是這樣的:右側(cè)的樣式優(yōu)先,並將與左側(cè)的樣式合併,就像Object.assign一樣。以下將產(chǎn)生一個(gè)填充為12px且文本為rebeccapurple的元素。

 <code>const className = styles('button', 'padding');</code>

我們可以使用以下任何格式有條件地應(yīng)用樣式:

 <code>// 邏輯與styles('button', hasPadding && 'padding'); // 三元運(yùn)算符styles('button', isGreen ? 'green' : 'red'); // 布爾對(duì)象styles({ button: true, green: isGreen, padding: hasPadding });</code>

這些函數(shù)調(diào)用將在編譯期間被刪除,並替換為直接的字符串連接。上面代碼中的第一行將被替換為類似'c1r9f2e5 ' hasPadding ? 'cu2kwdz ' : ''的內(nèi)容。沒(méi)有留下運(yùn)行時(shí)代碼。

組合樣式

我們可以通過(guò)使用屬性名訪問(wèn)樣式對(duì)象並將其傳遞給style9來(lái)擴(kuò)展樣式對(duì)象。

 <code>const styles = style9.create({ blue: { color: 'blue; } }); const otherStyles = style9.create({ red: { color: 'red; } }); // 將為紅色const className = style9(styles.blue, otherStyles.red);</code>

就像函數(shù)調(diào)用一樣,右側(cè)的樣式優(yōu)先。但是,在這種情況下,類名不能靜態(tài)解析。相反,屬性值將被類替換,並在運(yùn)行時(shí)連接。屬性像以前一樣添加到CSS文件中。

總結(jié)

CSS-in-JS 的好處是真實(shí)存在的。也就是說(shuō),當(dāng)我們將樣式嵌入到代碼中時(shí),會(huì)產(chǎn)生性能成本。通過(guò)在構(gòu)建時(shí)提取值,我們可以同時(shí)獲得兩全其美的效果。我們可以從將樣式與標(biāo)記放在一起以及使用現(xiàn)有的JavaScript基礎(chǔ)設(shè)施中獲益,同時(shí)還可以生成最佳樣式表。

如果style9聽起來(lái)很有趣,請(qǐng)查看存儲(chǔ)庫(kù)並試用一下。如果您有任何疑問(wèn),請(qǐng)隨時(shí)提出問(wèn)題或聯(lián)繫我們。

致謝

感謝Giuseppe Gurgone 對(duì)style-sheet和dss的工作,感謝Nicolas Gallagher對(duì)react-native-web的工作,感謝Satyajit Sahoo和Callstack的全體成員對(duì)linaria的工作,感謝Christopher Chedeau、Sebastian McKenzie、Frank Yan、Ashley Watkins、Naman Goel以及在Facebook上從事stylex工作的其他所有人願(yuàn)意公開分享他們的經(jīng)驗(yàn)教訓(xùn)。以及任何其他我錯(cuò)過(guò)的其他人。

鏈接

  • johanholmerin/style9
  • 使用React、GraphQL和Relay構(gòu)建新的facebook.com – 2019年4月30日
  • 使用React和Relay構(gòu)建新的Facebook | Frank Yan – 2019年10月30日
  • 新的Facebook.com的技術(shù)棧重建– 2020年5月8日
  • johanholmerin/style9-components.macro:style9的Styled Components API – 實(shí)驗(yàn)性

以上是樣式9:構(gòu)建時(shí)間CSS-In-JS的詳細(xì)內(nèi)容。更多資訊請(qǐng)關(guān)注PHP中文網(wǎng)其他相關(guān)文章!

本網(wǎng)站聲明
本文內(nèi)容由網(wǎng)友自願(yuàn)投稿,版權(quán)歸原作者所有。本站不承擔(dān)相應(yīng)的法律責(zé)任。如發(fā)現(xiàn)涉嫌抄襲或侵權(quán)的內(nèi)容,請(qǐng)聯(lián)絡(luò)admin@php.cn

熱AI工具

Undress AI Tool

Undress AI Tool

免費(fèi)脫衣圖片

Undresser.AI Undress

Undresser.AI Undress

人工智慧驅(qū)動(dòng)的應(yīng)用程序,用於創(chuàng)建逼真的裸體照片

AI Clothes Remover

AI Clothes Remover

用於從照片中去除衣服的線上人工智慧工具。

Clothoff.io

Clothoff.io

AI脫衣器

Video Face Swap

Video Face Swap

使用我們完全免費(fèi)的人工智慧換臉工具,輕鬆在任何影片中換臉!

熱工具

記事本++7.3.1

記事本++7.3.1

好用且免費(fèi)的程式碼編輯器

SublimeText3漢化版

SublimeText3漢化版

中文版,非常好用

禪工作室 13.0.1

禪工作室 13.0.1

強(qiáng)大的PHP整合開發(fā)環(huán)境

Dreamweaver CS6

Dreamweaver CS6

視覺(jué)化網(wǎng)頁(yè)開發(fā)工具

SublimeText3 Mac版

SublimeText3 Mac版

神級(jí)程式碼編輯軟體(SublimeText3)

如何僅在某些頁(yè)面上包括CSS? 如何僅在某些頁(yè)面上包括CSS? Jun 11, 2025 am 12:01 AM

選擇性包含CSS在特定頁(yè)面上的方法有三種:1.內(nèi)聯(lián)CSS,適用於不常訪問(wèn)或需要獨(dú)特樣式的頁(yè)面;2.使用JavaScript條件加載外部CSS文件,適合需要靈活性的情況;3.服務(wù)器端包含,適用於使用服務(wù)器端語(yǔ)言的場(chǎng)景。這種方法可以優(yōu)化網(wǎng)站性能和可維護(hù)性,但需平衡模塊化與性能。

什麼是'渲染障礙CSS”? 什麼是'渲染障礙CSS”? Jun 24, 2025 am 12:42 AM

CSS會(huì)阻塞頁(yè)面渲染是因?yàn)闉g覽器默認(rèn)將內(nèi)聯(lián)和外部CSS視為關(guān)鍵資源,尤其是使用引入的樣式表、頭部大量?jī)?nèi)聯(lián)CSS以及未優(yōu)化的媒體查詢樣式。 1.提取關(guān)鍵CSS並內(nèi)嵌至HTML;2.延遲加載非關(guān)鍵CSS通過(guò)JavaScript;3.使用media屬性優(yōu)化加載如打印樣式;4.壓縮合併CSS減少請(qǐng)求。建議使用工具提取關(guān)鍵CSS,結(jié)合rel="preload"異步加載,合理使用media延遲加載,避免過(guò)度拆分與復(fù)雜腳本控制。

如何在無(wú)花果中使用Lotties 如何在無(wú)花果中使用Lotties Jun 14, 2025 am 10:17 AM

在接下來(lái)的教程中,我將向您展示如何在無(wú)花果中創(chuàng)建Lottie動(dòng)畫。我們將使用兩種彩色設(shè)計(jì)來(lái)超越如何在無(wú)花果上進(jìn)行動(dòng)畫,然後向您展示如何從Figma到Lottie動(dòng)畫。您只需要免費(fèi)無(wú)花果

打破邊界:用(s)CSS構(gòu)建湯姆拼圖 打破邊界:用(s)CSS構(gòu)建湯姆拼圖 Jun 13, 2025 am 11:33 AM

我們對(duì)其進(jìn)行了測(cè)試,事實(shí)證明,至少在低級(jí)邏輯和拼圖行為時(shí),Sass可以替換JavaScript。除了地圖,混音,功能和大量數(shù)學(xué)外,我們都設(shè)法使我們的Tangram難題栩栩如生,沒(méi)有J

外部與內(nèi)部CSS:最好的方法是什麼? 外部與內(nèi)部CSS:最好的方法是什麼? Jun 20, 2025 am 12:45 AM

thebestapphachforcssdepprodsontheproject'sspefificneeds.forlargerprojects,externalcsSissBetterDuoSmaintoMaintainability andReusability; forsMallerProjectsorsingle-pageApplications,InternaltCsmightBemoresobleable.InternalCsmightBemorese.it.it'sclucialtobalancepopryseceneceenceprodrenceprodrenceNeed

我的CSS必須在較低的情況下嗎? 我的CSS必須在較低的情況下嗎? Jun 19, 2025 am 12:29 AM

否,CSSDOESNOTHAVETOBEINLOWERCASE.CHOMENDENS,使用flowercaseisrecommondendendending:1)一致性和可讀性,2)避免使用促進(jìn)性技術(shù),3)潛在的Performent FormanceBenefits,以及4)RightCollaboraboraboraboraboraboraboraboraboraboraboraboraboraboraboraboraborationWithInteams。

CSS計(jì)數(shù)器:一個(gè)逐步教程,示例 CSS計(jì)數(shù)器:一個(gè)逐步教程,示例 Jun 12, 2025 am 10:31 AM

CSSCounters是一種用於創(chuàng)建自動(dòng)編號(hào)的工具。 1.基本用法:通過(guò)counter-reset和counter-increment定義和操作計(jì)數(shù)器,如在h2前顯示"SectionX."。 2.高級(jí)用法:使用嵌套計(jì)數(shù)器創(chuàng)建複雜編號(hào),如章節(jié)和小節(jié)編號(hào)。 3.注意事項(xiàng):確保正確重置計(jì)數(shù)器,優(yōu)化性能,簡(jiǎn)化計(jì)數(shù)器邏輯。 4.最佳實(shí)踐:命名清晰,在CSS中定義計(jì)數(shù)器,合理使用counter-increment和counter-reset。

CSS案例靈敏度:了解重要的 CSS案例靈敏度:了解重要的 Jun 20, 2025 am 12:09 AM

cssismostlycaseminemintiment,buturlsandfontfamilynamesarecase敏感。 1)屬性和valueslikeColor:紅色; prenotcase-sensive.2)urlsmustmustmatchtheserver'server'scase,例如

See all articles