机器人在React的ComponentDidMount中运行代码吗?

时间:2016-09-05 08:03:56

标签: javascript reactjs google-analytics google-search

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

我的应用程序包含许多配置文件,并通过在配置文件组件“ComponentDidMount

中发出POST请求来记录配置文件视图的数量

e.g。

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网页浏览量不准确吗?

1 个答案:

答案 0 :(得分:1)

Google抓取工具现在可以阅读javascript,因此您的前端框架和库工作得非常好。但事情并非那么简单。

Google机器人确实会解析您的动态内容,但是如果您从您的javascript机器人调用任何API(获取/发布)通常不会等待它们,因此如果您的大部分内容是通过API调用而无法读取文本。

现在进入谷歌分析,谷歌抓取工具读取了componentDidMount()。我会建议在API调用开始之前在componentDidMount()中首先触发一个事件。