以正确的方式实施SEO到Meteor app

时间:2016-01-31 13:18:52

标签: meteor seo

我试图找到在Meteor应用中实施SEO的正确方法,但无法找到任何好的例子。我觉得我正在做的事情正在发挥作用,但在某种程度上可能会更好。这就是我在Mediate via AdMob on Android中为SEO做的事情:

  1. 我使用的软件包:spiderable,gadicohen:sitemaps,manuelschoebel:ms-seo
  2. 头标:
  3. 
    
    <head>
    	<meta charset="UTF-8" />
    	<meta http-equiv="Content-Language" content="en-us" />
    	<meta name="google" value="notranslate" />
    	<meta name="viewport" content="width=device-width, initial-scale=1.0, maximum-scale=1.0, user-scalable=no">
    	<meta http-equiv="X-UA-Compatible" content="IE=edge,chrome=1" />
    	<meta name="mobile-web-app-capable" content="yes" />
    	<meta name="google-site-verification" content="google-verification-id" />
    	<meta name="msvalidate.01" content="bing-verification-id" />
    </head>
    &#13;
    &#13;
    &#13;

    1. 这就是我正在使用Meteor app做的事情:在seo.js文件中:
    2. &#13;
      &#13;
      SeoCollection = new Mongo.Collection('SeoCollection');
      
      Meteor.startup(function() {
          if (Meteor.isClient) {
              return SEO.config({
                  title: ’title',
                  meta: {
                          'description': ’siteDescription',
                          'keywords': ‘keyword, keyword, keyword',
                          'charset': 'utf-8',
                          'site_name': ’siteName',
                          'url':'http://siteName.com',
                          'viewport': 'width=device-width, initial-scale=1.0, maximum-scale=1.0, user-scalable=no',
                          'X-UA-Compatible': 'IE=edge,chrome=1',
                          'HandheldFriendly': 'true',
                          'apple-mobile-web-app-capable' : 'yes',
                          'apple-mobile-web-app-status-bar-style': 'black',
                          'referrer': 'never',
                    },
                    og: {
                          'title': ’siteTitle',
                          'description': ’siteDescription',
                          'image': 'image.png',
                          'type': 'website',
                          'locale': 'en_us',
                          'site_name': 'siteName',
                          'url': 'http://sitename.com'
                    },
                  rel_author: 'https://plus.google.com/+appPage/'
              });
          }
      
      
          SeoCollection.update(
              {
                  route_name: 'homepage'
              },
              {
                  $set: {
                      route_name: 'homepage',
                      title: ’title',
                      meta: {
                          'description': ’siteDescription',
                          'keywords': ‘keyword, keyword, keyword',
                          'charset': 'utf-8',
                          'site_name': ’siteName',
                          'url':'http://siteName.com',
                          'viewport': 'width=device-width, initial-scale=1.0, maximum-scale=1.0, user-scalable=no',
                          'X-UA-Compatible': 'IE=edge,chrome=1',
                          'HandheldFriendly': 'true',
                          'apple-mobile-web-app-capable' : 'yes',
                          'apple-mobile-web-app-status-bar-style': 'black',
                          'referrer': 'never',
                      },
                      og: {
                          'title': ’siteTitle',
                          'description': ’siteDescription',
                          'image': 'image.png',
                          'type': 'website',
                          'locale': 'en_us',
                          'site_name': 'siteName',
                          'url': 'http://sitename.com'
                      },
                      rel_author: 'https://plus.google.com/+appPage/'
                  }
              },
              {
                  upsert: true
              }
          );
      
      });
      &#13;
      &#13;
      &#13;

      动态使用Iron:router -

      &#13;
      &#13;
      this.route('page:data', {
          path: '/page',
          onBeforeAction: function() {
      
            SEO.set({
              title: data.title,
              meta: {
                'description': 'description',
              },
              og: {
                'title': data.title,
                'description': 'description',
                'image': data.image
              }
            })
            
            this.next();
          }
        })
      &#13;
      &#13;
      &#13;

      1. 使用ms-seo package提交站点地图:
      2. &#13;
        &#13;
        sitemaps.add('/items.xml', function() {
          var out = [], pages = Collection.find().fetch();
          _.each(pages, function(page) {
            out.push({
              page: 'page/' + page.encodedUrl,
              lastmod: page.date,
            });
          });
          return out;
        });
        &#13;
        &#13;
        &#13;

        1. 使用gadicohen:sitemaps部署应用程序,它会安装phantomJS。它与meteor-up软件包相结合,可让Google抓取您的应用。
        2. 我遇到的问题:

          1. Spiderable包仅适用于Google。确实,它拥有最大的市场份额,但这种方式来自其他搜索引擎的30%的SEO流量非常糟糕。

          2. 我不确定我是否应该在头文件中的seo.js文件中包含所有内容。我知道seo.js会覆盖它,但是当我从Reddit上的url请求title时,它说没有找到title标签。从我的角度来看,它可能与其他搜索引擎类似。但那时候会有多个相同的标签,这也不好。

          3. 我做得好不好?

2 个答案:

答案 0 :(得分:3)

处理此问题的最佳方法(至少在我的情况下),就是以这种方式使用prerender.io + manuelschoebel:ms-seo。

如何?

安装prerender,在这里你可以使用。

meteor add dfischer:prerenderio

注意如果你

res.send(status, body): Use res.status(status).send(body) instead

您必须使用npm包本身。

现在元标记。

为此您可以创建这样的函数。

setSEO = function(seoData){
  SEO.set({
          title: seoData.title,
          meta: {
            'description': seoData.description
          },
          og: {
            'title': seoData.title,
            'description': seoData.description,
            'image':seoData.image,
            'fb:app_id':seoData.appId
          }
        });
};

然后只需在onAfterAction挂钩

上调用它
 Router.map(function() {
  self.route('route.name', {
    path: '/some',
    template: 'test',
    name: 'route.name',
    onAfterAction: function() {
      setSEO(pageData.seoData);
    }
  });
});

就是这样,在我身边,它在twitter,g +,facebook,linkedin,pinterest上工作。

答案 1 :(得分:1)

您可能需要考虑FlowRouter SSR,它使用服务器端呈现HTTP请求。它在服务器上生成整个DOM,并将其作为初始静态HTML <body>发送,从而使所有网络蜘蛛能够抓取您的网站,而不仅仅是Google。之后,您的应用程序将继续作为实时Web应用程序运行,覆盖初始DOM。

它还支持订阅,因此您也可以使用Mongo集合来呈现可追踪内容。但不幸的是,它现在只适用于React。