Javascript MEAN.js社交分享?
因此,我使用MEAN.js构建了一个应用程序,并对文章(博客)部分进行了一些更新,以提高搜索引擎优化(SEO)、可读性、设计等。不过,我似乎无法解决的一个问题是,如何使用Facebook、Google+、Twitter等共享文章,并使用og元标记填充正确的数据 我想要什么 我所希望的就是能够分享我的MEAN.js应用程序中的文章(博客文章),并在社交网站(如Facebook)上发布链接时显示文章内容 我尝试过的 我曾经尝试过专门为博客文章创建一个单独的服务器布局,但这破坏了许多其他东西,以至于我意识到工作量可能不值得——必须有一个更聪明的方法 我也尝试过在客户端用Angular更新og元标记数据,但在社交网站抓取这些标记之前,这些值不能得到更新……换句话说,它实际上并没有达到我想要的效果 我尝试在索引呈现时获取角度路由URL,以便在呈现索引之前更新这些og元数据,但在Javascript MEAN.js社交分享?,javascript,angularjs,express,mean,meanjs,Javascript,Angularjs,Express,Mean,Meanjs,因此,我使用MEAN.js构建了一个应用程序,并对文章(博客)部分进行了一些更新,以提高搜索引擎优化(SEO)、可读性、设计等。不过,我似乎无法解决的一个问题是,如何使用Facebook、Google+、Twitter等共享文章,并使用og元标记填充正确的数据 我想要什么 我所希望的就是能够分享我的MEAN.js应用程序中的文章(博客文章),并在社交网站(如Facebook)上发布链接时显示文章内容 我尝试过的 我曾经尝试过专门为博客文章创建一个单独的服务器布局,但这破坏了许多其他东西,以至于我
req
数据中的任何位置都找不到这些值
我认为问题在于
从概念上讲,我认为这就是正在发生的事情:
req.url
值只是根页面('/')express.js
文件中,应用程序的局部变量设置如下:
// Setting application local variables
app.locals.siteName = config.app.siteName;
app.locals.title = config.app.title;
app.locals.description = config.app.description;
app.locals.keywords = config.app.keywords;
app.locals.imageUrl = config.app.imageUrl;
app.locals.facebookAppId = config.facebook.clientID;
app.locals.jsFiles = config.getJavaScriptAssets();
app.locals.cssFiles = config.getCSSAssets();
// Note the {{keywords}}, {{description}}, etc. values.
<!-- Semantic META -->
<meta id="keywords" name="keywords" content="{{keywords}}">
<meta id="desc" name="description" content="{{description}}">
<!-- Facebook META -->
<meta id="fb-app-id" property="fb:app_id" content="{{facebookAppId}}">
<meta id="fb-site-name" property="og:site_name" content="{{siteName}}">
<meta id="fb-title" property="og:title" content="{{title}}">
<meta id="fb-description" property="og:description" content="{{description}}">
<meta id="fb-url" property="og:url" content="{{url}}">
<meta id="fb-image" property="og:image" content="{{imageUrl}}">
<meta id="fb-type" property="og:type" content="website">
<!-- Twitter META -->
<meta id="twitter-title" name="twitter:title" content="{{title}}">
<meta id="twitter-description" name="twitter:description" content="{{description}}">
<meta id="twitter-url" name="twitter:url" content="{{url}}">
<meta id="twitter-image" name="twitter:image" content="{{imageUrl}}">
然后,Swig在layout.server.view.html
文件中呈现这些局部变量,如下所示:
// Setting application local variables
app.locals.siteName = config.app.siteName;
app.locals.title = config.app.title;
app.locals.description = config.app.description;
app.locals.keywords = config.app.keywords;
app.locals.imageUrl = config.app.imageUrl;
app.locals.facebookAppId = config.facebook.clientID;
app.locals.jsFiles = config.getJavaScriptAssets();
app.locals.cssFiles = config.getCSSAssets();
// Note the {{keywords}}, {{description}}, etc. values.
<!-- Semantic META -->
<meta id="keywords" name="keywords" content="{{keywords}}">
<meta id="desc" name="description" content="{{description}}">
<!-- Facebook META -->
<meta id="fb-app-id" property="fb:app_id" content="{{facebookAppId}}">
<meta id="fb-site-name" property="og:site_name" content="{{siteName}}">
<meta id="fb-title" property="og:title" content="{{title}}">
<meta id="fb-description" property="og:description" content="{{description}}">
<meta id="fb-url" property="og:url" content="{{url}}">
<meta id="fb-image" property="og:image" content="{{imageUrl}}">
<meta id="fb-type" property="og:type" content="website">
<!-- Twitter META -->
<meta id="twitter-title" name="twitter:title" content="{{title}}">
<meta id="twitter-description" name="twitter:description" content="{{description}}">
<meta id="twitter-url" name="twitter:url" content="{{url}}">
<meta id="twitter-image" name="twitter:image" content="{{imageUrl}}">
//注意{{keywords}}、{{description}}等值。
因此,理想情况下,我认为我们希望在呈现页面之前,使用特定于文章的信息更新这些值。问题是,如果在确定要填充哪些文章数据之前呈现布局,我该怎么做?同样,角度路由在req
对象中的任何位置似乎都不可用,因此我完全不知道如何做到这一点
因此,我回到了我最初的愿望——如何使用MEAN.js以“漂亮”的方式在社交媒体上分享我的文章?我走对了吗?当前文章设置是否可能?我是否需要构建一个完全不使用Angular的博客模块?我也面临同样的问题。首先我安装的意思是搜索引擎优化模块。你可以在mean.js官方github repo上找到它。模块基本上就是这样做的:当爬虫(Google等)遇到SPA URL时,会在其请求中添加一个
\u转义\u片段
部分。平均搜索引擎优化拦截包含\u转义\u片段\u
的请求。然后使用Phantom.Js,从动态HTML中呈现出一个静态HTML并保存它,将这个静态版本提供给爬虫
对于Facebook和Twitter,我更改了mean seo.js的mean seo.js
文件,在它缓存并保存静态文件之前,我相应地替换了元标记。因为Phantom.Js已经呈现了整个文章页面,所以您不需要进行另一个API调用。只需解析HTML。我还使用cheerio.js
方便地解析HTML
这种方法解决了我的问题,但并不完美。我仍然在与hashbang&HTML5模式作斗争。当我的URL像https://example.com/post/1
Twitter和Facebook不请求\u转义\u片段
更新:过了一段时间,我放弃了这条路。Phantomjs似乎不可靠,我不喜欢为这样的工作浪费系统资源、CPU时间、RAM和磁盘空间。不必要的文件创建也是愚蠢的。我目前的做法是:
if ($http_user_agent ~* "baiduspider|twitterbot|facebookexternalhit|rogerbot|linkedinbot|embedly|quora link preview|showyoubot|outbrain|pinterest|slackbot|vkShare|W3C_Validator") {
rewrite ^/posts/(.*)$ /api/posts/crawl/$1 last;
}
我为Twitter和Facebook添加了一条新的快速路线。在服务器控制器中,实现了爬虫的新功能。创建了一个简单的服务器模板,没有角度、引导和所有闪亮的东西:只有元标记和简单文本。使用Swig
(已包含在Meanjs中),相应地呈现此视图模板。我还使用Nginx
作为代理。因此,我定义了一个新的基于用户代理的Nginxrewrite
。大概是这样的:
if ($http_user_agent ~* "baiduspider|twitterbot|facebookexternalhit|rogerbot|linkedinbot|embedly|quora link preview|showyoubot|outbrain|pinterest|slackbot|vkShare|W3C_Validator") {
rewrite ^/posts/(.*)$ /api/posts/crawl/$1 last;
}
当爬虫请求帖子的URL时,Nginx会触发我的新简单爬虫路由并生成一个小页面 在没有Nginx或MEANJS框架之外的任何东西的情况下,我终于让它在我的应用程序中工作了。你的里程数可能会有所不同,但我想我还是会分享结果的。它对我有效,但对你可能无效 基本上,我已经设置了一种获取非散列URL并重定向到散列URL的方法。因此,用户可以共享他们的个人资料,例如
example.com/myprofile
,它将重定向到example.com/#/profile/myprofile
然后,我严格地为社交机器人创建了一个单独的布局(尽管回想起来,我不确定这是否完全必要),并在网站被删除时提供单独的布局。我这样做:
社交版面.server.view.html
...some stuff here...
//Note the variable names, e.g. {{siteName}}
<meta id="fb-app-id" property="fb:app_id" content="{{facebookAppId}}">
<meta id="fb-site-name" property="og:site_name" content="{{siteName}}">
<meta id="fb-title" property="og:title" content="{{socialTitle}}">
<meta id="fb-description" property="og:description" content="{{socialDescription}}">
<meta id="fb-url" property="og:url" content="{{socialUrl}}">
<meta id="fb-image" property="og:image" content="{{socialImageUrl}}">
<meta id="fb-type" property="og:type" content="website">
...other stuff here...
同样,您的里程数可能会有所不同,但这对我(部分)起到了作用。我仍在致力于整个URL(包括散列)的社交共享。希望在某种程度上有所帮助。这似乎是我一直在思考的方法,如何在没有ngix和mean.js应用程序的情况下实现它?我尝试了Angular和Express路由,而不是Nginx重写,但没有成功。我不确定。我已经在Nginx后面提供应用程序(SSL密钥和所有),所以我只是