国产 无码 综合区,色欲AV无码国产永久播放,无码天堂亚洲国产AV,国产日韩欧美女同一区二区

CSS Modules - CSS模塊化

這篇具有很好參考價值的文章主要介紹了CSS Modules - CSS模塊化。希望對大家有所幫助。如果存在錯誤或未考慮完全的地方,請大家不吝賜教,您也可以點擊"舉報違法"按鈕提交疑問。

參考文章:
CSS Modules 用法教程-阮一峰
css module
css模塊化及CSS Modules使用詳解

背景-CSS 模塊化

CSS 模塊化的解決方案有很多,但主要有兩類:
一類是徹底拋棄 CSS,使用 JS 或 JSON 來寫樣式。Radium,jsxstyle,react-style 屬于這一類。

  • 優(yōu)點是能給 CSS 提供 JS 同樣強大的模塊化能力;
  • 缺點是不能利用成熟的 CSS 預處理器(或后處理器) Sass/Less/PostCSS,:hover 和 :active 偽類處理起來復雜。

另一類是依舊使用 CSS,但使用 JS 來管理樣式依賴,代表是 CSS Modules。

  • CSS Modules 能最大化地結合現(xiàn)有 CSS 生態(tài)和 JS 模塊化能力,API 簡潔到幾乎零學習成本。
  • 發(fā)布時依舊編譯出單獨的 JS和 CSS。
  • 它并不依賴于 React,只要你使用 Webpack,可以在 Vue/Angular/jQuery 中使用。
  • 是我認為目前最好的CSS 模塊化解決方案

前言

CSS Modules 提供各種插件,支持不同的構建工具。
本文使用的是 Webpackcss-loader插件,因為它對 CSS Modules 的支持最好,而且很容易使用。

為什么需要CSS Modules

解決類名沖突問題
CSS的規(guī)則都是全局的,任何一個組件的樣式規(guī)則,都對整個頁面有效。因此,為了使用獨特的樣式,要保證元素的類名不沖突。這對于大型項目而言是很難的。
CSS Modules的思路:
產生一個獨一無二的class的名字,不會與其他選擇器重名

實現(xiàn)原理

  1. 開啟了css module后,構建工具webpack的css-loader會將樣式中的類名進行轉換,轉換為一個唯一的hash值
    css模塊化,# CSS,css,webpack,javascript
    由于hash值是根據模塊路徑和類名生成的,因此,不同的css模塊,哪怕具有相同的類名,轉換后的hash值也不一樣。

  2. 根據導出結果可知,我們就可以在js代碼中獲取到css模塊導出的結果,從而應用類名

// src/index.js
import style from  "./assets/style.css"
console.log(style)
const div = document.getElementById("div1");
div.className = style.c1;

打印結果如下:
css模塊化,# CSS,css,webpack,javascript

語法

參考CSS Modules 用法教程-阮一峰

0.配置

webpack.config.js文件如下:

module.exports = {
  entry: __dirname + '/index.js',
  output: {
    publicPath: '/',
    filename: './bundle.js'
  },
  module: {
    loaders: [
      {
        test: /\.jsx?$/,
        exclude: /node_modules/,
        loader: 'babel',
        query: {
          presets: ['es2015', 'stage-0', 'react']
        }
      },
      {
        test: /\.css$/,
        loader: "style-loader!css-loader?modules"
      },
    ]
  }
};

關鍵的一行是style-loader!css-loader?modules,它在css-loader后面加了一個查詢參數modules,表示打開 CSS Modules 功能。

0.1初始代碼

App.css:

.title {
  color: red;
}

React組件App.js:

import React from 'react';
import style from './App.css';

export default () => {
  return (
    <h1 className={style.title}>
      Hello World
    </h1>
  );
};

1. 局部作用域

使用了 CSS Modules 后,樣式默認局部
相當于給每個 class 名外加加了一個 :local,以此來實現(xiàn)樣式的局部化

.normal {
  color: green;
}

/* 以上與下面等價 */
:local(.normal) {
  color: green; 
}

同上。h1標題會顯示為紅色

2.全局作用域

CSS Modules 允許使用**:global(.className)**的語法,聲明一個全局規(guī)則。
凡是這樣聲明的class,都不會被編譯成哈希字符串。
e.g.
App.css加入一個全局class:

.title {
  color: red;
}
:global(.title) {
  color: green;
}
/* 定義多個全局樣式 */
:global {
  .link {
    color: green;
  }
  .box {
    color: yellow;
  }
}

App.js使用普通的class的寫法:

import React from 'react';
import styles from './App.css';

export default () => {
  return (
    <h1 className="title">
      Hello World
    </h1>
  );
};

h1標題顯示為綠色。

CSS Modules 還提供一種顯式的局部作用域語法:local(.className),等同于.className,所以上面的App.css也可以寫成下面這樣:

:local(.title) {
  color: red;
}

:global(.title) {
  color: green;
}

3.定制哈希類名

css-loader默認的哈希算法是[hash:base64],這會將.title編譯成._3zyde4l1yATCOkgn-DBWEL這樣的字符串。

webpack.config.js里面可以定制哈希字符串的格式:

module: {
  loaders: [
    // ...
    {
      test: /\.css$/,
      loader: "style-loader!css-loader?modules&localIdentName=[path][name]---[local]---[hash:base64:5]"
    },
  ]
}

你會發(fā)現(xiàn).title被編譯成了demo03-components-App---title---GpMto

4.Class的組合

在 CSS Modules 中,一個選擇器可以繼承另一個選擇器的規(guī)則,這稱為"組合"(“composition”)
在App.css中,讓.title繼承.className

.className {
  background-color: blue;
}

.title {
  composes: className;
  color: red;
}

運行,會看到紅色的h1在藍色的背景上。

打印App.js中導入的style,結果如下:
css模塊化,# CSS,css,webpack,javascript

5.輸入其他模塊

選擇器也可以繼承其他CSS文件里面的規(guī)則
e.g. another.css文件

.className {
  background-color: blue;
}

App.css繼承another.css里面的規(guī)則

.title {
  composes: className from './another.css';
  color: red;
}

藍色的背景上有一個紅色的h1(相當于class的組合,只不過來自另一個文件)

6.輸入變量

CSS Modules 支持使用變量,不過需要安裝 PostCSS 和 postcss-modules-values

  1. 把postcss-loader加入webpack.config.js:

var values = require('postcss-modules-values');

module.exports = {
  entry: __dirname + '/index.js',
  output: {
    publicPath: '/',
    filename: './bundle.js'
  },
  module: {
    loaders: [
      {
        test: /\.jsx?$/,
        exclude: /node_modules/,
        loader: 'babel',
        query: {
          presets: ['es2015', 'stage-0', 'react']
        }
      },
      {
        test: /\.css$/,
        loader: "style-loader!css-loader?modules!postcss-loader"
      },
    ]
  },
  postcss: [
    values
  ]
};
  1. 在colors.css里面定義變量
@value blue: #0c77f8;
@value red: #ff0000;
@value green: #aaf200;
  1. App.css可以引用這些變量
@value colors: "./colors.css";
@value blue, red, green from colors;

.title {
  color: red;
  background-color: blue;
}

會看到藍色的背景上有一個紅色的h1

項目使用

一般的腳手架都默認集成了 CSS Modules,比如 React 官方的腳手架create-react-app,已經將 CSS Modules 集成進來了,可以直接使用。
我有個問題,螞蟻的前端腳手架Ant Design Pro是基于react的,這是不是意味著它默認也集成了 CSS Modules。(當然,它的確是集成了的,只是,是不是基于react的腳手架也都默認集成了CSS Modules)文章來源地址http://www.zghlxwxcb.cn/news/detail-744779.html

到了這里,關于CSS Modules - CSS模塊化的文章就介紹完了。如果您還想了解更多內容,請在右上角搜索TOY模板網以前的文章或繼續(xù)瀏覽下面的相關文章,希望大家以后多多支持TOY模板網!

本文來自互聯(lián)網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。如若轉載,請注明出處: 如若內容造成侵權/違法違規(guī)/事實不符,請點擊違法舉報進行投訴反饋,一經查實,立即刪除!

領支付寶紅包贊助服務器費用

相關文章

  • 20230728----重返學習-跨域-模塊化-webpack初步

    跨域 為什么要跨域? 瀏覽器為了安全,不能讓我們的html文件可以隨意引用別的服務器中的文件,只允許我們的html或js文件中,請求我們自己服務器。這個就是瀏覽器的同源策略。 因為我們的網頁是一個html文件,這個html是在一個域名里的。而這個html會引用各種文件,如圖片

    2024年02月15日
    瀏覽(51)
  • vue - vuex詳細講解和modules模塊化的使用

    vue - vuex詳細講解和modules模塊化的使用

    vuex 簡介 Vuex 是一個專為 Vue.js 應用程序開發(fā)的狀態(tài)管理模式。它采用集中式存儲管理應用的所有組件的狀態(tài),并以相應的規(guī)則保證狀態(tài)以一種可預測的方式發(fā)生變化。 通俗的來說,vuex是用于當某一狀態(tài)需要在多個組件中共享,方便我們使用并追蹤這些狀態(tài)時使用。 1,vuex的

    2024年02月06日
    瀏覽(17)
  • 網頁爬蟲之WebPack模塊化解密(JS逆向)

    網頁爬蟲之WebPack模塊化解密(JS逆向)

    WebPack打包: webpack是一個基于模塊化的打包(構建)工具, 它把一切都視作模塊。 概念: webpack是 JavaScript 應用程序的模塊打包器,可以把開發(fā)中的所有資源(圖片、js文件、css文件等)都看成模塊,通過loader(加載器)和plugins(插件)對資源進行處理,打包成符合生產環(huán)境部署

    2024年02月02日
    瀏覽(27)
  • ES6之Promise、Class類與模塊化(Modules)

    ES6之Promise、Class類與模塊化(Modules)

    Promise 是 ES6 引入的一種用于 處理異步操作 的對象。 它解決了傳統(tǒng)回調函數(callback)模式中容易出現(xiàn)的 回調地獄 和代碼可讀性差的問題。 Promise 對象有三種狀態(tài): Pending (進行中): 初始化狀態(tài),表示異步操作還在進行中。 Fulfilled (已成功): 表示異步操作執(zhí)行成功,并

    2024年02月10日
    瀏覽(94)
  • JavaScript模塊化

    JavaScript模塊化,讓我們通過一個實際的例子來更好地理解。 假設我們正在開發(fā)一個簡單的購物車應用,需要實現(xiàn)計算商品總價和展示購物車列表的功能。我們可以將這個應用劃分為兩個模塊:`cart.js`和`main.js`。 1. cart.js模塊: ```javascript // cart.js // 定義一個私有變量,用于存

    2024年02月14日
    瀏覽(41)
  • JavaScript中的模塊化編程

    JavaScript是一種強大的編程語言,它可以在瀏覽器中進行客戶端腳本編寫,并且在服務器端也有廣泛的應用。隨著JavaScript應用的增多,JavaScript代碼的復雜度也不斷增加。為了提高代碼的可維護性和重用性,模塊化編程變得越來越重要。本文將討論JavaScript中的模塊化編程,包括

    2024年02月02日
    瀏覽(99)
  • 深入理解JavaScript模塊化開發(fā)

    深入理解JavaScript模塊化開發(fā)

    前言: 隨著JavaScript應用程序的復雜性不斷增加,模塊化開發(fā)成為了一種必備的技術。通過將代碼劃分為模塊,我們可以提高代碼的可維護性、可重用性和可擴展性。在本文中,我們將深入探討JavaScript模塊化開發(fā)的概念、優(yōu)勢和不同的模塊化方案。 模塊化開發(fā)是將一個大型應

    2024年02月08日
    瀏覽(41)
  • JavaScript:模塊化【CommonJS與ES6】

    在 JavaScript 編程中,隨著項目的復雜性增加,代碼的組織和管理變得至關重要。模塊化是一種強大的編程概念,它允許我們將代碼劃分為獨立的模塊,提高了可維護性和可擴展性。本文將詳細介紹 CommonJS 和 ES6 模塊,幫助你理解它們的特點和用法。 1. CommonJS 模塊化 CommonJS 是

    2024年02月13日
    瀏覽(92)
  • 前端10年進化 Node.js、模塊化、CommonJS、AMD、CMD、Webpack、Vue-cli、Electron-vue

    模塊化的概念在軟件開發(fā)領域已經存在很長時間,但在?JavaScript?中的模塊化發(fā)展相對較晚。以下是對您提出的問題的回答: 提出時間:JavaScript?中的模塊化概念相對較早地提出于?CommonJS?規(guī)范。CommonJS?是一種?JavaScript?模塊化規(guī)范,最早在?2009?年由?Ryan?Dahl?和其他社區(qū)成

    2024年02月11日
    瀏覽(25)
  • 什么是模塊化?為什么要進行模塊化開發(fā)?

    模塊化是一種軟件開發(fā)的設計模式,它將一個大型的軟件系統(tǒng)劃分成多個獨立的模塊,每個模塊都有自己的功能和接口,并且能夠與其他模塊獨立地工作。 ?先來一段八股文 模塊化開發(fā)可以帶來以下好處: 提高代碼的復用性:模塊化可以將代碼劃分成可重用的部分,降低代

    2023年04月12日
    瀏覽(32)

覺得文章有用就打賞一下文章作者

支付寶掃一掃打賞

博客贊助

微信掃一掃打賞

請作者喝杯咖啡吧~博客贊助

支付寶掃一掃領取紅包,優(yōu)惠每天領

二維碼1

領取紅包

二維碼2

領紅包