机器人 运行 是否在 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()
中触发一个事件。
我想知道机器人(例如 Google 搜索引擎抓取工具)是否 运行 客户端 JavaScript 因此可以触发 ComponentDidMount
.
我的应用程序有很多配置文件,并且通过在配置文件组件的 ComponentDidMount
例如
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()
中触发一个事件。