2015-12-23 27 views
38

Webpack、Sass、およびCSSモジュールを使ってしばらくの間プロジェクトを構築しています。通常、私.scssファイルで、私のようなクラスを定義します。CSSモジュールとWebpackのサス

render =() => { 
    const styles = require('./MyStyles.scss'); 
    <div className={ styles.button } /> 
} 

、すべてが世界と良いです:

:local(.button) { 
    color: white; 
} 

と私のコンポーネントを反応させるのでは、render方法では、私はスタイルが必要です。すべてが期待どおりに機能します。

は今、今日、私はCSS Modules pageを読んセレクタのどれもが、彼らは同じようなスタイルをインポートしたこと:local()私のような、さらにによって包含されなかったことに気づいた。

import styles from './MyStyles.scss'; 

そして、私はうわーそれははるかに見える」と思いましたそれがインポートされた場所を確認するのは簡単です。:local()を使用しないようにして、デフォルトでローカルにするだけです」だから私はそれを試み、すぐにいくつかの問題に遭遇しました。

1) './MyStyles.scss'からのインポートスタイル。

をインポートする:

私は私のリアクトファイルにESLintを使用しているので、私はすぐに正常に理にかなってデフォルトのエクスポートが、述べられてCSSモジュールのページを持っていないMyStyles.scssというスローされたエラーを取得しますJSモジュールからのCSSモジュールは、ローカル名からグローバル名へのすべてのマッピングを持つオブジェクトをエクスポートします。

だから私は当然、スタイルシートのデフォルトの書き出しも、それらが参照しているオブジェクトであると予想していました。

2)私は、これはリンティング通過するが、未定義としてbuttonログimport { button } from './MyStyles.scss';

を試みました。

3)requireスタイルをインポートする方法に戻すと、:localで指定されていないものはすべて定義されていません。参考のため

、私のWebPACKのローダー(私もNode-NeatNode-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)を使用している場合CSSモジュールをSassで使用する場合は、:localまたは:globalのいずれかに限定しますか?

2)私はwebpackを使用しているので、私はrequire私のスタイルだけことができますか?

+0

'test:/ \。(scss | css)$ /' – zedd45

答えて

40

すぐに転記してから解決策を見つけました。私はかなり混乱していると思っていた問題は、私のWebpack設定にあった。私のサスrequire 1に私に有効

loader: 'style!css?sourceMap&localIdentName=[local]___[hash:base64:5]!resolve-url!sass?outputStyle=expanded&sourceMap 

)及び2):localで私のスタイルをラップ:もともと私のローダはのように見えました。私はまだ私の推測が、今(私は私のスタイルをimportことができると私は:localでそれらをラップする必要はありません

loader: 'style!css?modules&sourceMap&localIdentName=[local]___[hash:base64:5]!resolve-url!sass?outputStyle=expanded&sourceMap 

:それはのように見えたよう

ただし、CSSローダはmodulesオプションがありませんでした私がしたい場合はできます)。

私が最も興味深いのは、modulesオプションがないと、幾分制限はありますが、CSS Modules-esque機能を使用できることです。

EDIT:あなたのjavascriptのコードで輸入をlintのeslint-plugin-importを使用している場合、私は気づいた

何かが、この回答を見て誰に将来の警告は、ですが、それは次のようなスタイルのインポート時にエラーがスローされます:方法が原因のCSSモジュールの

import styles from './MyStyles.scss'; 

は、得られたスタイルオブジェクトをエクスポートします。つまり、警告やエラーを回避するにはrequire('./MyStyles.scss')を実行する必要があります。

+0

eslint-plugin-importを使用すると、次のようにしてワイルドカード( '.')文字をローダーの' test'プロパティでエスケープします。あなたのscssファイルを特に無視してください。下記を参照してください。https://www.npmjs.com/package/eslint-plugin-import#importignore –

関連する問題