使用 Firebase Functions 和 Firebase Hosting 进行动态渲染
Dynamic rendering with Firebase Functions and Firebase Hosting
我正在尝试使用 Firebase 函数为托管在 Firebase 托管中的 React 应用程序实现动态渲染。
其背后的想法来自这篇文章,
https://dev.to/burhanahmeed/dynamic-rendering-simple-solution-for-spa-when-shared-on-social-media-amd
我想实现的是
Firebase Functions 处理所有请求,
根据用户代理服务动态生成的静态内容,否则服务托管在 Firebase 托管中的主应用程序。
到目前为止,我刚刚更改了 firebase.json 以将所有请求重定向到我的 'app' 函数而不是 '/index.html'
"rewrites": [
{
"source": "**",
"function": "app"
}
]
我的应用程序功能类似于
app.get('*', (req, res) => {
if(isBot()){
// serve static content
}else{
// serve the index of my hosted app
res.render('/index'); // <--- how to access hosted /index.html in build ??
}
});
exports.app = functions.https.onRequest(app);
我面临的问题是,我无法通过 Firebase Functions 中的函数 运行 从“build”文件夹中获取内容
我正在尝试
app.get('*', (req, res) => {
res.render('../build/index');
});
但这显然行不通,
我不确定什么是最好的方法..
任何 help/suggestion 将不胜感激
res.render()
接受绝对路径,或相对于视图设置的路径。为了正确遍历文件系统,您需要使用 path
.
等模块
以下是如何从 where the current JS file 所在的位置向上移动到“构建”目录,例如:
const express = require('express');
const path = require('path');
...
app.set('views', path.join(__dirname, '..', 'build'));
然后呈现您的模板:
res.render('index');
或者,另一种不指定视图的方法是直接呈现模板,如下例所示:
res.render(path.join(__dirname, '..', 'build', 'index'));
res.render(path.join(__dirname, '..', 'build') + '/index');
这里有一个关于如何使用 path.join()
的参考。
我正在尝试使用 Firebase 函数为托管在 Firebase 托管中的 React 应用程序实现动态渲染。
其背后的想法来自这篇文章, https://dev.to/burhanahmeed/dynamic-rendering-simple-solution-for-spa-when-shared-on-social-media-amd
我想实现的是 Firebase Functions 处理所有请求, 根据用户代理服务动态生成的静态内容,否则服务托管在 Firebase 托管中的主应用程序。
到目前为止,我刚刚更改了 firebase.json 以将所有请求重定向到我的 'app' 函数而不是 '/index.html'
"rewrites": [
{
"source": "**",
"function": "app"
}
]
我的应用程序功能类似于
app.get('*', (req, res) => {
if(isBot()){
// serve static content
}else{
// serve the index of my hosted app
res.render('/index'); // <--- how to access hosted /index.html in build ??
}
});
exports.app = functions.https.onRequest(app);
我面临的问题是,我无法通过 Firebase Functions 中的函数 运行 从“build”文件夹中获取内容
我正在尝试
app.get('*', (req, res) => {
res.render('../build/index');
});
但这显然行不通, 我不确定什么是最好的方法..
任何 help/suggestion 将不胜感激
res.render()
接受绝对路径,或相对于视图设置的路径。为了正确遍历文件系统,您需要使用 path
.
以下是如何从 where the current JS file 所在的位置向上移动到“构建”目录,例如:
const express = require('express');
const path = require('path');
...
app.set('views', path.join(__dirname, '..', 'build'));
然后呈现您的模板:
res.render('index');
或者,另一种不指定视图的方法是直接呈现模板,如下例所示:
res.render(path.join(__dirname, '..', 'build', 'index'));
res.render(path.join(__dirname, '..', 'build') + '/index');
这里有一个关于如何使用 path.join()
的参考。