私はreact、react-router、express、webpackを使って同形アプリを構築しています。今、私はCSSをインポートするためにCSSモジュールを使用したいと思います。React isomorphic appのwebpackでCSSモジュールを使用するには?
index.jsx
でimport './index.css'
を使用していますが、クライアントで問題なく動作しますが、サーバーレンダリングでは機能しません。エラーはError: Cannot find module './index.css'
です。
コンポーネント/ index.jsx
import React, {Component, PropTypes} from 'react';
import style from './index.css';
class App extends Component {
constructor(props, context) {
super(props, context);
}
render() {
return (
<div id="login">
// ...
</div>
);
}
};
export default App;
サーバ/ルータ/ index.js
webpack.config.dev.js
import url from 'url';
import express from 'express';
import swig from 'swig';
import React from 'react';
import {renderToString} from 'react-dom/server';
import {match, RouterContext} from 'react-router';
import routes from '../../client/routes/routes';
import DataWrapper from '../../client/container/DataWrapper';
import data from '../module/data';
const router = express.Router();
router.get('*', async(req, res) => {
match({
routes,
location: req.url
}, async(error, redirectLocation, props) => {
if (error) {
res.status(500).send(error.message);
} else if (redirectLocation) {
res.status(302).redirect(redirectLocation.pathname + redirectLocation.search);
} else if (props) {
let content = renderToString(
<DataWrapper data={data}><RouterContext {...props}/></DataWrapper>
);
let html = swig.renderFile('views/index.html', {
content,
env: process.env.NODE_ENV
});
res.status(200).send(html);
} else {
res.status(404).send('Not found');
}
});
});
export default router;
(WebPACKの-DEV-サーバ用)
var webpack = require('webpack');
var config = require('./config');
module.exports = {
devtool: 'inline-source-map',
entry: [
'webpack-dev-server/client?http://localhost:' + config.webpackPort,
'webpack/hot/only-dev-server',
'./src/client/entry',
],
output: {
path: __dirname + '/public/js',
filename: 'app.js',
publicPath: 'http://localhost:' + config.webpackPort + '/public/js',
},
plugins: [
new webpack.HotModuleReplacementPlugin(),
new webpack.NoErrorsPlugin(),
new webpack.DefinePlugin({
"process.env": {
NODE_ENV: JSON.stringify('development')
}
})
],
resolve: {
extensions: ['', '.js', '.jsx', '.css']
},
module: {
loaders: [{
test: /\.jsx?$/,
loader: 'react-hot',
exclude: /node_modules/
}, {
test: /\.jsx?$/,
loader: 'babel-loader',
exclude: /node_modules/
}, {
test: /\.css$/,
loader: 'style-loader!css-loader?modules',
exclude: /node_modules/
}, {
test: /\.(png|woff|woff2|svg|ttf|eot)$/,
loader: 'url-loader',
exclude: /node_modules/
}]
}
}
Webpackの場合、[Isomorphic CSS style loader](https://github.com/kriasoft/isomorphic-style-loader)を使用して、サーバーサイドレンダリング中にクリティカルパスCSSをレンダリングしています。 – HiDeo
@HiDeo反応ルータを使用していますか?多分私にデモを見せることができますか?私はこのローダーを試しましたが、私はサーバー側のコードをどのように処理するのか分かりません。 –
はい、多くのサンプル/スターターがあります。例えば、[Isact Isomorphic Starterkit](https://github.com/RickWong/react-isomorphic-starterkit)では 'isomorphic-style-loader'、' react-router'を使用しますサーバー側リアクションレンダリング。 – HiDeo