gpt4 book ai didi

reactjs - react Helm 服务器端正确设置

转载 作者:行者123 更新时间:2023-12-04 13:45:50 25 4
gpt4 key购买 nike

Helm 现在正在服务器上返回空字符串。我不确定文档是否真的很好地解释了它,现有的问题很少有任何帮助!

问题 -

   `console.log('title', helmet.title.toString());
console.log('meta', helmet.meta.toString());
console.log('link', helmet.link.toString());`

除了记录 <title data-react-helmet="true"></title> 的标题外都是空的

这里存在一个非常相似的问题 - react-helmet outputting empty strings on server-side

但它已经为 SSR 弹出了该应用程序。到目前为止,我还没有这样做,并且不希望只为 react-helmet 做。
其次,我需要从 API 动态调用元标记并填充相同的内容。

我很不清楚这些是如何工作的。这些如何在下面自动获取元和链接?我不需要设置它们吗?

我最终会想要为每条路线添加自定义元标记。但是让我们开始主页至少是 Helm

我按照下面的文档实现:
import React from 'react';
import ReactDOMServer from 'react-dom/server';
import { Provider } from 'react-redux';
import { ConnectedRouter } from 'react-router-redux';
import store from '../../src/store';
import {createMemoryHistory } from 'history';
import { ServerStyleSheet } from 'styled-components';
import Loadable from 'react-loadable';
import manifest from '../../build/asset-manifest.json';
import Helmet from 'react-helmet';
import App from '../../src/containers/app';
const path = require('path');
const fs = require('fs');
const history = createMemoryHistory({
initialEntries: ['/', '/next', '/last'],
initialIndex: 0
});
const modules = [];
const extractAssets = (assets, chunks) => Object.keys(assets)
.filter(asset => chunks.indexOf(asset.replace('.js', '')) > -1)
.map(k => assets[k]);

export default (req, res, next) => {
const filePath = path.resolve(__dirname, '..', '..', 'build', 'index.html');
fs.readFile(filePath, 'utf8', (err, htmlData) => {
if (err) {
console.error('err', err);
return res.status(404).end();
}
const sheet = new ServerStyleSheet();
const body = ReactDOMServer.renderToString(
sheet.collectStyles(<Provider store={store}>
<ConnectedRouter history={history}>
<Loadable.Capture report={m => modules.push(m)}>
<App />
</Loadable.Capture>
</ConnectedRouter>
</Provider>)
);
const helmet = Helmet.renderStatic();
console.log('title', helmet.title.toString());
console.log('meta', helmet.meta.toString());
console.log('link', helmet.link.toString());
const styleTags = sheet.getStyleTags();
const extraChunks = extractAssets(manifest, modules)
.map(c => `<script type="text/javascript" src="/${c}"></script>`);
return res.send(
htmlData.replace(
'<html>',
`<html ${helmet.htmlAttributes.toString()}>`
).replace(
'<head>',
`<head>
${helmet.title.toString()}
${helmet.meta.toString()}
${helmet.link.toString()}
</head>`
).replace(
'</head>',
`${styleTags}</head>`
).replace(
'<div id="root"></div>',
`<div id="root">${body}</div>`
).replace(
'<body>',
`<body ${helmet.bodyAttributes.toString()}>`
).replace(
'</body>',
extraChunks.join('') + '</body>'
)
);
});
};

最佳答案

这里的代码看起来不错。渲染后的 Helmet.renderStatic() 应该为您提供渲染时添加的所有内容。

它在客户端工作吗?如果您在 Chrome 开发工具之类的东西中查看 DOM,您是否看到了标题、元数据标签?
如果不是,则组件中设置数据的代码有问题。

如果它在客户端工作,它会变得更加棘手,并且可能是您组件中加载的 Helm 与您在 SSR 代码中导入的 Helm 不同。例如,如果您将应用程序代码与 webpack 捆绑在一起,就会发生这种情况,但这里似乎并非如此。

关于reactjs - react Helm 服务器端正确设置,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48747425/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com