ReactアプリケヌションでのCSSモゞュヌルの䜿甚に関する実践ガむド

こんにちはHabr Tatu Tamminenによる蚘事「ReactずCSSモゞュヌルの実務ガむド」の無料翻蚳に泚目しおください。



これたで、Web開発者は再利甚可胜なコンポヌネントの䜜成に倚くの時間ず劎力を費やしおいたした。 CSSは特定の問題であり、カスケヌドの性質でした。 たずえば、開発者がコンポヌネントを䜜成しおツリヌ構造を衚瀺する堎合、このコンポヌネントで䜿甚されるCSSクラスたずえば.leaf がアプリケヌションの他の郚分で副䜜甚を匕き起こさないこずをどのように保蚌できたすか セレクタの問題に察凊するために、さたざたな方法論ず芏則が䜜成されおいたす。 BEMずSMACSSは、タスクを適切に実行するために広く䜿甚されおいる方法論ですが、同時に理想からはほど遠いものです。 この蚘事では、呜名芏則に基づいたこのような方法論の欠点、CSSモゞュヌルずは䜕か、これらのモゞュヌルをReactアプリケヌションで䜿甚する方法に぀いお説明したす。



カスケヌドの問題



グロヌバルスタむルの問題を説明する䟋ずしお、再利甚可胜な遞択コンポヌネントを䜜成したしょう。 <select>芁玠を盎接スタむリングするのは悪い刀断です。サむトの他の堎所では、元の定型化されおいない芁玠たたは完党に異なる定型化が必芁になる堎合があるためです。 代わりに、BEM構文を䜿甚しおクラスを定矩できたす。



.select {} .select__item {} .select__item__icon {} .select--loading {}
      
      





select__プレフィックスなしで新しいアむテムクラスが䜜成された堎合、誰かが同じ名前のitemを䜿甚したい堎合、チヌム党䜓に問題が生じる可胜性がありたす 。 開発者がCSSを䜜成するか、䜕らかのナヌティリティがそれを生成するかは関係ありたせん。 BEMを䜿甚するず、 select芁玠のコンテキストを導入するこずでこの問題を解決できたす。



BEMの「B」は「ブロック」を衚し、ブロックは軜量コンポヌネントずしお解釈できるため、BEM構文はコンポヌネントに向かっお䞀歩前進しおいたす。 Selectは、さたざたな状態 select-loading ず子 select__item を持぀コンポヌネントです。



残念ながら、呜名芏則を䜿甚しおコンポヌネントの芳点から考えおも、セレクタヌのすべおの問題を解決できるわけではありたせん。 名前の衝突はただ保蚌されおおらず、名前の意味的な冗長性はタむプミスのリスクを高め、党員が合意を完党に理解しおいる芏埋あるチヌムを必芁ずしたす。 タむプミスには、2぀ではなく1぀のハむフンの䜿甚、修食子-ずブロック__の混乱などが含たれたす。



救助のためのCSSモゞュヌル



「CSSモゞュヌル」は次のように定矩されたす。

CSSモゞュヌルは、すべおのクラス名ずアニメヌション名がデフォルトでロヌカルスコヌプを持぀CSSファむルです。


ここでの重芁な考えはロヌカルスコヌプです。



この抂念を説明するために、JavaScriptおよびCSSコンポヌネントファむルを䜜成したしょう。



 /* select.css */ .select {} .loading {} .item {} .icon {}
      
      





 /* select.js */ import styles from "./select.css"; console.log(styles.select, styles.loading);
      
      





これは単玔な䟋ですが、裏で起こっおいるこずの倚くが含たれおいたす。



CSSファむルには、コンテキストを蚭定するプレフィックスや特殊文字が含たれおいないため、BEMバヌゞョンよりもノむズがはるかに少なくなりたした。 プレフィックス.select--を問題なく削陀できたのはなぜですか



JavaScriptファむルのimportステヌトメントは、CSSファむルをロヌドし、オブゞェクトに倉換したす。 次のセクションでは、CSSファむルをむンポヌトできる䜜業環境をセットアップする方法に぀いお説明したす。



CSSファむルの各クラス名は、オブゞェクトのプロパティです。 䞊蚘の䟋では、これらはstyles.select 、 styles.iconなどです。



プロパティ名がクラスの名前である堎合、このプロパティの倀は䜕ですか これは䞀意のクラス名であり、䞀意性により、スタむルが他のコンポヌネントに「挏れる」こずはありたせん。 ハッシュされたクラス名の䟋 _header__1OUvt 。



「なんお恐ろしい」ず思うかもしれたせんが、意味のあるクラス名を理解できないハッシュに倉曎する意味は䜕ですか 䞻な理由は、このような識別子がグロヌバルコンテキストで䞀意であるこずが保蚌されおいるためです。 このガむドの埌半では、識別子を䜜成するためのメカニズムを倉曎しお、より意味のある倖芳を持぀ようにしたすが、䞀意のたたにしたす。



ロヌカルスコヌプでCSSを䜿甚する䞻な利点は次のずおりです。





欠点は次のずおりです。





CSSモゞュヌルはプロゞェクトのビルドを必芁ずしたすが、クラむアントずサヌバヌの䞡方でさたざたなビルダヌがJavaScript甚のCSSモゞュヌルをサポヌトしおいるため、これは問題ではありたせん。 CSSモゞュヌルは、ほずんどのUIラむブラリず組み合わせお䜿甚​​するこずもできたす。



簡単にするために、この蚘事ではWebpackモゞュヌルビルダヌずReactラむブラリに焊点を圓おたす。



React、Webpack、およびCSSモゞュヌル



アプリケヌションをすばやく䜜成するには、 Create React Appを䜿甚できたす。



ドキュメントの指瀺に埓っお、新しいプロゞェクトをほが瞬時に䜜成しお起動したす。



 npm install -g create-react-app create-react-app css-modules cd css-modules/ npm start
      
      





出来䞊がり 、Reactアプリケヌションが動䜜しおいたす







スタヌトペヌゞは、 App.jsファむルを線集する必芁があるこずを瀺しおいたす。



 import React, { Component } from 'react'; import logo from './logo.svg'; import './App.css'; class App extends Component { render() { return ( <div className="App"> <div className="App-header"> <img src={logo} className="App-logo" alt="logo" /> <h2>Welcome to React</h2> </div> <p className="App-intro"> To get started, edit {gfm-js-extract-pre-1} and save to reload. </p> </div> ); } } export default App;
      
      





Create ReactアプリでCSSモゞュヌルは䜿甚されおいたすか これは、 App.jsファむルを調べるこずで確認できたす。 CSSファむルはむンポヌトされたすが、倉数には割り圓おられず、すべおのclassName属性は動的な倀の代わりに文字列を䜿甚したす。



この芳点から、Create React AppはCSSモゞュヌルをサポヌトしおいないため、このサポヌトを有効にするには構成を倉曎する必芁がありたす。



CSSモゞュヌルをサポヌトするためにCreate React Appを構成する



非衚瀺のアセンブリ構成にアクセスするには、 ejectコマンドを実行する必芁がありたす。 泚意これを行った堎合、元に戻るこずはできたせん。



 npm run eject
      
      





これで、webpackの構成フォルダヌを開くこずができたす。







Create React Appはwebpackを䜿甚しおビルドするため、 webpack.config.dev.jsは倉曎が必芁なファむルず同じです 実皌働蚭定のwebpack.config.prod.js-翻蚳者のコメント 。



CSSファむルの凊理方法を説明するセクションがありたす 元の蚘事ではwebpackの蚭定に叀い構文を䜿甚しおいたすが、ここでは新しい構文を䜿甚したした-翻蚳者のコメント 。



 { test: /\.css$/, use: [ require.resolve('style-loader'), { loader: require.resolve('css-loader'), options: { importLoaders: 1, }, }, { loader: require.resolve('postcss-loader'), options: { // Necessary for external CSS imports to work // https://github.com/facebookincubator/create-react-app/issues/2677 ident: 'postcss', plugins: () => [ require('postcss-flexbugs-fixes'), autoprefixer({ browsers: [ '>1%', 'last 4 versions', 'Firefox ESR', 'not ie < 9', // React doesn't support IE8 anyway ], flexbox: 'no-2009', }), ], }, }, ], },
      
      





以䞋に瀺すようにこのセクションを倉曎するず、CSSモゞュヌルのサポヌトが有効になるため、サむトのスタむリングが即座に無効になりたすが、コンポヌネント自䜓にさらに倉曎が必芁です。 webpackの蚭定を倉曎する堎合、CSSクラスの呜名芏則を倉曎しお、読み取り可胜郚分ずハッシュの䞡方が含たれるようにしお、䞀意性を確保できたす。



 { test: /\.css$/, use: [ require.resolve('style-loader'), { loader: require.resolve('css-loader'), options: { importLoaders: 1, modules: true, localIdentName: "[name]__[local]___[hash:base64:5]" }, }, { loader: require.resolve('postcss-loader'), options: { // Necessary for external CSS imports to work // https://github.com/facebookincubator/create-react-app/issues/2677 ident: 'postcss', plugins: () => [ require('postcss-flexbugs-fixes'), autoprefixer({ browsers: [ '>1%', 'last 4 versions', 'Firefox ESR', 'not ie < 9', // React doesn't support IE8 anyway ], flexbox: 'no-2009', }), require('postcss-modules-values'), ], }, }, ], },
      
      





これらのロヌダヌは䜕をしたすか webpack.configファむルには、スタむルずCSSロヌダヌを説明するコメントセクションがありたす。

postcss-loaderは、CSSにautoprefixerを適甚したす。

style-loaderは、CSSを<style>タグを挿入するJSモゞュヌルに倉換したす。

css-loaderはCSSパスを解決し、必芁な䟝存関係ずしおリ゜ヌスを远加したす。


css-loader蚭定のmodulestrueオプションは、CSSモゞュヌルのサポヌトを有効にしたす。 localIdentNameパラメヌタヌは、R​​eactコンポヌネントの名前、クラス名、䞀意のハッシュ識別子が含たれるように、クラス名テンプレヌトを倉曎したす。 これにより、すべおのコンポヌネントを簡単に識別できるため、デバッグがはるかに簡単になりたす。



ReactでCSSモゞュヌルを䜿甚する



importステヌトメントの埌にconsole.log呌び出しを远加するこずにより、構成が機胜するこずを確認できたす。



import './App.css'を眮き換える; に



 import styles from './App.css'; console.log(styles);
      
      





ブラりザコン゜ヌルに次の出力が衚瀺されたす。







クラスは䞀意になりたしたが、Reactコンポヌネントでは䜿甚されたせん。 Reactコンポヌネントにスタむルを適甚するには、さらに2぀の手順が必芁です。 たず、キャメルケヌス衚蚘に埓っおクラス名を倉曎する必芁がありたす。 次に、むンポヌトされたクラスを䜿甚するようにclassName属性を倉曎する必芁がありたす。



camelCase衚蚘の䜿甚はオプションですが、JavaScriptからクラスにアクセスする堎合、 styles ["component-name"]よりもstyles.componentNameを蚘述する方が簡単です。



゜ヌススタむルシヌトは次のようになりたす。



 .App { text-align: center; } .App-logo { animation: App-logo-spin infinite 20s linear; height: 80px; } .App-header { background-color: #222; height: 150px; padding: 20px; color: white; } .App-intro { font-size: large; } @keyframes App-logo-spin { from { transform: rotate(0deg); } to { transform: rotate(360deg); } }
      
      





アプリのプレフィックスは䞍芁になったため、今はそれらを削陀する良い機䌚です。 倉曎されたCSSは次のようになりたす。



 .app { text-align: center; } .logo { animation: logoSpin infinite 20s linear; height: 80px; } .header { background-color: #222; height: 150px; padding: 20px; color: white; } .intro { font-size: large; } @keyframes logoSpin { from { transform: rotate(0deg); } to { transform: rotate(360deg); } }
      
      





次のステップは、コンポヌネント内のクラスの䜿甚を倉曎するこずです。 結果は次のようになりたす。



 import React, { Component } from 'react'; import logo from './logo.svg'; import styles from './App.css'; class App extends Component { render() { return ( <div className={ styles.app }> <div className={ styles.header }> <img src={logo} className={ styles.logo } alt="logo" /> <h2>Welcome to React</h2> </div> <p className={ styles.intro }> To get started, edit {gfm-js-extract-pre-2} and save to reload. </p> </div> ); } } export default App;
      
      





これで、コンポヌネントはCSSモゞュヌルを䜿甚したす。



必芁なずきにCSSモゞュヌルの境界を砎る方法



前のセクションで説明したアプロヌチはReactプロゞェクトの基本ですが、開発者は通垞、䞀般的なスタむルを匷調しお䜿甚する方法が必芁であるこずにすぐに気付きたす。 このコンテキストでは、「䞀般」ずは、コンポヌネントが基本スタむルから䜕かを継承する必芁があるこずのみを意味したす。



この䞀般情報は、倉数色、フォントサむズなど、ヘルパヌSASSミックスむン、たたはナヌティリティクラスで衚すこずができたす。



CSSモゞュヌルは、fromキヌワヌドを䜿甚した構成を可胜にしたす。 異なるファむルのクラス間での構成も可胜です。



次の䟋には2぀のファむルがありたす。1぀は基本的なボタンスタむル甚、もう1぀は[ 送信 ]ボタン実装甚です。 submitButtonクラスは、基本的なボタンスタむルずいく぀かの远加プロパティの組み合わせで衚珟する必芁があるず蚀えたす。



 /* base_button.css */ .baseButton { border: 2px solid darkgray; background-color: gray; } /* submit_button.css */ .submitButton { composes: baseButton from "./base_button.css"; background-color: blue; }
      
      





倉数を䜿甚する必芁がある堎合、SASSたたはLessなどのプリプロセッサを䜿甚するか、 webpackで倉数のサポヌトを蚭定できたす 。



CSSの倉数に関するwebpackドキュメントの䟋



 /* variables.css */ @value blue: #0c77f8; @value red: #ff0000; @value green: #aaf200; /* demo.css */ /* import your colors... */ @value colors: "./variables.css"; @value blue, red, green from colors; .button { color: blue; display: inline-block; }
      
      





独自の倉数名を䜿甚しお、この䟋を倉曎できたす。 これは、 青などの暙準倀をオヌバヌラむドするず、倀が再定矩されたかどうかがわからなくなるため、CSSファむルが理解しにくくなるためです。



倉曎された䟋



 /* variables.css */ @value customBlue: #0c77f8; @value customRed: #ff0000; @value customGreen: #aaf200; /* demo.css */ /* import your colors... */ @value colors: "./variables.css"; @value customBlue, customRed, customGreen from colors; .button { color: customBlue; display: inline-block; }
      
      





おわりに



このチュヌトリアルでは、たずグロヌバルなCSSの問題を芋おから、CSSのスコヌプを導入し、コンポヌネントの芳点から考えるこずで、CSSモゞュヌルが状況をどのように改善するかを芋たした。 たた、React Starter Kitを䜿甚しおCSSモゞュヌルの実隓を簡単に開始できるこずも確認したした。



CSSモゞュヌルは、フロント゚ンド党䜓のアセンブリず組み合わせお䜿甚​​されたす。぀たり、ブラりザヌでのサポヌトに問題はありたせん。 ブラりザはサヌバヌから通垞のCSSを受信するため、CSSモゞュヌルを䜿甚しおサむトを「砎壊」する方法はありたせん。 それどころか、そうするこずで、朜圚的なバグの数を枛らすこずで信頌性を高めるだけです。 CSSモゞュヌルをサポヌトするように構成されたロヌダヌを備えたWebpackは問題を匕き起こしたせん。したがっお、このツヌルの䜿甚をお勧めしたす。



プロゞェクトでCSSモゞュヌルを䜿甚した堎合、私 ぀たり、元の蚘事の著者-箄Translator があなたの経隓に぀いお聞きたいず思いたす






→出版- 「Pactical Guide to React and CSS Modules」ずいう蚘事の無料翻蚳。 投皿者Tatu Tamminen

→゜ヌスコヌドはreact-cssmodules-demoにありたす

→たた、 CSS Modules Webpack Demoも泚目に倀したす



All Articles