我正在尝试使用Firebase函数为Firebase Hosting中托管的react应用程序实现动态渲染。
它背后的想法来自于这篇文章,https://dev.to/burhanahmeed/dynamic-rendering-simple-solution-for-spa-when-shared-on-social-media-amd
我想实现的是Firebase函数处理所有请求,根据用户代理提供动态生成的静态内容,否则为Firebase Hosting中托管的主应用程序提供服务。
到目前为止,我刚刚更改了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函数中运行的函数中,我无法从";构建";文件夹
我正在尝试类似的东西
app.get('*', (req, res) => {
res.render('../build/index');
});
但这显然不起作用,我不确定什么是最好的方法。。
如有任何帮助/建议,将不胜感激
res.render()
接受绝对路径或相对于视图设置的路径。为了正确地遍历文件系统,您需要使用诸如path
之类的模块。
以下是如何向上移动到";构建";当前JS文件所在的目录,例如:
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()
的参考资料。