AngularJS 内容和 Google

AngularJS content and Google

最近我看到文章指出 Google 现在可以抓取网站并呈现 CSS 和 Javascript。 Google 自己的示例文章:http://googlewebmastercentral.blogspot.co.uk/2014/05/understanding-web-pages-better.html

我在 Angular 中设置了单页应用程序,在路由上使用 HTML5 模式。我的 index.html 中的 ng-view 是基于 URL 填充的,如下所示:

app.config(function($routeProvider, $locationProvider){

  $locationProvider.html5Mode(true);

  $routeProvider.when("/", {
    templateUrl: "/views/dashboard.html"
  }).when("/portfolio", {
    templateUrl: "/views/portfolio.html"
  });

});

Google 现在应该转到 www.example.com/portfolio,执行从 views/portfolio.html 引入内容的 javascript 并且能够正确读取所有内容?

根据我读过的那些文章应该是这样的。这个特别详细解释了关于Angular:https://weluse.de/blog/angularjs-seo-finally-a-piece-of-cake.html

问题来了。当我使用 Google 网站站长工具和 FetchFetch and Render 功能来查看 Google 如何查看我的页面时,它不会呈现 JS,只会显示初始 HTML 在我的 index.html 中。

有效吗?我做错了什么吗?我该如何测试?

因此,正如我在评论中提到的,希望这个答案能为我的意思提供更多背景信息。

因此,当您声明 html5Mode 时,还包括 hashPrefix:

$locationProvider
    .html5Mode(true)
    .hashPrefix('!');

然后,在您的 <head> 中包含此标签:

<meta name="fragment" content="!">

这里发生的是你为历史提供了一个后备措施API,这意味着所有使用兼容浏览器访问的用户(基本上现在所有的浏览器)都会看到这个:

http://example.com/home/

而且只有在像 IE9 这样的恐龙浏览器上他们才会看到这个:

http://example.com/#!/home/

现在,这是在现实生活中,有真实的人作为访客。您特别询问了有关被使用机器人的 Google 编入索引的问题。他们将尝试将 example.com/home/ 作为您服务器上的实际 目的地 (意思是 /home/index.html),这显然不存在。通过提供上面的 <meta> 标签,您已经向机器人提供了提示,使其转至站点的 ?_escaped_fragment 版本(如 index.html?_escaped_fragment=home)并将其与该 URL 在实际 Google 搜索中的 /home/

它完全在后端,您网站的所有访问者仍然会看到干净的 URL,这只是因为在后台 Angular 使用 location.hash,这是必需的在服务器端看不到。最重要的是,您的实际用户不会受到影响,也不会遇到难看的 URL,除非他们使用的浏览器不支持历史记录 API。对于这些用户,您所做的就是让网站开始为他们工作(因为以前它会被破坏)。

希望对您有所帮助!

更新

由于您使用的是 MEAN 堆栈,因此您还可以选择一个已经存在很长时间的不同方向,即使用 HTML 快照。有 npms 将提供快照(意思是来自 post-render 的静态 HTML),可以在显示的位置从您的服务器提供这些快照。该技术有点过时,但自​​ 2012 年以来就已经存在并且被证明是有效的。

当我这样做的时候,我使用了 grunt-html-snapshot,但还有其他的。你甚至可以使用 PhantomJS 来制作快照,虽然我从来没有这样做过。