通过一些额外的配置,您可以基于基本的框架感知型 CLI 功能,对集成功能进行扩展,以支持 Angular 和 Next.js 之外的更多框架。
准备工作
在开始将应用部署到 Firebase 之前,请先了解以下要求和相关选项:
- 拥有 Firebase CLI 12.1.0 或更高版本。请务必使用您首选的方法安装 CLI。
- 可选:在 Firebase 项目中启用结算功能(如果您计划使用 SSR,则必须完成此操作)
初始化 Firebase
首先,请为您的框架项目初始化 Firebase。对于新项目,您可以使用 Firebase CLI 完成初始化;对于现有项目,则可以通过修改 firebase.json 执行此操作。
初始化新项目
- 在 Firebase CLI 中,启用 Web 框架预览:
firebase experiments:enable webframeworks 
- 通过 CLI 运行初始化命令,然后按照提示操作: - firebase init hosting 
- 在看到“Do you want to use a web framework?(experimental)”后输入“yes” 
- 选择您的托管用源目录;它可以包含一个现有的 Web 应用。 
- 如果出现提示,则选择“Express.js”/“自定义” 
初始化现有项目
将 firebase.json 中的托管配置更改为使用 source 选项,而不是 public 选项。例如:
{
  "hosting": {
    "source": "./path-to-your-express-directory"
  }
}
提供静态内容
在部署静态内容之前,您需要配置您的应用。
配置
为了知道应如何部署应用,Firebase CLI 需要能够构建应用并了解您的工具会将资源部署到 Hosting 上的什么位置。这是使用 package.json 中的 npm 构建脚本和 CJS 目录指令来实现的。
假定有以下 package.json:
{
    "name": "express-app",
    "version": "0.0.0",
    "scripts": {
        "build": "spack",
        "static": "cp static/* dist",
        "prerender": "ts-node prerender.ts"
    },
    …
}
这里,Firebase CLI 仅调用构建脚本,因此您需要确保该构建脚本的完整性。
{
    "name": "express-app",
    "version": "0.0.0",
    "scripts": {
        "build": "spack && npm run static && npm run prerender",
        "static": "cp static/* dist",
        "prerender": "ts-node prerender.ts"
    },
    …
}
如果您的框架不支持开箱即用型预呈现功能,不妨考虑使用诸如 Rendertron 之类的工具。Rendertron 让您可以对应用的本地实例发出无头 Chrome 请求,以便您可以保存生成的 HTML 并将其托管在 Hosting 上。
最后需要注意的是,不同的框架和构建工具会将其工件存储在不同的位置。您可以使用 directories.serve 让 CLI 知道您的构建脚本会将生成的工件输出到什么位置:
{
    "name": "express-app",
    "version": "0.0.0",
    "scripts": {
        "build": "spack && npm run static && npm run prerender",
        "static": "cp static/* dist",
        "prerender": "ts-node prerender.ts"
    },
    "directories": {
        "serve": "dist"
    },
    …
}
部署
配置应用后,您可以使用标准部署命令来提供静态内容:
firebase deploy
提供动态内容
如需在 Cloud Functions for Firebase 上部署 Express 应用,在导出 Express 应用(或 Express 样式的网址处理程序)时,需确保在您的库经过 npm 打包后,Firebase 仍然能够找到您的应用。
为此,请确保您的 files 指令包含服务器所需的所有内容,并且您的主入口点已在 package.json 中正确设置:
{
    "name": "express-app",
    "version": "0.0.0",
    "scripts": {
        "build": "spack && npm run static && npm run prerender",
        "static": "cp static/* dist",
        "prerender": "ts-node tools/prerender.ts"
    },
    "directories": {
        "serve": "dist"
    },
    "files": ["dist", "server.js"],
    "main": "server.js",
    ...
}
通过名为 app 的函数导出 Express 应用:
// server.js
export function app() {
  const server = express();
   …
   return server;
}
或者,如果您希望导出 Express 样式的网址处理程序,应将其命名为 handle:
export function handle(req, res) {
   res.send(‘hello world’);
}
部署
firebase deploy
该步骤会将您的静态内容部署到 Firebase Hosting,并允许 Firebase 回退到 Cloud Functions for Firebase 上托管的 Express 应用。
可选:与 Firebase Authentication 集成
Web 框架感知型 Firebase 部署工具可以使用 Cookie 自动同步客户端和服务器的状态。若要访问身份验证上下文,可以视需要向 Express res.locals 对象添加经过身份验证的 Firebase 应用实例 (firebaseApp) 及当前登录的用户 (currentUser)。