我正在使用 Fluxible 帮助在一个新项目上创建一个同构应用程序,并且它运行良好。到目前为止我喜欢它。不过,我遇到了减速带,想知道如何克服它。
到目前为止,这是我的 Header 组件:
import React from 'react'
import Nav from '../Nav/Nav'
import classNames from 'classnames'
if (process.env.BROWSER) var styles = require('./Header.css')
class Header extends React.Component {
render() {
// Header classes
var theClasses = process.env.BROWSER ? classNames({
[styles.Header]: true
}) : ''
return (
<header className={theClasses}>
<Nav selected={this.props.selected} links={this.props.links} />
</header>
)
}
}
export default Header
你会看到我process.env.BROWSER
用来检测我在哪个 ENV 上。如果我们在客户端,我需要 CSS。如果我们在服务器上,我会跳过它。这非常有效。
问题出现在文件的后面,我theClasses
根据Header.css
文件的内容构建对象,然后在 Header 上使用这些类,如下所示:
<header className={theClasses}>
<Nav selected={this.props.selected} links={this.props.links} />
</header>
问题是因为我没有在服务器上加载 css,theClasses
最终为空,并且为客户端呈现的内容最终与服务器上的内容不同。React 显示此警告:
警告:React 尝试在容器中重用标记,但校验和无效。这通常意味着您正在使用服务器渲染,并且在服务器上生成的标记不是客户端所期望的。React 注入了新的标记来补偿哪些工作,但是您已经失去了服务器渲染的许多好处。相反,找出为什么生成的标记在客户端或服务器上是不同的:
(client) n28"><header class="Header--Header_ip_OK
(server) n28"><header class="" data-reactid=".2ei
你会建议什么来解决这个问题?
2015 年 9 月 24 日更新
最初的问题是我无法在服务器端编译 CSS,所以我开始像这样检查 BROWSER:
if (process.env.BROWSER) var styles = require('./Application.css')
如果我删除该if (process.env.BROWSER)
位,我会收到此错误:
SyntaxError: src/components/Application/Application.css: Unexpected token (2:0)
1 |
> 2 | @import 'styles/index.css';
| ^
3 |
在以下简单的 CSS 文件中:
@import 'styles/index.css';
.Application {
box-shadow: 0 0 0 1px var(--medium-gray);
box-sizing: border-box;
lost-center: 1080px 32px;
}
我用Fluxible Yo Generator开始了这个项目,它在这里提供了两个 Webpack 配置文件:https ://github.com/yahoo/generator-fluxible/tree/master/app/templates
我用一些装载机更新了我的:
var webpack = require('webpack');
var path = require('path');
module.exports = {
resolve: {
extensions: ['', '.js', '.jsx']
},
entry: [
'webpack-dev-server/client?http://localhost:3000',
'webpack/hot/only-dev-server',
'./client.js'
],
output: {
path: path.resolve('./build/js'),
publicPath: '/public/js/',
filename: 'main.js'
},
module: {
loaders: [
{
test: /\.(js|jsx)$/,
exclude: /node_modules/,
loaders: [
require.resolve('react-hot-loader'),
require.resolve('babel-loader')
]
}, {
test: /\.css$/,
loader: 'style-loader!css-loader?modules&localIdentName=[name]__[local]_[hash:base64:5]!postcss-loader'
}, {
test: /\.(png|jpg|svg)$/,
loader: 'url?limit=25000'
}, {
test: /\.json$/,
loader: 'json-loader'
}
]
},
postcss: function () {
return [
require('lost'),
require('postcss-import')({
path: ['./src/'],
onImport: function (files) {
files.forEach(this.addDependency);
}.bind(this)
}),
require('postcss-mixins'),
require('postcss-custom-properties'),
require('autoprefixer')({
browsers: ['last 3 versions']
})
];
},
node: {
setImmediate: false
},
plugins: [
new webpack.IgnorePlugin(/^\.\/locale$/, /moment$/),
new webpack.HotModuleReplacementPlugin(),
new webpack.NoErrorsPlugin(),
new webpack.DefinePlugin({
'process.env': {
NODE_ENV: JSON.stringify(process.env.NODE_ENV),
BROWSER: JSON.stringify(true)
}
})
],
devtool: 'eval'
};
所以这就是我所在的地方……不知道如何在服务器端编译 CSS。感谢我能得到的任何帮助。