react-helmet-async教程及实例

4,525 阅读3分钟

React Helmet是一个npm库,提供react组件来改变和更新反应页面中html的head标签内的标签值。

Head是title、meta、script、link、noscript和style标签的父标签,所以你可以动态地改变或设置这些标签的值。

本教程包括一个基本的react-helmet包,如何动态地改变文档头部的值,它在服务器端渲染时对SEO有什么作用。

为什么需要它,它的优点是什么?

在Index.html中,你可以设置基本的头部子项,如下所示

public/index.html


 <head>
    <meta charset="utf-8" />
    <link rel="icon" href="%PUBLIC_URL%/favicon.ico" />
    <meta name="viewport" content="width=device-width, initial-scale=1" />
    <meta name="theme-color" content="#000000" />
    <meta name="description" content="react descript" />
    <link rel="apple-touch-icon" href="%PUBLIC_URL%/logo192.png" />
    <title>React title</title>
</head>

这是你的反应页面的主要组件。你创建的任何组件都将作为主组件的子组件被渲染,即App.js。

你可以用头盔组件动态地覆盖父组件和子组件的值。

它有助于覆盖和动态更新head标签内的子元素,这对单页应用程序中的每一个页面的爬行者来说都非常有用。

一些重要的功能

  • 可以改变所有标签--标题、元、脚本、链接、非脚本和样式标签。
  • 它很容易集成到服务器端和客户端的渲染中。

安装方法

首先,用npm或yarn命令安装库到现有的react应用中。

yarn add react-helmet
npm install react-helmet

使用 react-helmet 例子改变 html head childers

Helmet是一个可以动态改变文档头部属性值的组件。

import React, { Component } from 'react';
import { Helmet } from 'react-helmet';

class AddingScriptExample extends Component {


     render() {
        return (
            <div className="application">
                <Helmet>
                    <base />
                    <title>React helmet example</title>
                    <meta name="description" content="React helment is useful for seo for dynamically changing head information" />
                    <link rel="canonical" href="somelink" />

                    <script type="text/javascript">
                        alert('react component script');
                    </script>
                </Helmet>
            ...
            </div>
        );
    }
}
export default AddingScriptExample;

你可以在你的网页的视图源选项中检查这些元标签。react-helmet npm example link,title,meta adding

以下是可以用Helmet组件动态改变的属性

base - 页面的基本路径 meta - 网页的元数据信息,这些可以有属性类型robots,description,keywords link - 添加外部样式 script - 这可以添加内联脚本和外部javascript文件。

注意:如果有任何动态覆盖标签值的问题,请尝试在helemet组件内的标签上添加data-react-helmet=true

如何加载内联和外部脚本标签

如果你想给react组件添加自定义的JavaScript,你可以添加以下一行代码。

在头盔组件内定义type="text/javascript "的脚本标签。

<helmet>
 <script type="text/javascript">
        alert('react component script');
</script>
</helmet>

添加自定义脚本的URL,我们可以用脚本URL的语法来做[这里]

我们可以使用PureComponent而不是Component,因为不需要改变状态或道具,并对标量值和对象引用进行浅层比较,从而提高加载组件的性能。

import React from 'react'
import { Helmet } from 'react-helmet'

class DocumentTitle extends React.PureComponent {
    render() {
        return (
            <>
                <Helmet>
                    <title>About us</title>
                </Helmet>

            </>
        )
    }
}
export default DocumentTitle;

react-helmet-async例子

helmet组件是同步的,在客户端渲染时工作得很好。

它在服务器端导致了一个问题,即在流化组件时忽略了 react 的副作用。

react-helmet-async需要提供者在react应用中捕获DOM树上的头盔组件状态。

异步使用和头盔组件一样,希望通过在HelmetProvider 组件内添加组件。

你也可以在服务器端渲染中使用renderToString ,以便更好地使用。

import Helmet, { HelmetProvider } from "react-helmet-async";


class HelmentAsyncExample extends Component {
    render() {
        return (

            <HelmetProvider>
                <div >
                    <Helmet>
                        <title>React Helmet Asyc example</title>
                        <link rel="canonical" href="https://www.url.com/" />
                        <meta keywords=" seo keywords" />
                        <meta description=" website description" />

                    </Helmet>
                </div>
            </HelmetProvider>
        )
    }
}
export default HelmentAsyncExample;

服务器端渲染的例子

在服务器端,调用**Helmet.renderStatic()**方法,在预渲染过程中获得文档头标签值。

这里是组件的示例代码。

import React from 'react';
import { renderToString } from 'react-dom/server';
import express from 'express';
import App from './src/App';
import { Helmet } from 'react-helmet';
const expressServer = express();


expressServer.get('/*', (req, res) => {
    const appRender = renderToString();
    const helmet = Helmet.renderStatic();

    res.send(stringHtml(appRender, helmet));
});

expressServer.listen(4000);

function stringHtml(appStr, helmet) {
    return `
    <!doctype html>
    <html ${helmet.htmlAttributes.toString()}>
        <head>
            ${helmet.title.toString()}
            ${helmet.meta.toString()}
            ${helmet.link.toString()}
        </head>
        <body ${helmet.bodyAttributes.toString()}>
            <div id="container">
              // react component code can be added
            </div>
        </body>
    </html>
  `
}

优点

  • 在单页应用中动态添加标签,提高每个页面的搜索引擎优化。
  • 帮助爬虫和搜索引擎机器人理解页面
  • 如果在反应树组件中有多个不同值的元标签,子组件会覆盖父组件。