【发布时间】:2016-02-14 20:13:50
【问题描述】:
我的目标是将 CSS 渲染到服务器端的样式标记中,或者与 style-loader 插件在客户端的操作方式完全相同。我知道这是不可能的,因为style-loader 直接写入 DOM,而 Node.js 中不存在 DOM。
目前我正在使用 ExtractTextPlugin,但是如果我没有将所有 CSS 编译到一个大文件中,那么当页面加载时它会丢失一些样式,除非我在服务器上运行 Webpack 而不是直接编译它.
我有这段代码渲染页面:
server.jsx
const renderedContent = renderToString(
<Provider store={store} history={history}>
<RoutingContext {...renderProps} />
</Provider>
)
const finalState = store.getState()
const renderedPage = renderFullPage(renderedContent, finalState)
render-full-page.jsx
module.exports = function renderFullPage(renderedContent = undefined, state = {}) {
return '<!DOCTYPE html>' + renderToStaticMarkup(
<html lang="en">
<head>
<meta charSet="utf-8" />
<meta name="viewport" content="width=device-width, initial-scale=1" />
{typeof __production !== 'undefined' && __production === true && <link id="css" rel="stylesheet" href="/main.css" />}
</head>
<body>
<div id="root"><div dangerouslySetInnerHTML={{__html: renderedContent}}></div></div>
<script dangerouslySetInnerHTML={{__html: 'window.__INITIAL_STATE__ =' + JSON.stringify(state)}} />
<script src="/bundle.js"></script>
</body>
</html>
)
}
当我在我的 React 模块中需要样式时,我正在全局导入样式,如下所示:
import './../../assets/styl/flex-video'
我想更改加载 CSS 的方式,将所有 CSS 放入一个 var 中,我可以循环并输出 <style> 标签,就像 style-loader 这样做的方式一样:
{typeof __production !== 'undefined' && __production === true && cssFiles.map((styles) => {
<style>{styles}</style>
})}
这在 Webpack 中可行吗?有没有像isomorphic-style-loader 这样的插件可以做到这一点?如果是这样,我将如何修改我的代码?
【问题讨论】:
标签: reactjs webpack server-side react-jsx isomorphic-style-loader