我想知道机器人(例如Google搜索引擎抓取工具)是否运行客户端JavaScript,因此可以触发ComponentDidMount

我的应用程序有许多配置文件,并通过在配置文件组件的ComponentDidMount中发出POST请求来记录配置文件视图的数量

例如

class Profile extends React.Component {
    componentDidMount() {
      const { params: { id } } = this.props;
        client.post(`/profile/${id}/views`)
         .catch(err => console.log('Error while incrementing view', err));
    }
    ....
}


但是我注意到,我记录的观看次数比Google Analytics(分析)中的页面浏览量大30%。

我的应用程序是服务器端呈现的,并且<meta name="fragment" content="!>中没有<head />

差异可能是由运行客户端javascript并因此运行ComponentDidMount代码的漫游器引起的吗?如果是这样,什么是测量纵断面图的可靠方法?

编辑

我进行了一项实验,以检测机器人并检查它们是否对上述URL执行POST请求。如果是这样,则表示它们正在运行ComponentDidMount

我将以下中间件放入Express服务器中:

app.use((req, res, next) => {
  const ua = req.headers['user-agent'];
  if (isBot(ua)) {
    console.log('BOT DETECTED', req.url, ua);
  } else {
    console.log('not a bot', req.url, ua);
  }
  next();
});


当机器人访问个人资料页面时,日志显示:

BOT DETECTED /profile/1111 Mozilla/5.0 (compatible; Googlebot/2.1; +http://www.google.com/bot.html)


当我以用户身份访问个人资料页面时,日志显示:

not a bot /profile/1111 Mozilla/5.0 (Macintosh; Intel Mac OS X 10_11_2) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/52.0.2743.116 Safari/537.36
not a bot /profile/1111/views/views Mozilla/5.0 (Macintosh; Intel Mac OS X 10_11_2) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/52.0.2743.116 Safari/537.36


因此,看来Google搜寻器没有运行我的componentDidMount代码。

但是,造成差异的原因是什么?可能是Google Analytics(分析)页面浏览量根本不准确吗?

最佳答案

Google搜寻器现在可以阅读javascript,因此您的前端框架和库可以很好地工作。但是,事情并不是真的那么简单。

Google机器人会解析您的动态内容,但是如果您从JavaScript机器人中调用任何API(获取/发布),通常都不会等待它们,因此,如果您的大多数内容是通过API调用来来的,则机器人将不会读取文本。

现在开始使用Google Analytics(分析),是的,google搜寻器会读取componentDidMount()。我建议在API调用开始之前在您的componentDidMount()中首先触发一个事件。

关于javascript - 机器人会在React的ComponentDidMount中运行代码吗?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/39326195/

10-13 00:13