我想知道机器人(例如Google搜索引擎抓取工具)是否运行客户端JavaScript,因此可以触发ComponentDidMount
。
我的应用程序包含许多配置文件,并通过在配置文件组件“ComponentDidMount
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网页浏览量不准确吗?
答案 0 :(得分:1)
Google抓取工具现在可以阅读javascript,因此您的前端框架和库工作得非常好。但事情并非那么简单。
Google机器人确实会解析您的动态内容,但是如果您从您的javascript机器人调用任何API(获取/发布)通常不会等待它们,因此如果您的大部分内容是通过API调用而无法读取文本。
现在进入谷歌分析,谷歌抓取工具读取了componentDidMount()。我会建议在API调用开始之前在componentDidMount()
中首先触发一个事件。