代码之家  ›  专栏  ›  技术社区  ›  Kris Selbekk

如何在使用样式化组件呈现服务器端时注入全局样式

  •  2
  • Kris Selbekk  · 技术社区  · 9 年前

    我无法从 documentation .

    styled-components -但我不知道怎么做。

    以下是我的部分 globalStyles.js

    import { injectGlobal } from 'styled-components';
    
    export default () => injectGlobal`
        @import url('https://fonts.googleapis.com/css?family=Pacifico');
        @import url('https://fonts.googleapis.com/css?family=Open+Sans:300,400');
        html {
            box-sizing: border-box;
        }
        *, *:before, *:after {
            box-sizing: inherit;
        }
    `;
    

    以下是我的通用渲染express处理程序:

    const path = require('path');
    const fs = require('fs');
    
    const React = require('react');
    const { renderToString } = require('react-dom/server');
    const { StaticRouter } = require('react-router-dom');
    const { ServerStyleSheet } = require('styled-components');
    
    const { default: App } = require('../src/containers/App');
    const baseStyles = require('../src/styles'); // How to get this in the global css
    
    const indexFile = fs.readFileSync(path.resolve(__dirname, '..', 'build', 'index.html'), 'utf8');
    
    function universalLoader(req, res) {
        const css = new ServerStyleSheet();
        const context = {};
    
        baseStyles();
    
        // Create the markup from the React application
        const markup = renderToString(
            css.collectStyles(
                <StaticRouter context={context} location={req.url}>
                    <App />
                </StaticRouter>
            )
        );
    
        const html = indexFile
            .replace('{{SSR}}', markup)
            .replace('{{CSS}}', css.getStyleTags());
    
        // Send the response back to the user
        res.send(html);
    };
    
    1 回复  |  直到 9 年前
        1
  •  2
  •   Kris Selbekk    9 年前

    结果是,打电话 baseStyles() (反过来是呼叫 injectGlobal )在我的 <App /> 组成部分 render() 方法解决了问题。:)