我刚刚使用reactjs编写了我的第一个网站,但是当我查看google如何看待我的网站时,我收到以下结果:
我的HTML文件如下所示:
<!DOCTYPE html>
<html>
<head>
<title>MySite</title>
</head>
<body>
<div id="root"></div>
<script async type="text/javascript" src="index.browser.js"></script>
</body>
</html>
我已停用所有用于测试的AJAX调用,并且在加载js文件后立即执行ReactDOM.render。 JS文件本身是经过编译,压缩的,大小不到300 KB(包括所有库,比如反应)。
此时,我不明白我可以做些哪些更改才能让谷歌正确渲染我的页面?据我所知,反复化的谷歌渲染问题通常来自AJAX调用或在网站本身被渲染和DOM更改之前在应用程序代码中完成的其他长期工作。但是在删除大型库(除了i18next并做出反应),最小化和压缩代码之后,我不知道我可以做些什么来显着提高性能或渲染时间。 PageSpeed Insights是99/100点(桌面,只抱怨我可以最小化html以节省110个字节)。
我的错误可能是什么想法?服务器端渲染对我来说不是一个合适的选择。
您可以在此处查看演示页:http://comparo.com.mx
正如您所看到的,没有太多 - 但显示的HTML内容在加载index.browser.js之后立即呈现,该文件是&lt; 300KB,因此不应该使Google搜索控制台无法正常呈现页面。
编辑:我的服务器位于欧洲,并且谷歌服务器从美国爬行。这可能是一个问题吗?
答案 0 :(得分:7)
将babel polyfill添加到您的项目中:
npm install --save babel-polyfill
然后将其导入index.js(入口点):
import 'babel-polyfill';
希望这能解决您的问题。
答案 1 :(得分:2)
我不确定Google是如何看待您的网站的,因为大多数模拟器只是剥离了Javascript。
您使用https://www.google.com/webmasters/tools/googlebot-fetch吗?
一般来说,Javascript支持仅限于搜索引擎,所以如果你真的想让抓取工具为你的网站编制索引,你就必须为React实现服务器端渲染。
我已使用https://github.com/kriasoft/react-starter-kit生成http://gifhub.net 这有点复杂,但最终有效。
还有像NextJS https://github.com/zeit/next.js/这样的框架,您可以利用这些框架来确保您拥有服务器呈现的内容。
第三个选项是使用Google Headless Chrome浏览器为抓取工具生成内容https://github.com/GoogleChrome/puppeteer
实施上述选项之一可确保抓取工具看到您想要的所有内容。依赖Javascript渲染不会给你预期的结果。
答案 2 :(得分:1)
在我的一个遗留项目中,我运行Angular.js将动态内容插入到后端呈现的页面中。 Google抓取工具非常智能,可以让它呈现动态javascript内容并对其进行索引(例如,表格是从Ajax数据中完全动态呈现的)。
所以我强烈反对它与服务器端渲染问题有关。
我不建议花时间做SSR,因为@AlexGvozden建议 - 这非常繁琐,尤其是Webpack设置。甚至可能使用Next.js和Create React App。
答案 3 :(得分:1)
这似乎是Google Bot的JS引擎的一个已知问题。我仍然试图了解究竟是什么问题,但似乎添加了“babel-polyfill&#39;到您的应用程序解决了问题。
答案 4 :(得分:1)
“ Google抓取”中的空白页也有同样的问题,上面关于babel-polyfill的建议并没有解决问题,所以我做了更多的研究:
长话短说,这是对我有用的解决方法:
npm install --save babel-polyfill npm install --save url-search-params-polyfill npm install --save whatwg-fetch
import 'babel-polyfill'; import 'url-search-params-polyfill'; import 'whatwg-fetch' import React from 'react'; import ReactDOM from 'react-dom';* ...
答案 5 :(得分:0)
要让Google按原样查看您的页面,您应该实现服务器端呈现。在这里,通过查看您的代码,它是客户端呈现,这里浏览器使用java脚本来加载您的DOM。
答案 6 :(得分:0)
我不知道这是否仍然是问题,但是...
对于每个项目,可能有不同的原因。首先,我建议您尝试在开发模式下运行项目(包括控制台日志),并使用public class VuforiaCustomBehaviour: MonoBehaviour, ITrackableEventHandler
public TrackableBehaviour mTrackableBehaviour;
void Start()
{
mTrackableBehaviour = GetComponent<TrackableBehaviour>();
if (mTrackableBehaviour)
{
mTrackableBehaviour.RegisterTrackableEventHandler(this);
}
}
public void OnTrackableStateChanged(TrackableBehaviour.Status previousStatus, TrackableBehaviour.Status newStatus)
{
if (newStatus == TrackableBehaviour.Status.DETECTED ||
newStatus == TrackableBehaviour.Status.TRACKED ||
newStatus == TrackableBehaviour.Status.EXTENDED_TRACKED)
{
if (mTrackableBehaviour.TrackableName == "marker1")
{
DoSmth();
}
}
else
{
OnTrackingLost();
}
}
对其进行测试。结果可以显示一些有用的错误。
接下来,您可以看到我的phantomjs示例(称为PhantomJS v2.1.1
):
website.js
顺便说一句,结果您将在与website.js位于同一目录中获得var system = require('system')
var page = require("webpage").create();
var homePage = "http://<link to your localhost>";
var captureName = "result.png";
page.onConsoleMessage = function(msg) {
system.stderr.writeLine('console: ' + msg);
};
page.onError = function(msg, trace) {
var msgStack = ['PHANTOM ERROR: ' + msg];
if (trace && trace.length) {
msgStack.push('TRACE:');
trace.forEach(function(t) {
msgStack.push(' -> ' + (t.file || t.sourceURL) + ': ' + t.line + (t.function ? ' (in function ' + t.function +')' : ''));
});
}
console.log(msgStack.join('\n'));
phantom.exit(1);
};
page.onLoadFinished = function(status) {
var url = page.url;
console.log("Status: " + status);
console.log("Loaded: " + url);
window.setTimeout(function () {
page.render(captureName);
phantom.exit();
}, 5000);
};
page.open(homePage);
快照
答案 7 :(得分:0)
尝试添加浏览器垫片。请注意,使用Babel编译代码并不重要,对于较旧的浏览器和无头浏览器(例如Google Bot或PhantomsJS),仍然需要使用polyfill。
npm install-保存es5-shim es6-shim
// in your frontend/index.js, as early as possible
import 'es5-shim';
import 'es6-shim';
您可以阅读更多here