私はしばらくの間、Webpack、Sass、およびCSSモジュールを使用してプロジェクトを構築してきました。通常、_.scss
_ファイルでは、次のようなクラスを定義します。
_:local(.button) {
color: white;
}
_
そして、私のReactコンポーネント、render
メソッドでは、スタイルが必要です:
_render = () => {
const styles = require('./MyStyles.scss');
<div className={ styles.button } />
}
_
そして、すべてが世界に適しています。すべてが期待どおりに機能します。
今日、私は CSS Modulesページ を読んでいて、セレクターのどれも私のような:local()
に含まれておらず、さらに以下のようなスタイルをインポートしていることに気付きました。
_import styles from './MyStyles.scss';
_
そして、「すごいよね、インポートされた場所を見るのがもっと簡単だと思った。そして:local()
を使わずに、デフォルトでローカルのものだけを持ちたい」だから私はそれを試してみて、すぐにいくつかの問題にぶつかりました。
1)「 './MyStyles.scss」からスタイルをインポートします。
ReactファイルでESLintを使用しているため、_MyStyles.scss
_には通常意味のあるデフォルトのエクスポートがありませんが、CSSモジュールのページには記載されているというエラーがすぐに表示されます:
CSSモジュールをJSモジュールからインポートする場合、ローカル名からグローバル名へのすべてのマッピングでオブジェクトをエクスポートします。
ですから、当然、スタイルシートのデフォルトのエクスポートが、それらが参照しているオブジェクトであると期待していました。
2)_import { button } from './MyStyles.scss';
_を試しました
これはリンティングをパスしますが、button
は未定義としてログに記録します。
3)スタイルをインポートするrequire
メソッドに戻ると、_:local
_で指定されていないものはすべて未定義になります。
参考のために、私のwebpackローダー( Node-Neat と Node-Bourbon も含む、2つの素晴らしいライブラリ):
_{ test: /.(scss|css)$/, loader: 'style!css?sourceMap&localIdentName=[local]___[hash:base64:5]!resolve-url!sass?outputStyle=expanded&sourceMap&includePaths[]=' + encodeURIComponent(require('node-bourbon').includePaths) +
'&includePaths[]=' + encodeURIComponent(require('node-neat').includePaths[1]) + '&includePaths[]=' + path.resolve(__dirname, '..', 'src/client/') }
_
これに続く私の質問は次のとおりです。
1)SassでCSSモジュールを使用する場合、_:local
_または_:global
_の使用に限定されますか?
2)私はwebpackを使用しているので、それは私のスタイルをrequire
しかできないという意味ですか?
投稿してすぐに、解決策を見つけました。私が非常に混乱していると思った問題は、Webpackの設定にありました。当初、私のローダーは次のように見えました。
_loader: 'style!css?sourceMap&localIdentName=[local]___[hash:base64:5]!resolve-url!sass?outputStyle=expanded&sourceMap
_
これにより、1)require
my Sass、2)_:local
_でスタイルをラップできました。
ただし、CSSローダーにはmodules
オプションがなかったため、次のようになりました。
_loader: 'style!css?modules&sourceMap&localIdentName=[local]___[hash:base64:5]!resolve-url!sass?outputStyle=expanded&sourceMap
_
これで、自分のスタイルをimport
でき、_:local
_でラップする必要はありません(必要に応じてまだ可能だと思いますが)。
これについて最も興味深いと思うのは、modules
オプションがなくても、CSSモジュールのような機能を使用できることです。
編集:
私が気づいたのは、この答えを見た人への将来の警告です。あなたが eslint-plugin-import を使用してjavascriptコードのインポートをリントすると、スタイルのインポート時にエラーがスローされますのような:
_import styles from './MyStyles.scss';
_
cSSモジュールが結果のスタイルオブジェクトをエクスポートする方法のため。つまり、require('./MyStyles.scss')
を実行して警告やエラーをバイパスする必要があります。