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