Один из способов подойти к этому - отложить рендеринг потомка до момента монтирования родителя. Шаги будут выглядеть следующим образом:
componentDidMount
выполняет стороннюю инициализацию и изменяет флаг в родительском состоянии, вызывая повторную визуализацию родителя Полученный код будет выглядеть примерно так:
import React from "react";
import ReactDOM from "react-dom";
class ThirdPartyLib {
init(elementId) {
console.log(`initializing element: ${elementId}`);
this.element = document.getElementById(elementId);
this.element.style.color = "red";
}
}
class Parent extends React.Component {
constructor(props) {
super(props);
this.state = { initialized: false };
console.log("Parent's constructor");
}
render() {
console.log("rendering Parent");
return (
Parent: {this.props.name}
{this.state.initialized && (
)}
);
}
componentDidMount() {
console.log("Parent is mounted");
const thirdPartyLib = new ThirdPartyLib();
thirdPartyLib.init("parent");
this.setState({ initialized: true, thirdPartyLib });
}
}
class Child extends React.Component {
constructor(props) {
super(props);
console.log(`Child ${this.props.name} constructor`);
console.log(
`Child knows stuff from thirdPartyLib: ${
this.props.thirdPartyLib.element.id
}`
);
}
render() {
console.log(`rendering Child: ${this.props.name}`);
return (
Child: {this.props.name}
ThirdPartyLib element id:
{this.props.thirdPartyLib.element.id}
);
}
componentDidMount() {
console.log(`Child ${this.props.name} is mounted`);
}
}
const rootElement = document.getElementById("root");
ReactDOM.render( , rootElement);
Я был счастлив результаты, предоставленные Browsercaps Океана. Это поддерживает поисковые роботы, которые файлы конфигурации Microsoft не потрудились обнаруживать. Это выровняет синтаксический анализ, какая версия поискового робота находится на Вашем сайте, не, что мне действительно нужен тот уровень детализации.
Вы могли проверить (regex) по Request.UserAgent
.
Peter Bromberg написал хорошую статью о записи Уничтожителя Регистратора и Поискового робота Запроса ASP.NET в ASP.NET.
Вот метод, который он использует в его Logger
класс:
public static bool IsCrawler(HttpRequest request)
{
// set next line to "bool isCrawler = false; to use this to deny certain bots
bool isCrawler = request.Browser.Crawler;
// Microsoft doesn't properly detect several crawlers
if (!isCrawler)
{
// put any additional known crawlers in the Regex below
// you can also use this list to deny certain bots instead, if desired:
// just set bool isCrawler = false; for first line in method
// and only have the ones you want to deny in the following Regex list
Regex regEx = new Regex("Slurp|slurp|ask|Ask|Teoma|teoma");
isCrawler = regEx.Match(request.UserAgent).Success;
}
return isCrawler;
}