組件化的css-module

2022-01-01 前端那些事兒

css 算是前端發展的一個痛點吧. 以前是裸寫css, 接著到後來的 inline css, 然後是, scss/sass. 從單一 file 到可以模塊化書寫css. 不過, 隨著前端發展, 現在的要求是組件化, 那麼, 以前那種直接 < link> 腳本也逐漸變為痛點. so, 2015/6 左右, 出來了 css-module 這個概念. 可以說, 這是一個專門為 component 編程而生的. 因為,他是和 js 緊密結合在一起的。


css-module 更具官方的說法就是: css-module 其實就是原來的 css 文件。只是他的 className 和 animation 最後都會被編譯為 object 形式的映射對象。


舉個簡單的例子就是:

 

.title { 

  background-color: red; 

 

 

import styles from "./styles.css"; 

 

element.innerHTML =  

  `<h1 class="${styles.title}"> 

    demo 

   </h1>`; 

 

 

# css 格式 

._styles__title_309571057 { 

  background-color: red; 

# HTML 格式 

<h1 class="_styles__title_309571057"> 

  demo 

</h1>

上面簡單的介紹了, css-module 到底是啥?Ps: 上面漏了一點, 怎麼將css 編譯嘞? 這裡,方法很多,有webpack, gulp等等. 看同學們自己的選擇了

命名方式

首先,在 css-module 裡面. 以前在 css 中的命名方式,都變得 nonsense. 在 css-module 推薦一切命名方式使用 camelCase 的形式. 因為, 在寫組件的時候我們並不是來寫全局的樣式, 我們僅僅只是來完成我們當前組件的渲染. 所以, 這就要求, 這些組件所需和隱藏的 css 屬性, 我們必須一個不拉的全部寫上去, 比如: display, font, text-align 等等。

 

# 原始的css 

.btn-normal{...} 

 

# 使用 css-module 

# 實際該文件的保存名就是 btn-style.css 

.normal{...} 

.clickStyle{...}


組合 composition

既然, 上文已經說了 css-module 裡面每個 style 都必須全部寫出所需的樣式, 那麼, 這樣重複的工作實在太多的... 誰 TM 還和你來什麼 module 不 module 的. 所以, 為了解決這樣的痛點, css-module 提供了 composes 這個概念。相當於就是我們以前 css 中的嵌套。

 

# 直接嵌套 

.button{...} 

.button .normal{...} 

 

 

# 使用 composes 進行嵌套 

.button{...} 

.normal{ 

    composes:button; 

    ... 

}

這個 composes 概念,就有點和 sass 中的 @extends 類似. 但,他倆編譯的結果點都不像. composes 是直接在 DOM 渲染時, 添加不同的 class。

而 @extends 只是將 class 變為嵌套而已。

 

.Button--common { ... } 

.Button--normal { 

  @extends .Button--common; 

    ... 

 

 

.Button--common, .Button--normal {...} 

.Button--normal {...}

但,這樣並不符合 css-module 實際編譯後改變 className 的 feature, 並且, @extends 的結果, 會造成很大的 className 冗餘。


具體說一下 css-module composes 的過程。

 

.common { ...} 

.normal { composes: common; ... } 

 

 

# 注意,這裡並沒有存在嵌套的情況,每個className 都是分離的. 

.components_submit_button__common__abc5436 { ... } 

.components_submit_button__normal__def6547 { ... } 

 

 

styles: { 

  common: "components_submit_button__common__abc5436", 

  normal: "components_submit_button__common__abc5436 components_submit_button__normal__def6547", 

 

 

# 添加 style.normal 樣式 

<button class="components_submit_button__common__abc5436  

               components_submit_button__normal__def6547"> 

  Submit 

</button>

當然, composes 也可以引入其他 css 文件中的某個 class。

 

.primary { 

  color: #720; 

 

 

.normal { 

  composes: primary from "../shared/colors.css"; 

}

另外, 寫好一個 css-module 有很多原則可以遵循的. 最出名的應該就是 單一職責原則。

單一職責

因為 composes 的限制, 我們一般只能引入單一的 className 去包裹我們想要的 style 樣式. 但這樣,感覺有點浪費. 這點,感覺 sass 做的還是挺棒的。

@mixin subtle-shadow { 

  box-shadow: 0 0 4px -2px; 

 

.some_element { 

  @include subtle-shadow; 

}

所以, 為了在 css-module 達到同樣的目的. 我們一般只能使用單一的文件去包裹,所需的樣式內容. 像下面的 demo:

 

.element { 

  composes: large from "./typography.css"; 

}


具體實例

css-module 主要是和 react 一起使用. 因為, react 存在, 才使前端組件化得到蓬勃的發展. so, 我們這裡,就需要藉助 webpack 對 import 的 css 文件進行編譯。

這裡就不多說了, 直接把配置放出來吧。

 

var ExtractTextPlugin = require('extract-text-webpack-plugin'); 

 

 

# 下面就是具體的 module.exports 裡面的內容 

 module: { 

  

    loaders: [ 

      { test: /\\.css$/, loader: ExtractTextPlugin.extract('style-loader', 'css-loader?modules&importLoaders=1&localIdentName=[name]__[local]___[hash:base64:5]!postcss-loader') } 

    ] 

  }, 

 

  postcss: [ 

    require('autoprefixer-core'), 

    require('postcss-color-rebeccapurple') 

  ], 

 

  resolve: { 

    modulesDirectories: ['node_modules', 'components'] 

  }, 

 

  plugins: [ 

    new ExtractTextPlugin('style.css', { allChunks: true }) 

  ]

如果,想更快的了解的話, 那就直接去線上 demo 看吧:

http://plnkr.co/edit/FbcJpb?p=preview

【您可能感興趣的文章】

一、高清屏概念解析與檢測設備像素比的方法

二、學習設計模式前需要知道的事情

三、表單驗證請進!!!

四、探知JS測試(1)

五、探知JS測試(2)

六、前端學習路徑加強版——來自《前端養成記》

七、前端技能圖譜

八、重構代碼的tricks

九、優化你的DOM

十、[VueJS] V1 與 V2 組件實體之差異


前端圈--打造專業的前端技術會議

為web前端開發者提供技術分享和交流的平臺

打造一個良好的前端圈生態,推動web標準化的發展

官網:http://fequan.com

微博:fequancom | QQ群:41378087


長按二維碼關注我們

投稿:content@fequan.com

贊助合作:apply@fequan.com

相關焦點

  • 《精通react/vue組件設計》之實現一個健壯的警告提示(Alert)組件
    本文轉載自【微信公眾號:趣談前端,ID:beautifulFront】經微信公眾號授權轉載,如需轉載與原文作者聯繫前言本文是筆者寫組件設計的第七篇文章, 今天帶大家實現一個自帶主題且可關閉的Alert組件, 該組件在諸如Antd或者elementUI等第三方組件庫中都會出現,主要用來提供系統的用戶反饋
  • 精通react/vue組件設計之實現一個Tag(標籤)和Empty(空狀態)組件
    "辛勤勞動",而是要根據已有前端的開發經驗,總結出一套自己的高效開發的方法.作為數據驅動的領導者react/vue等MVVM框架的出現,幫我們減少了工作中大量的冗餘代碼, 一切皆組件的思想深得人心.所以, 為了讓工程師們有更多的時間去考慮業務和產品迭代,我們不得不掌握高質量組件設計的思路和方法.所以筆者將花時間去總結各種業務場景下的組件的設計思路和方法,並用原生框架的語法去實現各種常用組件的開發,希望等讓前端新手或者有一定工作經驗的朋友能有所收穫
  • 精通react/vue組件設計之配合React Portals實現一個(Drawer)組件
    通過組件的設計過程,大家會接觸到一個完成健壯的組件設計思路和方法,也能在實現組件的過程逐漸對react/vue的高級知識和技巧有更深的理解和掌握,並且在企業實際工作做遊刃有餘.抽屜動畫我們通過控制抽屜內容的寬度來實現,配合overflow:hidden, 後面我會單獨附上css代碼供大家參考.
  • DIV+CSS命名規範大全
    news_release最新產品.publisher生產商.screenshot縮略圖.faqs常見問題.keyword關鍵詞.blog博客.forum論壇master.css,style.css主要的module.css模塊base.css基本共用layout.css布局,版面themes.css主題columns.css專欄font.css文字、字體forms.css
  • Bootstrap組件福利篇:幾款好用的組件推薦,你值得擁有!(一)
    最最方便的是它不需要使用JavaScript去做初始化,只需要在html裡面初始化即可。源碼以及文檔地址首先需要引用的文件如下:<link href="~/Content/bootstrap/css/bootstrap.css" rel="stylesheet" /><link rel="stylesheet" href="https://maxcdn.bootstrapcdn.com/font-awesome/
  • HTML DIV+CSS 命名規範大全
    頂部廣告條)電子貿易相關.products產品.products_prices產品價格.products_description產品描述.products_review產品評論.editor_review編輯評論.news_release最新產品.publisher生產商.screenshot縮略圖.faqs常見問題.keyword關鍵詞.blog博客.forum論壇CSS文件命名說明master.css
  • 《精通react/vue組件設計》之快速實現一個可定製的進度條組件
    今天要來實現一個高可定製的進度條組件,在介紹組件設計之前,我們先牢記以下幾個原則.每日一學: 組件設計三原則高內聚, 低耦合(尤其是vue/react組件中, 降低組件之間的耦合尤為重要)組件邊界劃分清晰(每一個組件都有自己清晰的邊界劃分)單一職責(
  • vue+swiper+animate.css製作全屏滾動H5
    npm install swiper@3 npm install animate.css 2.在main.js中引入animate.cssimport Vue from "vue"import App from ".
  • Vue 內置組件 transition 以及過渡動畫
    概述Vue 提供了 transition 的封裝組件,在下列情形中,可以給任何元素和組件添加進入/離開過渡。
  • 前端組件/庫打包利器rollup使用與配置實戰
    本文轉載自【微信公眾號:趣談前端,ID:beautifulFront】經微信公眾號授權轉載,如需轉載與原文作者聯繫目前主流的前端框架vue和react都採用rollup來打包,為了探索rollup的奧妙,接下來就讓我們一步步來探索,並基於rollup搭建一個庫打包腳手架,來發布自己的庫和組件。
  • 強大的CSS原生樣式支持,不費吹灰之力就搞定註冊頁面
    實施步驟詳解首先,打開報表設計器,先拖動輸入框組件和按鈕組件,把需要製作的樣式排版好。其次,既然要高大上,那深沉高級的背景肯定不能少。我們選中編輯界面的表單組件,然後打開自定義樣式設置對話框:在這裡寫的css樣式就會自動適用於組件上啦!
  • 2021年你應該知道的9個網頁組件庫
    你還在愁著找不到與框架無關的網頁組件嗎?本文將讓你大有收穫。網頁組件包含各種常用的界面組件,如:表格、樹、聯動下拉框等,可輕鬆構造出令人耳目一新的,具有RIA (Rich Internet Application) 特徵的Web 應用界面。
  • 49期:利用clip-path製作css動畫
    引最近工作項目中有製作動畫效果的需求,查閱了一些網站之後,在一個名叫species-in-pieces的網站(species-in-pieces.com)看到了以下神奇的動畫效果:用Chrome的開發者工具窺探一番之後,發現這個酷炫的動畫效果基本是純css實現的!其實現核心就是css3中加入的 clip-path 屬性。
  • jquery技巧之讓任何組件都支持類似DOM的事件管理
    發布-訂閱模式很多博客包括書本上都說javascript要實現組件的自定義事件的話,可以採用發布-訂閱模式,起初我也是堅定不移地這麼認為的,於是用jquery的$.Callbacks寫了一個:define(function(require, exports, module) {     var $ = require('jquery