如何使用Cloud Functions的Cloud Functions为SEO预呈现页面?

时间:2017-06-01 08:10:08

标签: firebase seo google-cloud-functions firebase-hosting

Firebase文档的云功能here表明可以使用云功能完成此操作 -

  

为单页应用程序预呈现以改善SEO。这允许您创建动态元标记,以便在各种社交网络中共享。

我有两个问题:

  • 有人可以用一个例子来解释如何实现预渲染吗?

  • 这如何与Firebase Hosting结合使用?所以,让我们说我在xyz.com/salon/43有一个网页,在Firebase托管中我有一个salon.html,响应这个请求。现在为了能够预渲染我应该从托管移动到呈现网页的云功能吗?换句话说,我来自

    "rewrites": [{
        "source": "/salon/*",
        "destination": "/salon.html"}]
    

    "rewrites": [{
        "source": "/salon", "function": "salon"}]
    

3 个答案:

答案 0 :(得分:5)

两项任务: - 在您的示例中将功能添加到主机重写中 - 编写函数以生成html页面

This tutorial提供了一个很好的示例,以下功能为例,来自较长的代码段:

const admin = require('firebase-admin');

function buildHtmlWithPost (post) {
  const string = '<!DOCTYPE html><head>' \
    '<title>' + post.title + ' | Example Website</title>' \
    '<meta property="og:title" content="' + post.title + '">' \
    '<meta property="twitter:title" content="' + post.title + '">' \
    '<link rel="icon" href="https://example.com/favicon.png">' \
    '</head><body>' \
    '<script>window.location="https://example.com/?post=' + post.id + '";</script>' \
    '</body></html>';
  return string;
}

module.exports = function(req, res) {
  const path = req.path.split('/');
  const postId = path[2];
  admin.database().ref('/posts').child(postId).once('value').then(snapshot => {
    const post = snapshot.val();
    post.id = snapshot.key;
    const htmlString = buildHtmlWithPost(post);
    res.status(200).end(htmlString);
  });
};

答案 1 :(得分:2)

你是对的,你有效地重写你的应用程序的HTML页面,指向一个函数,而不是一个静态文档。然后,当访问该页面时,您的函数将有效地生成发送回浏览器的HTML。您正抓住这个机会,在那个时刻决定HTML的内容应该是什么。

如果不需要在每次访问时生成内容(每个访问都根据pricing page上显示的结算费用计算费用),您也可能希望使用{{ 3}}消除从Firebase托管CDN提供缓存的预呈现内容。

答案 2 :(得分:1)

首先,对不起我的英语不好。

搜索了Deep Web(开玩笑)后,我找到了解决方案。而最酷的解决方案是,我能够使用Cloud Functions将Pioneer Ionic应用程序与Firebase Hosting集成。

阅读以下主题后:

https://github.com/firebase/firebase-tools/issues/33

@TheRoccoB用户介绍了如何在Firebase Hosting中托管静态Web应用程序以及如何将流量从URL重定向到Cloud Functions。

我所做的是映射必须索引为的路线:

{
    "source": "/ shop / **",
    "function": "ssr"
},
{
    "source": "/ * / promotions / **",
    "function": "ssr"
}

因为“ ssr”是我在Cloud Functions中的函数名称。因此,如果我将请求重定向到https://github.com/prerender/prerender-node服务器,我就使用了https://github.com/prerender/prerender库来检查请求是否来自Google Crowler。

const prerender = express ();
prerender.use (cors);
prerender.use (
    require ('prerender-node')
    // .set ('prerenderServiceUrl', 'http: // localhost: 3000')
    .set ('prerenderToken', '** TOKEN **')
);
prerender.use (require ('prerender-node'). set ('beforeRender', function (req, done) {
    // do you need to do?
    console.log ('Rendering URL:', req.path);
done ();
}));
prerender.use (require ('prerender-node') set ('afterRender', function (err, req, prerender_res) {
    // do you need to do?
    console.log (req.path + 'rendering completed!');
    console.log ('Errors:', err);
}));
prerender.get ('*', (req, res) => {
    console.log ('Calling function for URL:', req.path);
    res.set ('Cache-Control', 'public, max-age = 300, s-maxage = 600');
    res.status (200) .send (fs.readFileSync ('./ www / index.html'). toString ());
});
exports.ssr = functions.https.onRequest (prerender);