Reactjs 同构React应用程序中的SCSS编译
我正在基于以下内容编写一个同构React应用程序: 虽然我不想使用示例中使用的css模块,但我想使用SCS。出于某种原因,我很难让他们工作。我的第一步是从服务器和客户端删除Reactjs 同构React应用程序中的SCSS编译,reactjs,sass,webpack,isomorphic-javascript,webpack-style-loader,Reactjs,Sass,Webpack,Isomorphic Javascript,Webpack Style Loader,我正在基于以下内容编写一个同构React应用程序: 虽然我不想使用示例中使用的css模块,但我想使用SCS。出于某种原因,我很难让他们工作。我的第一步是从服务器和客户端删除csswebpack加载程序,用scss特定加载程序替换它们(以及删除postsss): 但这会抛出ReferenceError:当构建为样式加载器显然不适合服务器端渲染时,未定义窗口。所以我的下一个想法是使用。据我所知,要使其正常工作,我需要用他们的高阶组件和样式来装饰我的组件: import React, { PropT
css
webpack加载程序,用scss
特定加载程序替换它们(以及删除postsss
):
但这会抛出ReferenceError:当构建为样式加载器显然不适合服务器端渲染时,未定义窗口。所以我的下一个想法是使用。据我所知,要使其正常工作,我需要用他们的高阶组件和样式来装饰我的组件
:
import React, { PropTypes } from 'react';
import classNames from 'classnames';
import withStyles from 'isomorphic-style-loader/lib/withStyles';
import s from '../assets/scss/common/index.scss';
const App = (props, context) => (
<div className={classNames('app')}>
<h1 className="home_header">Welcome!</h1>
{props.children}
</div>
);
export default withStyles(s)(App);
但是我仍然得到了警告:失败的上下文类型:“WithStyles(App)”中没有指定必需的上下文“insertCss”。
有什么办法解决这个问题吗?更重要的是,难道没有更简单的方法吗?这似乎需要做很多额外的工作。在进行服务器端渲染时,有几个部分需要使用webpack处理SCS编译。首先,您不希望节点尝试将.scss
文件导入组件
因此,在网页包配置中设置一个全局变量WEBPACK:true
:
plugins: [
new webpack.DefinePlugin({
'process.env': {
WEBPACK: JSON.stringify(true),
}
})
],
在您的组件中,仅当webpack正在处理组件时(在构建或开发期间),才尝试导入.scss
文件:
如果每个组件只有一个Sass文件(您应该这样做),那么这始终只是一行。如果需要,可以在index.scss
中导入任何其他Sass文件
然后在配置中,您可能仍然需要css加载器,因此对于您的开发服务器,它应该是这样的:
{
test: /\.s?css$/,
loaders: ['style', 'css', 'sass']
},
对于您的构建配置,类似于以下内容:
{
test: /\.s?css$/,
loader: ExtractTextPlugin.extract('style', 'css!sass')
},
酷,这一个有效。但是我觉得我正在失去这个同构加载程序的一些优点,因为它应该只加载所需的最小css。在我的组件中使用这个webpack插件变量也不是有史以来最干净的解决方案,但现在我想我不得不接受它。
if (process.env.WEBPACK) require('../assets/scss/common/index.scss');
{
test: /\.s?css$/,
loaders: ['style', 'css', 'sass']
},
{
test: /\.s?css$/,
loader: ExtractTextPlugin.extract('style', 'css!sass')
},