react-helmet的目的是什么?

72

我创建了一个服务器端的React应用程序,它会返回如下所示的HTML:

const html = renderToString(<App />);
<html>
  <head>
    <meta name="viewport" content="width=device-width, initial-scale=1.0, maximum-scale=1.0">
    <title>A Cool Page</title>
    <link rel="stylesheet" href="${ROOT}/static/index.css">
  </head>
  <body>
    <div id="root">${html}</div>
    <script src="${ROOT}/client-bundle.js"></script>
  </body>
</html>

我看到很多人都在使用react-helmet来管理标签中的内容。我想知道使用它的好处是什么,因为我可以直接像上面展示的那样包含它。


1
你如何在运行时更改它的内容呢? - azium
你的意思是更改头部的内容吗?在什么情况下我想要更改内容?你是指在服务器端,我可能希望头部的内容与客户端不同吗?@azium - PBandJen
12
也许你不太理解在这种情况下React是如何工作的:当用户第一次访问真实的URL时,您的服务器将发送一个包含加载应用程序的脚本的真实页面。一旦应用程序加载完毕,您的服务器将_不会_再被调用,并且任何加载“另一个页面”的东西肯定不会出现:React(如果正确配置)使用像React-Router这样的库,通过历史API让用户看起来像他们正在从一个URL切换到另一个URL,通过helmet更新<title>,但是您的用户实际上从未离开过第一页。 - Mike 'Pomax' Kamermans
5
阅读了原问题的所有答案后,我仍然不理解。大多数答案似乎都提到了 SSR。但如果我不关心 SSR 呢? - joedotnot
6个回答

70

使用 react-helmet 的一个重要优点是当你在树中有多个带有 <head> 标签的组件,并且这些组件带有相同属性/值的 <meta> 标签时。

例如,如果在你的首页组件中有:

const html = renderToString(<App />);
<html>
  <head>
    <meta name="viewport" content="width=device-width, initial-scale=1.0, maximum-scale=1.0">
    <meta name="description" content="This is the index page description"> 
    <title>A Cool Index Page</title>
  </head>
</html>

但是在一个叶子页面组件上,您还有一个包含标签的<head>标签:

<html>
  <head>
    <meta name="description" name="This is the unique leaf page description"> 
    <title>A Cool Leaf Page</title>
    <link rel="stylesheet" href="${ROOT}/static/index.css">
  </head>
</html>

请注意,在我们的两个页面组件之间,有两个具有相同属性值name="description"的meta标签。你可能会认为这会导致重复,但是react-helmet解决了这个问题。

如果有人进入叶子页面,react-helmet会覆盖索引/站点级别的描述meta标签,并呈现较低级别的标签,即专门针对叶子页面的标签。

它还将包含viewport meta标签,因为它不需要被覆盖。

由于react-helmet,在叶子页面上,<head>将如下所示:

<html>
  <head>
    <meta name="viewport" content="width=device-width, initial-scale=1.0, maximum-scale=1.0">
    <meta name="description" name="This is the unique leaf page description"> 
    <title>A Cool Leaf Page</title>
    <link rel="stylesheet" href="${ROOT}/static/index.css">
  </head>
</html>

2
如果应用程序不使用服务器端渲染,那么元标签对爬虫来说就没有什么用处了?还是有用的? - Akber Iqbal
@AkberIqbal 不,大多数网络爬虫不会等待JavaScript设置元标记或完全呈现页面,除了一些流行的爬虫如Google等。 - Tero
3
@AkberIqbal 谷歌、必应、雅虎和DuckDuckGo都会等待JavaScript渲染,但在像Facebook、Twitter和Reddit这样的社交平台上,它们不支持JavaScript渲染,需要通过解决方法来处理。 - Pooya Estakhri
相同的问题,谷歌是否能够检查href中存在的JavaScript以及其他属性? - Rohan Devaki

24

react-helmet 允许设置元标签,这些元标签将被搜索引擎和社交媒体爬虫读取。这使得服务器端渲染和 React Helmet 成为创造既适合 SEO 又适合社交媒体的应用程序的动态二人组。

例如:

import { Helmet } from 'react-helmet';

<Helmet>
    <title>Turbo Todo</title>
    <meta name="description" content="test on react-helmet" />
    <meta name="theme-color" content="#ccc" />
</Helmet>

我们可以使用这些元标签来描述我们路由上的不同内容吗? - Goran_Ilic_Ilke
1
它不会显示在查看源代码页面上。 - user18628737

8

两种方法都可以实现。但是使用react-helmet,head标签也被视为组件,更符合React的编程思想。而且,虽然不常见,你也可以将一些props或states与元数据绑定,实现动态头部。其中一个应用场景就是在不同语言之间切换。


4

React Helmet 还可以让你在渲染函数的范围之外修改类名。

例如,如果你想动态地修改你的 <body> 标签,你可以按照以下方式进行:

<Helmet>
    <body className="dynamic-class-for-body-on-this-view" />
</Helmet>

1
它不会显示在查看源代码页面上。 - user18628737

4

React Helmet是一个可重复使用的React组件,它将管理所有对文档头部的更改。

例如,如果您想根据您的SEO要求更改每个页面的标题和元描述,您可以执行以下操作:

<Helmet>
    <title>Your Title</title>
    <meta name="description" content="Description of your page" />
</Helmet>

1
将以下与程序相关的内容从英语翻译为中文。仅返回已翻译的文本:它不显示在查看源代码页面上。 - user18628737

0

我专门使用Helmet来处理元标签,并更改第三方组件的样式,因为该组件无法编辑。

        <Helmet>
          <script type="text/javascript">
            {`
            window.addEventListener('load', function () {
                    document.querySelectorAll('.noEditStars > span').forEach(span => {
                    span.style.cursor = 'pointer';
                });
            }, false);
            `}
          </script>
        </Helmet>

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接