ExtractTextPlugin を使用して sass から単一の css ファイルを生成し、webpack ローダーを介したインポートを介して reactjs アプリ内で使用できるように webpack を構成しました。
sass ファイルの使用は、react コンポーネントの import ステートメントによって検出され、出力ファイルが生成されますが、生成される main.css ファイルは空であり、インポートは空のスタイル オブジェクトを返します。間違っている?
構造
client
- app
- components
- navbar
Navbar.js
navbar.scss
- public
- styles
main.scss
bundle.js
index.html
Webpack 構成
const webpack = require('webpack');
const path = require('path');
const HtmlWebpackPlugin = require('html-webpack-plugin');
const ExtractTextPlugin = require('extract-text-webpack-plugin');
const BUILD_DIR = path.resolve(__dirname, 'public');
const APP_DIR = path.resolve(__dirname, 'app');
const config = {
entry: APP_DIR + '/index.js',
output: {
path: BUILD_DIR,
filename: 'bundle.js'
},
externals: {
'cheerio': 'window',
'react/lib/ExecutionEnvironment': true,
'react/lib/ReactContext': true,
},
module : {
loaders : [
{
test : /\.jsx?/,
include : APP_DIR,
loader : 'babel'
},
{
test: /\.scss$/,
include : APP_DIR,
loader: ExtractTextPlugin.extract('css!sass')
}
]
},
plugins: [
new HtmlWebpackPlugin({
title: 'My App'
}),
new ExtractTextPlugin('styles/main.css', {
allChunks: true
})
]
};
module.exports = config;
navbar.scss
.navbar {
display: flex;
.navbarBrand {
}
}
Navbar.js
import React, { Component, PropTypes } from 'react'
import classnames from 'classnames'
import Login from '../login/Login'
import Logout from '../logout/Logout'
import styles from './navbar.scss';
export default class Navbar extends Component {
render() {
const { isAuthenticated, errors, onLogin, onLogout } = this.props;
console.log(styles);
const navBarStyles = classnames(styles.navbar);
const navBarBrandStyles = classnames(styles.navbarBrand);
return (
<nav className={navBarStyles}>
<div className='container-fluid'>
<a className={navBarBrandStyles} href="#">User Management App</a>
<div className='navbar-form'>
{!isAuthenticated &&
<Login
errors={errors}
onLoginClick={ (creds) => onLogin(creds) }
/>
}
{isAuthenticated &&
<Logout onLogoutClick={() => onLogout()} />
}
</div>
</div>
</nav>
)
}
}
Navbar.propTypes = {
isAuthenticated: PropTypes.bool.isRequired,
errors: PropTypes.arrayOf(PropTypes.string),
onLogin: PropTypes.func.isRequired,
onLogout: PropTypes.func.isRequired
};
症状
ローダーとインポート(もはや問題ではありません。以下の回答を参照してください)
console.log(styles) = オブジェクト {}
styles.navbar = 未定義
プラグイン
- public/styles/main.css が空です(もはや問題ではありません。以下の回答を参照してください)
質問
- Narbar.js にスタイルをインポートするときに、スタイルが空のオブジェクトになるのはなぜですか? 何を間違って設定しましたか? (私は解決策を見つけ、回答セクションで以下の回答を提供しました)
- public/style/main.css が空なのはなぜですか? (私は解決策を見つけ、回答セクションで以下の回答を提供しました)