React CSS Modules

14672 단어
원문 주소:react-css-modules 본문을 읽기 전에 CSS Modules에 대한 지식을 알아보는 것을 권장합니다.벽 균열 추천Cam의 글 읽기 CSS Modules 상세 설명 및 React에서의 실천
React CSS Modules 는 CSS Modules 매핑을 자동화합니다.각 CSS 클래스에는 고유한 글로벌 이름을 가진 로컬 식별자가 지정됩니다.CSS Modules는 모듈식 및 재사용 기능을 제공합니다.
CSS Modules
CSS Mosules 토치카야.만약 당신이 CSS 모듈에 대해 아직 익숙하지 않다면, 괜찮습니다. 웹 패키지 같은 모듈 패키지를 사용하여 CSS가 특정 문서에 작용하는 것을 불러오는 개념일 뿐입니다.CSS module loader는 모든 CSS 클래스가 CSS 문서를 불러올 때 (정확히 말하면 이 문서가 Interoperable CSS) 유일한 이름을 생성합니다.이 CSS Modules 실천 예인 웹팩데모를 보십시오.
React 구문 환경에서 CSS Modules는 다음과 같이 보입니다.
import React from 'react';
import styles from './table.css';

export default class Table extends React.Component {
    render () {
        return 
A0
B0
;

어셈블리가 렌더링되면 다음과 같은 태그가 생성됩니다.
A0
B0

또한 해당 CSS 클래스와 일치하는 CSS 파일을 생성합니다. 토치카 아닙니까?!
webpack css-loader
CSS Modules는 여러 가지 방법으로 구현할 수 있는 사양입니다.react-css-modules 웹팩 css-loader가 제공하는 기능을 이용하여 기존 CSS Modules의 통합을 활성화시켰다.
현존 문제
웹팩의 css-loader 자체는 몇 가지 열세가 있다.
  • 낙타봉식 클래스를 사용해야 합니다.
  • 언제든지 className를 구축할 때 style 대상을 사용해야 합니다.
  • 혼합 클래스 모듈과 글로벌 CSS 클래스는 유연성이 부족합니다.
  • 정의되지 않은 CSS 모듈을 참조할 때 해석된 결과는 undefines이지만 경고 프롬프트가 없습니다.

  • React CSS Modules 구성 요소는 다음과 같은 특성을 적용한 CSS Modules를 자동으로 로드합니다.
    import React from 'react';
    import CSSModules from 'react-css-modules';
    import styles from './table.css';
    
    class Table extends React.Component {
        render () {
            return 
    A0
    B0
    ; } } export default CSSModules(Table, styles);
    styleName를 사용하면 다음과 같은 이점이 있습니다.
  • 낙타봉식 명명 규칙을 강제로 사용하지 않아도 된다
  • 매번 CSS 모듈을 사용할 때마다 react-css-modules 대상을 인용할 필요가 없습니다.
  • 전역 CSS와 CSS 모델 사이에 뚜렷한 차이가 있는데 예는 다음과 같다.
  • styleName 引用一个为定义的 CSS Module 时,你会得到一个警告信息。(errorWhenNotFound 选项)

  • 你可以为每一个 ReactElement 只使用单独的 CSS Module。(allowMultiple 选项)。

  • 实现

    react-css-modules 扩展了目标组件的 render 方法。它将根据 styleName 的值在关联的 style 对象中查找对应的 CSS Modules,并为 ReactElement className 属性值添加相匹配的独一无二的 CSS 类名。

    碉堡了!

    你可以参照下这个例子进一步加深印象,react-css-modules-examples。

    用法

    设置包括:

    • 设置一个 module bundler 加载 Interoperable CSS。
    • 使用 react-css-modules 修整你的组件。

    如何设置一个 module bundler呢?

    webpack

    开发模式

    开发环境下,若你想启用 Sourcemaps,并要使用 webpack 的 Hot Module Replacement (HMR,热替换)。style-loader 已经支持 HMR。因此,Hot Module Replacement 开箱即用。

    设置步骤:

    • 安装 style-loader
    • 安装 css-loader
    • 设置 /\.css$/ 加载器,如下:
    {
        test: /\.css$/,
        loaders: [
            'style?sourceMap',
            'css?modules&importLoaders=1&localIdentName=[path]___[name]__[local]___[hash:base64:5]'
        ]
    }
    
    생산 모델
    생산 환경에서 CSS를 단독으로 추출하려면 이렇게 하는 장점과 단점을 알아야 한다.
    이점:
  • 더 적은 스타일 레이블
  • CSS SourceMap
  • CSS 병렬 요청
  • CSS 캐시 분리
  • 페이지 렌더링 속도(코드 수 및 DOM 작업 감소)
  • 단점:
  • 추가 HTTP 요청
  • 긴 컴파일 시간
  • 복잡한 구성
  • 운영 환경 공용 경로 변경은 지원되지 않음
  • Hot Module Replacement
  • 는 지원되지 않습니다.
    — extract-text-webpack-plugin
    단계를 설정하려면 다음과 같이 하십시오.
  • 설치styles
  • 설치style-loader
  • 사용 css-loader CSS를 단독 스타일시트로 추출합니다.
  • 설정extract-text-webpack-plugin캐리어:
    {
        test: /\.css$/,
        loader: ExtractTextPlugin.extract('style', 'css?modules&importLoaders=1&localIdentName=[name]__[local]___[hash:base64:5]')
    }
    
  • 설정/\.css$/ 플러그인:
    new ExtractTextPlugin('app.css', {
        allChunks: true
    })
    
  • 온전한 실례는 웹팩-demo 또는react-css-modules-examples를 참조하십시오.
    Browserify (이 구축 도구를 사용한다면)
    css-modulesify를 참고하세요.
    확장 어셈블리 스타일extract-text-webpack-plugin 속성을 사용하여 기본 구성 요소 스타일을 다시 씁니다.
    예는 다음과 같습니다.
    import React from 'react';
    import CSSModules from 'react-css-modules';
    import styles from './table.css';
    
    class Table extends React.Component {
        render () {
            return 
    A0
    B0
    ; } } export default CSSModules(Table, styles);

    이 예에서 styles는 구성 요소를 인용CSSModules CSS 모듈을 통해 미화하는 데 사용된다.Table 구성 요소가 렌더링되면 ./table.css 대상의 속성 구축 Table 값을 사용합니다.styles 속성을 사용하면 구성 요소의 기본 className 대상을 덮어쓸 수 있습니다.예를 들면 다음과 같습니다.
    import customStyles from './table-custom-styles.css';
    
    ;
    

    Interoperable CSS ICSS。 , :

    /* table-custom-styles.css */
    .table {
        composes: table from './table.css';
    }
    
    .row {
        composes: row from './table.css';
    }
    
    /* .cell {
        composes: cell from './table.css';
    } */
    
    .table {
        width: 400px;
    }
    
    .cell {
        float: left; width: 154px; background: #eee; padding: 10px; margin: 10px 0 10px 10px;
    }
    
    이 예에서 styles 선택한 확장 styles (table-custom-styles.css 구성 요소의 기본 스타일) 이 있습니다.이것은 더욱 직관적인 실천 예이다: Using Styles Property example.table.css 속성이 포장된 구성 요소는 Table 속성을 계승하고 이 속성은 CSS 모듈과 CSS 클래스 간의 매핑 관계를 설명한다.
    class extends React.Component {
        render () {
            

    ; } }
    위 예에서 stylestyles는 등가이다.styleName='foo' 속성은 className={this.props.styles.foo} 부품 포장을 실현하기 위해 특별히 설계되었습니다!Loops and Child Componentsstyles는 다른 구성 요소에서 생성된 React 요소의 스타일을 정의할 수 없습니다.예를 들어,
    import React from 'react';
    import CSSModules from 'react-css-modules';
    import List from './List';
    import styles from './table.css';
    
    class CustomList extends React.Component {
        render () {
            let itemTemplate;
    
            itemTemplate = (name) => {
                return 
  • {name}
  • ; }; return ; } } export default CSSModules(CustomList, styles);
    위의 인스턴스는 작동하지 않습니다.CSSModules는 구성 요소 포장Loops and Child Components에 사용됩니다.그러나 이것은 styleName 목록 구성 요소입니다.이 문제를 해결하기 위해 포장된 구성 요소는 스타일 속성을 계승하여 일반적인 CSS 모듈 대상으로 사용할 수 있습니다.따라서 앞의 예는 다음과 같이 바꿀 수 있다.
    import React from 'react';
    import CSSModules from 'react-css-modules';
    import List from './List';
    import styles from './table.css';
    
    class CustomList extends React.Component {
        render () {
            let itemTemplate;
    
            itemTemplate = (name) => {
                return 
  • {name}
  • ; }; return ; } } export default CSSModules(CustomList, styles);
    하위 구성 요소를 렌더링 구성 요소에 전달하기 전에 CustomList 이 하위 구성 요소를 포장하면 이 하위 구성 요소에서 itemTemplage 속성을 사용할 수 있다.예를 들어
    import React from 'react';
    import CSSModules from 'react-css-modules';
    import List from './List';
    import styles from './table.css';
    
    class CustomList extends React.Component {
        render () {
            let itemTemplate;
    
            itemTemplate = (name) => {
                return 
  • {name}
  • ; }; itemTemplate = CSSModules(itemTemplate, this.props.styles); return ; } } export default CSSModules(CustomList, styles);
    포장
    /**
     * @typedef CSSModules~Options
     * @see {@link https://github.com/gajus/react-css-modules#options}
     * @property {Boolean} allowMultiple
     * @property {Boolean} errorWhenNotFound
     */
    
    /**
     * @param {Function} Component
     * @param {Object} defaultStyles CSS Modules class map.
     * @param {CSSModules~Options} options
     * @return {Function}
     */
    
    당신은 CSSMmodules으로 당신의 부품을 포장해야 합니다. 예를 들어
    import React from 'react';
    import CSSModules from 'react-css-modules';
    import styles from './table.css';
    
    class Table extends React.Component {
        render () {
            return 
    A0
    B0
    ; } } export default CSSModules(Table, styles);
    이렇게 간단합니다!말 그대로 styleName와 ES7 decorators 문법이 호환된다.예를 들어
    import React from 'react';
    import CSSModules from 'react-css-modules';
    import styles from './table.css';
    
    @CSSModules(styles)
    export default class extends React.Component {
        render () {
            return 
    A0
    B0
    ; } }
    그야말로 토치카다!웹팩으로 구축된 예시가 있습니다.react-css-modules-examples Optionsreact-css-modules 함수에서 세 번째 인자의 위치에 옵션을 제공했습니다.
    CSSModules(Component, styles, options);
    
    또는 두 번째 인자로:
    @CSSModules(styles, options);
    
    react-css-modules 기본값: CSSModules.여러 스타일 모듈의 이름을 허용합니다.allowMultiple, 다음은 오류를 일으킬 수 있습니다.

    errorWhenNotFound

    true
    styleName CSS Module 。

    SASS, SCSS, LESS CSS

    Interoperable CSS CSS 。 , loaders 。 webpack , sass-loader!sass style-loader ( ):

    {
        test: /\.scss$/,
        loaders: [
            'style',
            'css?modules&importLoaders=1&localIdentName=[path]___[name]__[local]___[hash:base64:5]',
            'resolve-url',
            'sass'
        ]
    }
    
    Sourcemaps를 열고 CSS Sourcemaps를 열려면 falsefalse에 파라미터css-loader
    {
        test: /\.scss$/,
        loaders: [
            'style?sourceMap',
            'css?modules&importLoaders=1&localIdentName=[path]___[name]__[local]___[hash:base64:5]',
            'resolve-url',
            'sass?sourceMap'
        ]
    }
    
    를 추가해야 한다. 클래스 조합 CSS Mosules는 클래스 조합 모드를 추진한다. 즉, 구성 요소에 사용되는 모든 CSS 모듈은 하나의 요소에 필요한 모든 속성을 정의해야 한다.예를 들어
    .box {
        width: 100px;
        height: 100px;
    }
    
    .empty {
        composes: box;
    
        background: #4CAF50;
    }
    
    .full {
        composes: box;
    
        background: #F44336;
    }
    
    클래스 조합은 표기와 의미화 양식의 더욱 좋은 분리를 추진했고 CSS 모델스가 없으면 이 점은 실현하기 어렵다.CSS 모듈의 클래스 이름은 로컬이기 때문에'empty'나'full'같은 일반적인 클래스를 사용할 수 있습니다.'box-'접두사를 붙이지 않아도 됩니다. 완벽합니다!!더 많은 조합 규칙을 배우고 싶다고요?Glen Maddern의 CSS Modules에 관한 글과 공식 문서 spec of the CSS Modules를 읽어보시기 바랍니다.클래스 그룹은 어떤 문제를 해결했습니까?생각해 보면 다음과 같은 예가 있다.
    .box {
        width: 100px;
        height: 100px;
    }
    
    .box-empty {
        background: #4CAF50;
    }
    
    .box-full {
        background: #F44336;
    }
    

    OOCSS , , , HTML。

    CSS

    , 。CSS Modules , CSS Mosules composes 。CSS 。

    SCSS @extend , Mixin Directives , :

    @extend :

    %box {
        width: 100px;
        height: 100px;
    }
    
    .box-empty {
        @extend %box;
    
        background: #4CAF50;
    }
    
    .box-full {
        @extend %box;
    
        background: #F44336;
    }
    
    를 컴파일한 후에 다음과 같다.
    .box-empty,
    .box-full {
        width: 100px;
        height: 100px;
    }
    
    .box-empty {
        background: #4CAF50;
    }
    
    .box-full {
        background: #F44336;
    }
    
    mixins:
    @mixin box {
        width: 100px;
        height: 100px;
    }
    
    .box-empty {
        @include box;
    
        background: #4CAF50;
    }
    
    .box-full {
        @include box;
    
        background: #F44336;
    }
    
    를 컴파일한 후에 다음과 같다.
    .box-empty {
        width: 100px;
        height: 100px;
        background: #4CAF50;
    }
    
    .box-full {
        width: 100px;
        height: 100px;
        background: #F44336;
    }
    
    전역 스타일 CSS Modules는 전역 CSS 사용을 제한하지 않는다.용법은 다음과 같다.
    :global .foo {
    
    }
    
    그러나 전체적인 스타일을 조심스럽게 사용하세요.CSS Modules를 사용하는 동안 전역 스타일(예: normalization)은 소수의 경우에만 사용됩니다.여러 CSS Modules에서는 여러 CSS Modules를 사용하여 개별 요소를 설명하지 않습니다.본 문서 앞의 클래스 조합 부분에 대한 설명을 보십시오.그러나 굳이 여러 개의 CSS 모듈을 사용해서 원소를 설명하려면 sass-loader 옵션을 켜십시오.(문서의 앞 옵션 섹션 참조).여러 개의 CSS 모듈이 하나의 요소를 설명하는 데 사용될 때 sourceMap, allowMultiple 성명에 일치하는 모든 CSS 모듈에 유일무이한 클래스 이름을 추가합니다.예:
    
    .button {
    
    }
    
    .active {
    
    }
    
    

    Interoperable CSS CSS class 。

    좋은 웹페이지 즐겨찾기