react-helmet流星服务器端渲染

时间:2019-01-08 20:55:35

标签: reactjs meteor react-redux react-router react-helmet

我想在Meteor上实现react-helmet。 客户端工作正常,我可以在Inspect元素上看到标签-但是如何在服务器端呈现SEO?我不了解文档。

ReactDOMServer.renderToString(<Handler />);
const helmet = Helmet.renderStatic();

我的代码如下

index.html(客户端)

<head>
   <body>
     <div id="target" />
   </body>
</head>

main.js(客户端)

import React from 'react';
import { Meteor } from 'meteor/meteor';
import { render } from 'react-dom';
import { renderRoutes } from '../imports/startup/client/routes.jsx'

Meteor.startup(() => {
  render(renderRoutes(), document.getElementById('target'));
});

我正在使用React-Router将元素呈现给“目标”

main.js(服务器)

如何从服务器获取标签。

import { onPageLoad } from 'meteor/server-render';  
Meteor.startup(() => {

  onPageLoad((sink) => {  

    const helmet = Helmet.renderStatic();
    sink.appendToHead(helmet.meta.toString());
    sink.appendToHead(helmet.title.toString());
  });

});

关于代码helmet.meta.toString()返回空。我知道我们需要传递一些信息来让头盔知道meta标签。但是该怎么做

有人可以帮助我了解我需要在服务器上写些什么才能使它正常工作吗?除此之外一切正常。

1 个答案:

答案 0 :(得分:1)

最后我找到了解决方法:

main.js(服务器)上的代码应为以下

import ReactDOMServer from 'react-dom/server';
import { StaticRouter } from 'react-router-dom';
import  {renderRoutes}  from '../imports/startup/both/routes.jsx'

// ...

onPageLoad((sink) => {  
    const context = {};
    const app = ReactDOMServer.renderToString(
      <StaticRouter location={sink.request.url} context={context}>
        {renderRoutes()}
      </StaticRouter>
   );

    sink.renderIntoElementById('react-root', app);
    const helmet = Helmet.renderStatic();
    sink.appendToHead(helmet.meta.toString());
    sink.appendToHead(helmet.title.toString());
  });

希望它对将来可能遇到相同问题的人有所帮助。 :)