我试图找到在Meteor应用中实施SEO的正确方法,但无法找到任何好的例子。我觉得我正在做的事情正在发挥作用,但在某种程度上可能会更好。这就是我在Mediate via AdMob on Android中为SEO做的事情:
<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;
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;
动态使用Iron:router -
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;
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;
我遇到的问题:
Spiderable包仅适用于Google。确实,它拥有最大的市场份额,但这种方式来自其他搜索引擎的30%的SEO流量非常糟糕。
我不确定我是否应该在头文件中的seo.js文件中包含所有内容。我知道seo.js会覆盖它,但是当我从Reddit上的url请求title时,它说没有找到title标签。从我的角度来看,它可能与其他搜索引擎类似。但那时候会有多个相同的标签,这也不好。
我做得好不好?
答案 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。