机器人 运行 是否在 React 的 ComponentDidMount 中编码?

Do bots run code in React's ComponentDidMount?

我想知道机器人(例如 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%。

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

差异可能是由 运行 客户端 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's(get/post),通常不会等待它们,因此,如果您的大部分内容来自 API 调用,机器人将不会阅读文本。

现在进入 google 分析,是的,componentDidMount() 被 google 爬虫读取。我建议在 API 调用开始之前,首先在 componentDidMount() 中触发一个事件。