2017-08-22 10 views
2

レスキューヘルメットを使用しています。クライアントでは、検査ウィンドウですべてが良好で、タグが正しく出力されています。しかし、私がプロダクションで起動し、タグのSSRキックがソースに表示されず、エラーがまったく表示されません。サーバ側で空文字列を出力するレスキューヘルメット

私も「文字列化」タイトルタグをログに記録しようとした得た:

<title data-react-helmet="true"></title> 

をここではいくつかのコードです:

これは私がからタグを設定していたページ構成要素の一つであり、 3ページのコンポーネントはすべてこれと同じように設定されています。 (私は、彼らは非常に大きく、私はこれらが故障していないと確信しているように、コンポーネントが機能し、データオブジェクトをレンダリングする単純化してきました。)

import React, { Component } from 'react'; 
import { connect } from 'react-redux'; 
import PropTypes from 'prop-types'; 
import { Link } from 'react-router-dom'; 
import { Helmet } from 'react-helmet'; 

// Components 
import WorkGrid from 'universal/components/Grid'; 
import Wrapper from 'universal/components/Wrapper'; 
import Container from 'universal/components/Container'; 
import Hero from 'universal/components/Hero'; 
import PageWrapper from 'universal/components/PageWrapper'; 
import GridHeader from 'universal/components/GridHeader'; 

const data = {}; 

class Work extends PageComponent { 

    render() { 
    return (
     <PageWrapper ref="root"> 
     <Helmet> 
      <title>Work</title> 
      <meta name="description" content="Work Description" /> 
     </Helmet> 
     <h1>Work Page</h1> 
     </PageWrapper> 
    ); 
    } 
} 

export default connect(state => ({ 
    theme: state.ui.theme 
}), { changeTheme }, null, { withRef: true })(Work); 

これはサーバコードの一部をある、SSRが行く、具体的場所私はHelmet.renderStatic()を呼び出しています。

// Node Modules 
import fs from 'fs'; 
import {basename, join} from 'path'; 

// Libraries 
import React from 'react'; 
import {StaticRouter} from 'react-router'; 
import {renderToString} from 'react-dom/server'; 

// styled-components 
import { ServerStyleSheet, ThemeProvider } from 'styled-components'; 
import { theme } from '../universal/constants'; 

// Redux 
// import {push} from 'react-router-redux'; 
import createStore from 'data/redux/createStore.js'; 
import createHistory from 'history/createMemoryHistory'; 
import { Provider } from 'react-redux'; 

// Third Party Scripts 
import * as thirdPartyScripts from './thirdPartyScripts.js'; 

// Helmet 
import {Helmet} from 'react-helmet'; 

function renderApp(url, res, store, assets) { 
    const PROD = process.env.NODE_ENV === 'production'; 
    const context = {}; 

    const { 
    manifest, 
    app, 
    vendor 
    } = assets || {}; 

    let state = store.getState(); 

    const stylesheet = new ServerStyleSheet(); 

    const initialState = `window.__INITIAL_STATE__ = ${JSON.stringify(state)}`; 
    const Layout = PROD ? require('../../build/prerender.js') :() => {}; 

    const root = PROD && renderToString(
    stylesheet.collectStyles(
     <Provider store={store}> 
     <ThemeProvider theme={theme}> 
      <StaticRouter location={url} context={context}> 
      <Layout /> 
      </StaticRouter> 
     </ThemeProvider> 
     </Provider> 
    ) 
); 

    const styleTags = stylesheet.getStyleTags(); 

    const seo = Helmet.renderStatic(); 

    console.log(seo.title.toString()); 

    const html = `<!DOCTYPE html> 
    <html lang="en"> 
    <head> 
     <meta charset="UTF-8"> 
     <meta name="viewport" content="width=device-width, initial-scale=1"> 

     ${seo.title.toString()} 
     ${seo.meta.toString()} 
     ${seo.link.toString()} 

     <link rel="shortcut icon" href="/favicon.ico"> 
     <link rel="icon" sizes="16x16 32x32 64x64" href="/favicon.ico"> 
     <link rel="apple-touch-icon" href="/favicon-57.png"> 
     <link rel="apple-touch-icon" sizes="114x114" href="/favicon-114.png"> 
     <link rel="apple-touch-icon" sizes="72x72" href="/favicon-72.png"> 
     <link rel="apple-touch-icon" sizes="144x144" href="/favicon-144.png"> 
     <link rel="apple-touch-icon" sizes="60x60" href="/favicon-60.png"> 
     <link rel="apple-touch-icon" sizes="120x120" href="/favicon-120.png"> 
     <link rel="apple-touch-icon" sizes="76x76" href="/favicon-76.png"> 
     <link rel="apple-touch-icon" sizes="152x152" href="/favicon-152.png"> 
     <link rel="apple-touch-icon" sizes="180x180" href="/favicon-180.png"> 
     <meta name="msapplication-TileColor" content="#FFFFFF"> 
     <meta name="msapplication-TileImage" content="/favicon-144.png"> 
     <meta name="msapplication-config" content="/browserconfig.xml"> 

     ${ styleTags } 

     ${PROD ? '<link rel="stylesheet" href="/static/prerender.css" type="text/css" />' : ''} 

     <link href="${thirdPartyScripts.googleFont}" rel="stylesheet" type="text/css"> 

     <script>${thirdPartyScripts.googleAnalytics}</script> 
    </head> 

    <body> 
     <script>${initialState}</script> 
     ${PROD ? `<div id="root">${root}</div>` : '<div id="root"></div>'} 

     ${PROD ? `<script>${manifest.text}</script>` : ''} 

     <script>${thirdPartyScripts.facebookPixel}</script> 

     <script async src="${thirdPartyScripts.googleAnalyticsSrc}"></script> 
     ${PROD ? `<script src="${vendor.js}"></script>` : ''} 
     <script src="${PROD ? app.js : './static/app.js'}"></script> 
    </body> 
    </html>`; 

    res.send(html); 
} 

また、私はReact Router v4を使用しています。

答えて

0

私は他の週にこれに対する解決策を見つけたし、私もこれを更新することが考えられ、それは誰にもこの問題を持つことができますので...

グッドニュースは、それは驚くほど簡単だったです!

私にとっては、とにかく、クライアントとサーバーのwebpackバンドルを分けることになってしまいました。それで、慣れ親しんだ言葉では、クライアント側のコードでmetaタグを保持するすべての状態がサーバ上の.rewind()呼び出しに存在しなかったことを意味し、それは反応ヘルメットをクライアントに2回、

ちょうどあなたのサーバーのWebPACKの設定ファイルに以下を追加

externals: ['react-helmet']

関連する問題