webpack css_moduleの構成と使用
6842 ワード
本文は主にwebpack+es 6+reactに基づいてcss module足場の構築についてである.css_からmodule_demoダウンロード関連事例、本稿では4つの可能なシナリオ構成からcssを起動する予定です.module.
css_module
css moduleが最も簡単な場合は、css-loaderでcss module構成を開始するだけです.
webpack css-loader
一般的なプロジェクトにはnormalizeがあります.cssまたはglobal.cssグローバルcssスタイルです.この場合、処理を必要としない場合は、2つのcssの管理方式を構成できます.具体的な使い方は、css_を参照してください.module_demo demo 1の構成.
css_module + less\scss
less、scssエディタと組み合わせる必要がある場合は、css-loaderと同様に、css、lessに関する構成で以下のように設定すればよい.
これで私たちはappのようにlessの機能を使用することができます.less中
しかしcss moduleでは、titleでcomposesを定義するなど、サブセレクタでcomposeを使用することはできません.
次のようなエラーが表示されます.
ERROR in ./node_modules/.0.28.7@css-loader?{"modules":true,"localIdentName":"[name]__[local]-[hash:base64:5]"}!./node_modules/.2.0.8@postcss-loader/lib?{"ident":"postcss"}!./node_modules/.4.0.5@less-loader/dist/cjs.js!./src/components/app.less Module build failed: Error: composition is only allowed when selector is single :local class name not in ":local(.global) :local(.title)"
css moduleの著者はissues/261で「Componentworks differently to mixins.It does not mutates rules,just concatenates.」
css_module + react-css-modules
スタイルごとにstyle.*の形式は面倒で、react-css-modulesを使ってこの問題を解決することができます.例えばapp.js中
react-css-modulesの欠点は、実行時の依存性が必要であり、実行時にclassNameを取得する必要があり、パフォーマンスの損失が大きいことです.比較的大きなプロジェクトでは、大きな遅延が発生します.では、この問題をどのように解決するかは、bable-plugins-react-css-modulesを使用してclassNameをコンパイルフェーズに前置きすることができます.
css_module + bable-plugins-react-css-modules
bable-plugins-react-css-modulesはreact-css-modulesと同じ著者らが開発したツールであり、bable-plugins-react-css-modulesはreact-css-modulesに比べて性能面で大きな向上を遂げた.Bable-plugins-react-css-modulesには2つの構成方式があり、1つはwebpackに構成する.config.js,2は配置する.babelrcでは、本稿ではwebpackに構成する.config.jsで.
まとめ
css moduleは柔軟性、移植しやすいという利点があり、less、scssなど多くのcssコンパイラと組み合わせて使用できます.本文はwebpack css-loaderに依存し、css module、css module+lessscss、css module+react-css-modules、css module+babel-plugin-react-css-modulesの4種類のcss_を構成した.moduleの使い方.
参考文献 CSS Modules入門及びReactにおける実践 CSS Modulesの詳細とReactの実践 CSS Modules in React
css_module
css moduleが最も簡単な場合は、css-loaderでcss module構成を開始するだけです.
webpack css-loader
module: {
rules: [{
test: [/\.js$/, /\.jsx$/, /\.es6$/],
include: [
path.resolve(__dirname, 'src'),
],
use: {
loader: "babel-loader"
},
}, {
test: [/\.css/],
exclude: path.resolve(__dirname, 'src/styles/global'),
use: [
'style-loader',
{
loader: 'css-loader',
options: {
modules: true,
localIdentName: '[name]__[local]-[hash:base64:5]'
}
}
]
}, {
test: [/\.css/],
include: path.resolve(__dirname, 'src/styles/global'),
use: [
'style-loader',
'css-loader'
]
}]
},
一般的なプロジェクトにはnormalizeがあります.cssまたはglobal.cssグローバルcssスタイルです.この場合、処理を必要としない場合は、2つのcssの管理方式を構成できます.具体的な使い方は、css_を参照してください.module_demo demo 1の構成.
css_module + less\scss
less、scssエディタと組み合わせる必要がある場合は、css-loaderと同様に、css、lessに関する構成で以下のように設定すればよい.
...
{
test: [/\.css$/, /\.less$/],
exclude: path.resolve(__dirname, 'src/styles/global'),
use: [
'style-loader',
{
loader: 'css-loader',
options: {
modules: true,
localIdentName: '[name]__[local]-[hash:base64:5]'
}
},
{
loader: 'postcss-loader',
options: {
ident: 'postcss',
plugins: (loader) => [
require('postcss-import')({ root: loader.resourcePath }),
require('postcss-cssnext')(),
require('autoprefixer')(),
require('cssnano')()
]
}
},
'less-loader'
]
}, {
test: [/\.css$/, /\.less$/],
include: path.resolve(__dirname, 'src/styles/global'),
use: [
'style-loader',
'css-loader',
{
loader: 'postcss-loader',
options: {
ident: 'postcss',
plugins: (loader) => [
require('postcss-import')({ root: loader.resourcePath }),
require('postcss-cssnext')(),
require('autoprefixer')(),
require('cssnano')()
]
}
},
'less-loader'
]
}
...
これで私たちはappのようにlessの機能を使用することができます.less中
.global {
text-align: left;
font-size: 20px;
composes: box from "../styles/views/layout.less";
.title {
font-size: 22px;
color: red;
}
.title:before {
content: 'before i come'
}
.title:hover {
font-size: 40px;
}
}
しかしcss moduleでは、titleでcomposesを定義するなど、サブセレクタでcomposeを使用することはできません.
.global {
text-align: left;
font-size: 20px;
composes: box from "../styles/views/layout.less";
.title {
font-size: 22px;
composes: heading from "../styles/views/typography.less";
color: red;
}
.title:before {
content: 'before i come'
}
.title:hover {
font-size: 40px;
}
}
次のようなエラーが表示されます.
ERROR in ./node_modules/.0.28.7@css-loader?{"modules":true,"localIdentName":"[name]__[local]-[hash:base64:5]"}!./node_modules/.2.0.8@postcss-loader/lib?{"ident":"postcss"}!./node_modules/.4.0.5@less-loader/dist/cjs.js!./src/components/app.less Module build failed: Error: composition is only allowed when selector is single :local class name not in ":local(.global) :local(.title)"
css moduleの著者はissues/261で「Componentworks differently to mixins.It does not mutates rules,just concatenates.」
css_module + react-css-modules
スタイルごとにstyle.*の形式は面倒で、react-css-modulesを使ってこの問題を解決することができます.例えばapp.js中
import React, { Component } from 'react';
import ReactDOM from 'react-dom';
import CSSModules from 'react-css-modules';
import { Link } from 'react-router-dom';
import styles from './app.less'
class App extends Component {
constructor(props) {
super(props);
}
render() {
return (
css module test case
{this.props.children}
);
}
}
export default CSSModules(App, styles)
react-css-modulesの欠点は、実行時の依存性が必要であり、実行時にclassNameを取得する必要があり、パフォーマンスの損失が大きいことです.比較的大きなプロジェクトでは、大きな遅延が発生します.では、この問題をどのように解決するかは、bable-plugins-react-css-modulesを使用してclassNameをコンパイルフェーズに前置きすることができます.
css_module + bable-plugins-react-css-modules
bable-plugins-react-css-modulesはreact-css-modulesと同じ著者らが開発したツールであり、bable-plugins-react-css-modulesはreact-css-modulesに比べて性能面で大きな向上を遂げた.Bable-plugins-react-css-modulesには2つの構成方式があり、1つはwebpackに構成する.config.js,2は配置する.babelrcでは、本稿ではwebpackに構成する.config.jsで.
...
{
test: [/\.js$/, /\.jsx$/, /\.es6$/],
include: [
path.resolve(__dirname, 'src'),
],
use: {
loader: "babel-loader",
options: {
cacheDirectory: true,
plugins: [
[ "react-css-modules", {
context: path.resolve(__dirname, "src"),
"generateScopedName": "[path][name]__[local]--[hash:base64:5]"
}]
]
}
},
}
...
まとめ
css moduleは柔軟性、移植しやすいという利点があり、less、scssなど多くのcssコンパイラと組み合わせて使用できます.本文はwebpack css-loaderに依存し、css module、css module+lessscss、css module+react-css-modules、css module+babel-plugin-react-css-modulesの4種類のcss_を構成した.moduleの使い方.
参考文献