Con algunos ajustes adicionales, puedes compilar sobre la funcionalidad básica de la CLI compatible con el framework para extender la compatibilidad de integración a frameworks que no sean Angular y Next.js.
Antes de comenzar
Antes de comenzar a implementar tu app en Firebase, revisa los siguientes requisitos y opciones:
- Versión 12.1.0 o posterior de Firebase CLI. Asegúrate de instalar la CLI con el método que prefieras.
- Opcional: Ten la facturación habilitada en tu proyecto de Firebase (obligatoria si planeas usar SSR)
Inicializa Firebase
A fin de comenzar, inicializa Firebase para tu proyecto de framework.
Usa Firebase CLI para un proyecto nuevo o modifica firebase.json
en un
proyecto existente.
Inicializa un proyecto nuevo
- En Firebase CLI, habilita la vista previa de frameworks web:
firebase experiments:enable webframeworks
Ejecuta el comando de inicialización desde la CLI y, luego, sigue las indicaciones:
firebase init hosting
Responde Sí a la pregunta “¿Quieres usar un framework web? (experimental)”
Elige el directorio del código fuente para hosting, que podría ser una app web existente.
Si se te solicita, elige Express.js / custom.
Inicializa un proyecto existente
Cambia la configuración de hosting en firebase.json
para que tenga una opción source
, en lugar
de una opción public
. Por ejemplo:
{
"hosting": {
"source": "./path-to-your-express-directory"
}
}
Entrega contenido estático
Antes de implementar contenido estático, deberás configurar tu aplicación.
Configurar
A fin de saber cómo implementar tu aplicación, Firebase CLI debe
poder compilarla y saber dónde ubican las herramientas los recursos
destinados a Hosting. Esto se logra con la secuencia de comandos de compilación npm y la
directiva de directorios CJS en package.json
.
Dado el siguiente package.json:
{
"name": "express-app",
"version": "0.0.0",
"scripts": {
"build": "spack",
"static": "cp static/* dist",
"prerender": "ts-node prerender.ts"
},
…
}
Firebase CLI solo llama a la secuencia de comandos de compilación, por lo que debes asegurarte de que esta sea exhaustiva.
{
"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"
},
…
}
Si tu framework no admite la renderización previa lista para usar, considera usar una herramienta como Rendertron. Rendertron te permitirá realizar solicitudes de Chrome sin interfaz gráfica a una instancia local de tu app para que puedas guardar el código HTML resultante a fin de que se entregue en Hosting.
Por último, los distintos frameworks y herramientas de compilación almacenan sus artefactos en diferentes
lugares. Usa directories.serve
para indicarle a la CLI la ubicación en la que tu secuencia de comandos de compilación está generando los artefactos, como se indica a continuación:
{
"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"
},
…
}
Implementar
Después de configurar la app, puedes entregar contenido estático con el siguiente comando de implementación estándar:
firebase deploy
Entrega contenido dinámico
Para entregar tu app de Express en Cloud Functions for Firebase, asegúrate de que la app de Express (o el controlador de URL de estilo Express) se exporte de tal manera que Firebase pueda encontrarla después de que la biblioteca se haya empaquetado con npm.
A fin de lograrlo, asegúrate de que la directiva files
incluya todo
lo que necesita el servidor y de que el punto de entrada principal esté configurado de forma correcta en
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",
...
}
Exporta la app de Express desde una función llamada app
:
// server.js
export function app() {
const server = express();
…
return server;
}
O, si prefieres exportar un controlador de URL de estilo Express, asígnale el nombre handle
:
export function handle(req, res) {
res.send(‘hello world’);
}
Implementar
firebase deploy
Esto implementa tu contenido estático en Firebase Hosting y permite que Firebase recurra a la app de Express alojada en Cloud Functions for Firebase.
Realiza la integración en Firebase Authentication (opcional)
Las herramientas de implementación de Firebase compatibles con framework web mantienen automáticamente sincronizados el estado del cliente y el servidor mediante cookies. Para acceder al contexto de autenticación,
el objeto res.locals
de Express contiene, de manera opcional, una instancia autenticada de la app de Firebase
(firebaseApp
) y el usuario conectado (currentUser
).