CSS 書寫禪機(jī)

這是未來(lái)的趨勢(shì)所向盹牧,如是我行。

注意:原文發(fā)表于 2017-9-6沈撞,隨著框架不斷演進(jìn)慷荔,部分內(nèi)容可能已不適用。

CSS 日漸惹人憎惡缠俺。

究其原因頗多显晶,歸根結(jié)底,皆因 CSS 給人的感覺總是飄渺迷蒙壹士、變幻莫測(cè)磷雇。

譬如微調(diào)某個(gè)樣式后,卻出乎意料地殃及一些看似毫無(wú)瓜葛的布局躏救,尤其是準(zhǔn)備部署之時(shí)唯笙。

這類經(jīng)驗(yàn)如果你從未體會(huì)過(guò)的話螟蒸,你要么是不明就里的新手,要么是登峰造極的高人崩掘。

故此 JavaScript 社區(qū)又開始擼起袖子著手炮制七嫌,只消數(shù)載,各色各樣的 CSS 庫(kù)宛如雨后春筍不斷涌現(xiàn)苞慢,它們統(tǒng)稱為 CSS-in-JS诵原。

然而 CSS 最棘手的問(wèn)題也許并不需要 CSS-in-JS 亦可解決,對(duì)此你可能還不知情挽放。

倘若果真如此绍赛,那么編寫 CSS 將是一種愜意的享受,而非痛苦的忍受辑畦,此外吗蚌,CSS-in-JS 也會(huì)產(chǎn)生新的問(wèn)題要去解決,未免有點(diǎn)旁生枝節(jié)航闺。

本文并非要和 CSS-in-JS 針鋒相對(duì)褪测,也不否定社區(qū)所做的努力猴誊,它在 JS 生態(tài)中如此活躍潦刃,且每周都有新的想法出現(xiàn)。

其實(shí)我目的是想介紹一種讓人更加愉快的替代方案 —— 它就是帶有真正 CSS 的單文件組件懈叹!

CSS 最大的問(wèn)題

CSS 中的一切都是全局的乖杠,正因如此,為某個(gè)標(biāo)記上編寫的樣式澄成,可能會(huì)使另一個(gè)標(biāo)記受到牽連胧洒。

也正因如此,開發(fā)者經(jīng)常借助于各種命名空間的約定(而非“規(guī)則”墨状,因?yàn)殡y以實(shí)施)卫漫,但此法只會(huì)徒增 RSI 的風(fēng)險(xiǎn)。

如果你置身于團(tuán)隊(duì)之中肾砂,情況愈加惡劣列赎。他人所寫的樣式無(wú)人敢改,通常無(wú)法猜測(cè)它們是做什么用的镐确,應(yīng)用在哪些標(biāo)記了包吝,以及如果刪掉會(huì)帶來(lái)什么災(zāi)難。

其結(jié)果是:樣式表必須只增不減源葫。

你無(wú)法得知哪些代碼可以安全地刪除诗越。因此常見的做法是用一些更具體的樣式來(lái)覆蓋現(xiàn)有樣式,哪怕是在相對(duì)較小的項(xiàng)目上亦是如此息堂。

單文件組件扭轉(zhuǎn)乾坤

SFC 背后的思想十分簡(jiǎn)單:在一份 HTML 文件中編寫組件嚷狞,該文件可以包含描述組件樣式的 <style> 和描述行為的 <script> 標(biāo)記。

Svelte、Ractive床未、Vue 以及 Polymer 都是遵循這種模式褂乍。

(顯然我們?cè)谖恼缕溆鄡?nèi)容都將使用 Svelte,但是如果使用模板會(huì)讓你膽戰(zhàn)心驚的話即硼,其實(shí)你的擔(dān)心是多余的逃片,不過(guò)這又是另一個(gè)話題了,那你可以使用 Vue只酥,它允許你在 SFC 中編寫 JSX)

如果你從未接觸過(guò) Svelte褥实,不妨先參看這篇文章:無(wú)招勝有招:為何我們沒有及早悟到這個(gè)辦法?裂允,或者看看用戶評(píng)價(jià)损离。

應(yīng)用這種模式,結(jié)果會(huì)發(fā)生幾件美妙的事情:

  • 組件的樣式都是局部樣式(scoped)绝编,不會(huì)向外泄露僻澎,沒有不可預(yù)知的級(jí)聯(lián)情況,徹底擺脫為了防止名稱沖突而硬取的超級(jí)啰嗦的類名十饥。

  • 你無(wú)需再去文件夾中苦苦追查那些破壞你樣式的規(guī)則窟勃。

  • 編譯器(例如 Svelte)能夠識(shí)別和刪除無(wú)效的樣式,從此不再是“只增不減”了逗堵!

下面我們來(lái)試試探明究竟秉氧。

所有代碼編輯器都能識(shí)別這些 CSS,其內(nèi)置了自動(dòng)完成蜒秤、監(jiān)測(cè)汁咏、語(yǔ)法高亮等等功能,無(wú)需額外的 JS 各種龐雜的工具作媚。

同時(shí)攘滩,這些都是真正的 CSS,并非那些使用了駝峰命名及雙引號(hào)無(wú)處不在的魚目混珠的東西纸泡。

我們可以在 devTools 中對(duì)樣式進(jìn)行修葺調(diào)整漂问,再?gòu)?fù)制粘貼回代碼中,如此行云流水的工作方式弟灼,我再也無(wú)法離開這種酸爽级解。

不得不說(shuō),CSS source maps 功能已是開箱即用的田绑,因此你能快速定位問(wèn)題所在的行勤哗。

其重要性不言而喻:

當(dāng)你使用所見即所得(WYSIWYG)的模式之時(shí),你不會(huì)從組件樹的角度去思考問(wèn)題的掩驱,因此亟需一個(gè)萬(wàn)全之策使有問(wèn)題的樣式原形畢露芒划。

如果組件本就出自他人之手冬竟,情況尤其堪憂。(我敢保證民逼,這種 CSS 工作方式能極大提升你的生產(chǎn)力泵殴,離開 source maps,毋庸置疑你是在虛耗光陰拼苍,因?yàn)槲以?jīng)就是如此笑诅。)

Svelte 轉(zhuǎn)譯你的 CSS 選擇器來(lái)實(shí)現(xiàn)讓樣式只應(yīng)用在局部范圍內(nèi),它同時(shí)也適用于受影響的元素的屬性疮鲫,盡管確切的機(jī)制無(wú)關(guān)緊要吆你,并且可能會(huì)有所變化。

未使用的規(guī)則會(huì)被移除并發(fā)出警告俊犯,然后你可以將精簡(jiǎn)后的結(jié)果寫到 .css 文件中妇多。

還有一個(gè)實(shí)驗(yàn)性的新功能,就是可以編譯組件為 Web Components燕侠,然后將樣式封裝到 shadow DOM 中(如果這剛好就是你所期望的話)者祖。

一切皆有可能,因?yàn)槟愕?CSS 在標(biāo)記的上下文中被解析(使用 css-tree)和靜態(tài)分析绢彤。

靜態(tài)分析為未來(lái)各種令人振奮的可能性打開大門:更智能的優(yōu)化手段七问,各種提示……

但是如果你的樣式需要在運(yùn)行時(shí)才去動(dòng)態(tài)計(jì)算的話,則做這些事情要困難得多杖虾。

我們也才剛剛開始烂瘫。

但我們也可以借助工具來(lái)做啊 [X]媒熊!

如果你看了視頻后的反應(yīng)是:“很好奇适,但是 —— 我們使用 TypeScript,且為各種編輯器編寫插件芦鳍,也能獲得自動(dòng)完成和語(yǔ)法高亮的功能啊嚷往。”

換而言之柠衅,為了獲得與 CSS 等價(jià)的效果皮仁,而去折騰構(gòu)建、文檔菲宴、推進(jìn)及維護(hù)等等一堆輔助性的項(xiàng)目贷祈,如果你認(rèn)為這些事情意義重大……

那么,多說(shuō)無(wú)益喝峦,你和我是道不同势誊,不相為謀了!

我們?nèi)匀粵]有全部答案

綜上所述谣蠢。

誠(chéng)然粟耻,CSS-in-JS 確實(shí)對(duì)一些懸而未決的問(wèn)題給出了答案:

  • 如何從 npm 安裝樣式查近?

  • 我們?nèi)绾沃赜靡恍┒x在同一個(gè)地方的常量?

  • 如何組合聲明挤忙?

就個(gè)人而言霜威,我認(rèn)為所得的好處,沒有超出上述這些問(wèn)題的范圍册烈。

你的選擇可能有不同的優(yōu)先次序戈泼,使你放棄 CSS 有足夠的理由。

但總的來(lái)說(shuō)赏僧,你還是必須了解 CSS 的矮冬,不論熱愛還是憎惡,最終都在所難免要學(xué)習(xí)它次哈。

作為 Web 的守望者胎署,我們可以做選擇:

創(chuàng)建高深莫測(cè)的抽象,讓 Web 開發(fā)者的學(xué)習(xí)曲線更加陡峭窑滞,或者一起解決 CSS 糟粕部分琼牧。

怎么選擇,我已心中有數(shù)哀卫。

<The End>

- 窗明幾凈巨坊,靜候時(shí)日變遷 -

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市此改,隨后出現(xiàn)的幾起案子趾撵,更是在濱河造成了極大的恐慌,老刑警劉巖共啃,帶你破解...
    沈念sama閱讀 218,386評(píng)論 6 506
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件占调,死亡現(xiàn)場(chǎng)離奇詭異,居然都是意外死亡移剪,警方通過(guò)查閱死者的電腦和手機(jī)究珊,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,142評(píng)論 3 394
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)纵苛,“玉大人剿涮,你說(shuō)我怎么就攤上這事」ト耍” “怎么了取试?”我有些...
    開封第一講書人閱讀 164,704評(píng)論 0 353
  • 文/不壞的土叔 我叫張陵,是天一觀的道長(zhǎng)怀吻。 經(jīng)常有香客問(wèn)我瞬浓,道長(zhǎng),這世上最難降的妖魔是什么烙博? 我笑而不...
    開封第一講書人閱讀 58,702評(píng)論 1 294
  • 正文 為了忘掉前任瑟蜈,我火速辦了婚禮烟逊,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘铺根。我一直安慰自己宪躯,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,716評(píng)論 6 392
  • 文/花漫 我一把揭開白布位迂。 她就那樣靜靜地躺著访雪,像睡著了一般。 火紅的嫁衣襯著肌膚如雪掂林。 梳的紋絲不亂的頭發(fā)上臣缀,一...
    開封第一講書人閱讀 51,573評(píng)論 1 305
  • 那天,我揣著相機(jī)與錄音泻帮,去河邊找鬼精置。 笑死,一個(gè)胖子當(dāng)著我的面吹牛锣杂,可吹牛的內(nèi)容都是我干的脂倦。 我是一名探鬼主播,決...
    沈念sama閱讀 40,314評(píng)論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼元莫,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼赖阻!你這毒婦竟也來(lái)了?” 一聲冷哼從身側(cè)響起踱蠢,我...
    開封第一講書人閱讀 39,230評(píng)論 0 276
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤火欧,失蹤者是張志新(化名)和其女友劉穎,沒想到半個(gè)月后茎截,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體苇侵,經(jīng)...
    沈念sama閱讀 45,680評(píng)論 1 314
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,873評(píng)論 3 336
  • 正文 我和宋清朗相戀三年稼虎,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了衅檀。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 39,991評(píng)論 1 348
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡霎俩,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出沉眶,到底是詐尸還是另有隱情打却,我是刑警寧澤,帶...
    沈念sama閱讀 35,706評(píng)論 5 346
  • 正文 年R本政府宣布谎倔,位于F島的核電站柳击,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏片习。R本人自食惡果不足惜捌肴,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,329評(píng)論 3 330
  • 文/蒙蒙 一蹬叭、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧状知,春花似錦秽五、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,910評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)。三九已至西设,卻和暖如春瓣铣,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背贷揽。 一陣腳步聲響...
    開封第一講書人閱讀 33,038評(píng)論 1 270
  • 我被黑心中介騙來(lái)泰國(guó)打工棠笑, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人禽绪。 一個(gè)月前我還...
    沈念sama閱讀 48,158評(píng)論 3 370
  • 正文 我出身青樓腐晾,卻偏偏與公主長(zhǎng)得像,于是被迫代替她去往敵國(guó)和親丐一。 傳聞我的和親對(duì)象是個(gè)殘疾皇子藻糖,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,941評(píng)論 2 355

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

  • Next.js 是一個(gè)輕量級(jí)的 React 服務(wù)端渲染應(yīng)用框架。 Next.js中文站點(diǎn) http://nextj...
    前端妹子ice閱讀 72,628評(píng)論 6 19
  • 前言 React是一個(gè)構(gòu)建用戶界面的js庫(kù),從UI=render()這個(gè)等式中就很好的映射了這一點(diǎn),UI的顯示取決...
    itclanCoder閱讀 3,983評(píng)論 0 2
  • 先補(bǔ)充兩個(gè)東西 fragments的使用 代替最外層包裹的div, jsx里面只能有一個(gè)東西, 不然報(bào)錯(cuò) 可以用另...
    JackLeeVip閱讀 546評(píng)論 0 2
  • 語(yǔ)法 縮進(jìn)統(tǒng)一(tab鍵或4個(gè)空格) 每個(gè)屬性聲明末尾都要加分號(hào) 對(duì)于屬性值或顏色參數(shù)库车,省略小于 1 的小數(shù)前面的...
    瀟瀟輕語(yǔ)閱讀 243評(píng)論 0 0
  • 簡(jiǎn)介 CSS-in-JS是什么巨柒,看到這個(gè)詞就能大概猜到是在JavaScript里寫CSS,那為什么要在JavaSc...
    videring閱讀 823評(píng)論 0 0