使用 Angular Universal 对动态生成数据的 SEO 支持

Posted

技术标签:

【中文标题】使用 Angular Universal 对动态生成数据的 SEO 支持【英文标题】:SEO support for dynamic generated data using Angular Universal 【发布时间】:2018-01-01 19:15:33 【问题描述】:

我们在工作中刚刚开始重新构建我们的应用程序,因此我们需要对我们将使用 Angular 2/4 构建的单页应用程序提供 SEO 支持。

基于互联网上的研发,我们发现angular universal 非常酷。它解决了我们在服务器端渲染静态数据以及 AJAX 调用数据的问题。

但是这个 ajax 调用的数据只有在组件开始时调用服务时才可用(更准确地说是在 NgInit 中)。但是,当我们进一步进行更改(例如搜索某些产品)时,动态生成的数据将无法在视图页面源中使用,因此也无法用于 google bot 或其他爬虫。

Angular Universal 在此处提供a simple example with server side rendering。

如果之前有人这样做过,请尝试回答。

如果没有人将其标记为离题或垃圾邮件,那就太好了,因为我在 SO 中看到了很多问题,但没有人在这里回答我的问题。

很少有解决方法

Node Version  
8.2.1  
NPM version  
5.3.1  
Angular 4.2  

Angular Cli   
1.0.3  

os: linux x64

使用 NodeJS 进行 s-s-r(服务器端渲染)。

这是我的server.ts的sn-p

import 'reflect-metadata';
import 'zone.js/dist/zone-node';
import  platformServer, renderModuleFactory  from '@angular/platform-server'
import  enableProdMode  from '@angular/core'
import  AppServerModuleNgFactory  from '../dist/ngfactory/src/app/app.server.module.ngfactory'
import * as express from 'express';
import  readFileSync  from 'fs';
import  join  from 'path';

const PORT = 3000;

enableProdMode();

const app = express();

let template = readFileSync(join(__dirname, '..', 'dist', 'index.html')).toString();

app.engine('html', (_, options, callback) => 
  const opts =  document: template, url: options.req.url ;

  renderModuleFactory(AppServerModuleNgFactory, opts)
    .then(html => callback(null, html));
);

app.set('view engine', 'html');
app.set('views', 'src')

app.get('*.*', express.static(join(__dirname, '..', 'dist')));

app.get('*', (req, res) => 
  res.render('index',  req );
);

app.listen(PORT, () => 
  console.log(`listening on http://localhost:$PORT!`);
);

【问题讨论】:

Google 已弃用 AJAX escaped_fragment 快照抓取,并且很快将不再支持它:developers.google.com/webmasters/ajax-crawling/docs/learn-moreGoogle 在抓取使用 javascript 的网站方面做得更好,然而,单页应用程序,尤其是 Angular 应用程序对搜索引擎不太友好。如果您想要好的 SEO,请放弃您的 SPA,转而使用对搜索引擎更友好的平台。 @StephenOstermiller 但这是否意味着您说不要使用 Angular?我们不能通过 SPA 实现相同数量的 SEO(使用 Angular Universal)吗? SPA 对 SEO 非常不利。特别是角。 Googlebot 似乎更好地抓取 react.js 网站。但即便如此,谷歌是唯一可以处理它们的搜索引擎。 Bing、Yandex 和百度仍然完全不解析 JS。 【参考方案1】:

只是为遇到相同问题的人提供答案。

在这个问题中,我在获取动态生成数据的视图源时遇到了问题,当时我在一个电子商务网站上工作,所以当用户进行一些过滤时,动态生成的数据没有被抓取,我所做的是我改变了过滤器上页面的 url,现在如果 google 确实想抓取我的页面,它将获取源中最新的真实数据。

示例:如果我的 URL 是 www.shop.com/dresses,我做了一些过滤,所以现在的 url 看起来像这样

www.shop.com/dresses?perPage=20&colour=ivory,coral&offers=51.0-70.0&priceRanges=500,1000&internationaldelivery=IN&page=1

还在这里添加@Stephen 对 SPA 的 SEO 的评论

Google 已弃用 AJAX escaped_fragment 快照抓取,并且很快将不再支持它:developers.google.com/webmasters/ajax-crawling/docs/learn-more Google 在抓取使用JavaScript,但是单页应用程序,尤其是 Angular 应用程序对搜索引擎不太友好。如果您想要良好的 SEO,请放弃您的 SPA,转而使用对搜索引擎更友好的平台。

【讨论】:

以上是关于使用 Angular Universal 对动态生成数据的 SEO 支持的主要内容,如果未能解决你的问题,请参考以下文章

使用 JWT 对 Angular Universal 进行身份验证

Angular Universal - 部署到 AWS Elastic Beanstalk

无法使用 Angular Universal 和 Firebase Functions 访问 Cloud Firestore 后端 [关闭]

Angular-universal - 生产问题

Angular 5 Universal:在开发中使用 server.ts

Angular 2 Universal - 使用手写笔和 pug 模板的服务器端渲染