Добавить тег сценария ld + json в React на стороне клиента

В настоящее время я создаю приложение React. Поскольку это SPA, у него есть единственный файл index.html. Я хочу добавить 2 тега «ld + json» script, то есть для обзоров и закладок для определенного маршрута.

Я вставил тег script в componentDidMount этого компонента, но инструмент проверки структурированных данных Google этого не читает.

Это потому, что Google читает напрямую из index.html и поскольку мои теги script связаны внутри main.js, он не может его прочитать?

Можно ли это сделать в React на стороне клиента? Является ли рендеринг на стороне сервера единственно возможным способом сделать это?

-- Детальное объяснение--- В настоящее время я хочу реализовать систему, подобную IMDB, то есть всякий раз, когда мы ищем фильм в goole; результат поиска IMDB покажет рейтинг фильма на самой странице Google. Для этого мне нужно поместить скрипт в мой файл index.html.

<script type='application/ld+json'>
  {
      "@context": "http://schema.org/",
      "@type": "Review",
      "itemReviewed": {
        "@type": "Thing",
        "name": "Name"
      },
      "reviewRating": {
        "@type": "Rating",
        "ratingValue": "3",
        "bestRating": "5"
      },
      "publisher": {
        "@type": "Organization",
        "name": "1234"
      }
    }
</script>

Поскольку мое приложение является SPA, я не могу поместить его в свой основной файл index.html.

Мой текущий подход: Предположим, что маршрут «/ movies / inception» отображает компонент «MovieDetail». Итак, сейчас я добавляю сценарий в конец этого компонента.

import React from 'react';
import JsonLd from '../path_to_JSONLD';

class MovieDetail extends React.Component {
 render(){
 let data = {
  "@context": "http://schema.org/",
  "@type": "Review",
  "itemReviewed": {
    "@type": "Thing",
    "name": "Name"
   },
    "reviewRating": {
     "@type": "Rating",
     "ratingValue": "3",
     "bestRating": "5"
    },
   "publisher": {
     "@type": "Organization",
     "name": "1234"
    }
  }
   return(
    <SOME COMPOENTS />
    <JsonLd data = {data} />

 )
}

Мой компонент JsonLd

import React from 'react';

const JsonLd = ({ data }) =>
  <script
    type = "application/ld+json"
    dangerouslySetInnerHTML = {{ __html: JSON.stringify(data) }}
  />;

  export default JsonLd;

Итак, когда я проверяю компонент; я вижу динамически добавляемый тег скрипта. Но в инструменте проверки структуры «https://search.google.com/structured-data/testing-tool». После проверки схема не отображается. Следовательно, я спросил, можно ли это сделать на стороне клиента или SSR - единственное решение для этого, где я могу дать обновленный index.html в качестве ответа.

Надеюсь, это устраняет путаницу. Спасибо!

Ваш вопрос непонятен, по крайней мере, для меня, а также отсутствует код. Пожалуйста, прочтите stackoverflow.com/help/how-to-ask, а затем вернитесь, отредактируйте свой вопрос / опубликуйте новый, и мы постараемся помочь.

Ionut 29.05.2018 15:29

Я почти уверен, что это зависит от того, как именно вы вставляете теги на свою страницу. Не зная, что мы будем гадать. Также было бы интересно узнать, работают ли они, когда вы добавляете их непосредственно в index.html.

Tim Seguine 29.05.2018 15:32

Обновил код. Надеюсь, это устраняет путаницу. Спасибо! @ Тим Сегин

Ashish Shetty 29.05.2018 15:55

К сожалению, я не эксперт в этой теме, но похоже, что другие люди также динамически внедряют их в DOM, поэтому, надеюсь, кто-то с большим опытом здесь может помочь.

Tim Seguine 29.05.2018 16:13
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
В настоящее время производительность загрузки веб-сайта имеет решающее значение не только для удобства пользователей, но и для ранжирования в...
Безумие обратных вызовов в javascript [JS]
Безумие обратных вызовов в javascript [JS]
Здравствуйте! Юный падаван 🚀. Присоединяйся ко мне, чтобы разобраться в одной из самых запутанных концепций, когда вы начинаете изучать мир...
Система управления парковками с использованием HTML, CSS и JavaScript
Система управления парковками с использованием HTML, CSS и JavaScript
Веб-сайт по управлению парковками был создан с использованием HTML, CSS и JavaScript. Это простой сайт, ничего вычурного. Основная цель -...
JavaScript Вопросы с множественным выбором и ответы
JavaScript Вопросы с множественным выбором и ответы
Если вы ищете платформу, которая предоставляет вам бесплатный тест JavaScript MCQ (Multiple Choice Questions With Answers) для оценки ваших знаний,...
20
4
13 032
4
Перейти к ответу Данный вопрос помечен как решенный

Ответы 4

Ответ принят как подходящий

Решение: Использованы "react-meta-tags" Ссылка: https://github.com/s-yadav/react-meta-tags

import React from 'react';
import MetaTags from 'react-meta-tags';
import JsonLd from 'path_to_jsonld';


export default class MetaComponent extends React.Component {
  render() {
   return (
    <div className = "wrapper">
      <MetaTags>
        <title>{this.props.title}</title>
        <meta property = "og:type" content = "website" />
        <meta name = "description" content = {this.props.description} />
        <meta name = "og:description" content = {this.props.description} />
        <meta property = "og:title" content = {this.props.title} />
        <meta property = "og:url" content = {window.location.href} />
        <meta property = "og:site_name" content = {"content"} 
         />
        {
          this.props.jsonLd && 
            <JsonLd data = {this.props.jsonLd} />
        }
      </MetaTags>
    </div>
  )
 }
}

Затем я импортировал этот компонент в свой основной компонент.

import React from 'react';
import MetaComponent from '../path_to_Metacomponent';

class MovieDetail extends React.Component {
 render(){
let data = {
  "@context": "http://schema.org/",
  "@type": "Review",
  "itemReviewed": {
    "@type": "Thing",
    "name": "Name"
    },
"reviewRating": {
    "@type": "Rating",
    "ratingValue": "3",
    "bestRating": "5"
   },
 "publisher": {
   "@type": "Organization",
   "name": "1234"
  }
}
   return(
    <SOME COMPOENTS />
    <MetaComponent jsonLd = {data} title = {"abcd"} description = {"xyza"} />

 )
}

Что делает пакет, так это динамически вставляет тег сценария в тег заголовка, и, поскольку сценарий теперь не связан внутри файла main.js, Google может прочитать его из источника.

Я понимаю, но немного неполно, что находится в path_to_Metacomponent, вы возвращаете там тег скрипта?

Azad Hussain 07.08.2020 10:05

Первый фрагмент кода, то есть я создал компонент с именем MetaComponent, чтобы его можно было использовать повторно, и импортировал его в компонент MovieDetail (второй фрагмент кода). ./path_to_Metacomponent просто указывает путь к метакомпоненту. Это оно

Ashish Shetty 07.08.2020 10:09

У меня хорошо работает Реагировать шлем.

<Helmet>
    <script className='structured-data-list' type = "application/ld+json">{structuredJSON}</script>
</Helmet> 

Где structuredJSON - это что-то вроде результата такой функции:

export const structuredDataSingle = (prod, imgPath, availability) => {

    let data = {
        "@context": "http://schema.org/",
        "@type": "Product",
        "name": `${prod.title}`,
        "image": prod.images.map((item) => imgPath + item),
        "description": prod['description'],
        "url": location.href,
        "offers": {
            "@type": "Offer",
            "priceCurrency": `${prod['currency'] || "₴"}`,
            "price": prod['price'] ? `${parseFloat(prod['price'])}` : 0,
            "availability": `${availability}`,
            "seller": {
                "@type": "Organization",
                "name": "TopMotoPro"
            }
        }
    };

    // brand
    if (prod['brand']) {
        data['mpn'] = prod['brand'];
        data['brand'] = {
            "@type": "Thing",
            "name": `${prod['brand']}`
        };
    }

    // logo
    if (prod['logo']){
        data['logo'] = imgPath + prod['logo'];
    }

    return JSON.stringify(data);
};

Может быть, это глупый вопрос, но где разместить этот объект structuredDataSingle и где вы разместите его с помощью <Helmet>? Элемент <Helmet> находится ниже return на типичной странице React? Почему в structuredDataSingle есть операторы if? Я думал, что структурированные данные - это просто статические данные контента для SEO.

Ant 29.12.2019 02:21

1) У меня MyHelmet как компонент-оболочка. Он получает structdataSingle как опору. Если пропал - рендер <script type = "application/ld+json">{structuredJSON}</script> внутри Helmet; 2) Добавлены операторы If, потому что на разных страницах могут быть опущены некоторые необязательные реквизиты химической организации.

Дмитрий Дорогонов 30.12.2019 11:26

это не работает со мной. Не показывать на локальном хосте или производстве

huykon225 18.01.2021 02:52

Как предлагает @ Дмитрий Дорогонов, вы можете использовать Реагировать шлем для встраивания элементов скрипта. Вы также можете включить их в строку и использовать интерполяцию переменных:

<script type = "application/ld+json">{`
  {
    "@context": "http://schema.org",
    "@type": "${typeVariable}"
  }
`}</script>

Вы можете просто сделать это опасно

<script type='application/ld+json' dangerouslySetInnerHTML = { { __html: `{ "@context": "http://schema.org", "@type": "LocalBusiness", ... }`}} />

Другие вопросы по теме