У меня есть работающее веб-приложение Angular (8), в котором используется Firebase.Но так как я не использую Angular-Universal, я не могу устанавливать заголовки / метатеги на сайтах продуктов.Чтобы решить эту проблему, я попытался добавить angular-universal и развернуть приложение для облачных функций firebase, но как только firebase вступает во владение, маршруты больше не могут быть сопоставлены.
Я следовал официальному руководству поЗатем angular.io переключился на урок блестящего Джеффа Деланэ из fireship.io , связался с уроком и прочитал несколько средних статей на эту тему , например, .Я создал (несколько) новых приложений и пробовал это неоднократно.Все работает нормально (за исключением новой угловой функции «ленивая загрузка»), пока сервер ssr-express обрабатывает запросы.«npm run build: ssr», за которым следует «npm run serve: ssr», работает отлично, но как только код подготовлен для облачных функций firebase, и «firebase serve» вступает во владение, «localhost: 5000» работает, но открывает любую ссылкунапрямую, как в примере "/ about", вывод консоли указывает, что ни один маршрут не может быть сопоставлен.Поскольку я попробовал официальную документацию и несколько средних статей, это должно быть очень распространенной проблемой, но я не смог найти здесь никаких вопросов по этой теме.
Поскольку я не вижу, как это будетвозможность просмотра на стеке или в любом другом месте, я постараюсь описать (кратко), что я сделал, и покажу соответствующий код, где это необходимо.
tl; dr: Сервер Firebase Github Repo
(в основном откройте сервер Firebase, нажмите кнопку и нажмите клавишу F5)
Необходимая предварительная сборка:
ng new cloudfunctionsangularuniversal && cd cloudfunctionsangularuniversal
ng add @angular/fire
ng add @nguniversal/express-engine --clientProject cloudfunctionsangularuniversal
ng g c landing
ng g c ssrtesting
/ src / app / app-routing.module.ts: Обновление маршрутов
//..
const routes: Routes = [
{ path: '', component: LandingComponent },
{ path: 'ssrtesting', component: SsrtestingComponent }
];
Поскольку я хочу использовать firebase в своем проекте, мне нужна переменная XMLHttpRequest
npm install ws xhr2 bufferutil utf-8-validate -D
/ server.ts: Обновить сервер с помощьютолько что установленные пакеты
(global as any).WebSocket = require('ws');
(global as any).XMLHttpRequest = require('xhr2');
// ...
В этот момент "npm run build: ssr", за которым следует "npm run serve: ssr", запускает экспресс-сервер, который правильно обрабатывает все входящие запросы.
Но чтобы использовать приложение с Firebase, несколько чанges необходимы.
Init firebase (выберите функции и хостинг)
firebase init
/ firebase.json: переписать весь трафик в функцию.
//...
"hosting": {
"public": "dist/browser",
"ignore": [
"firebase.json",
"**/.*",
"**/node_modules/**"
],
"rewrites": [
{
"source": "**",
"function": "ssr"
}
]
},
//...
/ server.ts: экспортируйте const приложения, затем удалите вызов для прослушивания.
export const app = express();
// ...
// app.listen(PORT, () => {
// console.log(`Node Express server listening on http://localhost:${PORT}`);
// });
/ webpack.server.config.js: Сделайте ваше приложение библиотекой
// ...
output: {
// Puts the output at the root of the dist folder
path: path.join(__dirname, 'dist'),
library: 'app',
libraryTarget: 'umd',
filename: '[name].js',
},
// ...
/ Moveist.js:Создайте помощника, который копирует приложение сборки из папки «dist» в «functions / dist»
const fs = require('fs-extra');
(async() => {
const src = './dist';
const copy = './functions/dist';
await fs.remove(copy);
await fs.copy(src, copy);
})();
, установите необходимый пакет
npm i --save fs-extra
/ package.json: обновите вашкоманда build
//...
"build:ssr": "npm run build:client-and-server-bundles && npm run compile:server && node movedist && cd functions && npm run build"
//...
Наконец, создайте используемое приложение /functions/src/index.ts
import * as functions from 'firebase-functions';
const universal = require(`${process.cwd()}/dist/server`).app;
export const ssr = functions.https.onRequest(universal);
Теперь запустите
npm run build:ssr
Все должно быть готово,так что протестируйте его с помощью
firebase serve
При открытии «localhost: 5000» все выглядит нормально.Но откройте его в окне инкогнито и откройте "localhost: 5000 / ssrtesting", и консоль выдаст вам
"ОШИБКА {Ошибка: Uncaught (в обещании): Ошибка: Не удается сопоставить никакие маршруты.Сегмент URL: 'cloudfunctionsangularuniversal / us-central1 / ssr / ssrtesting' "
перед успешным отображением страницы.Этого не происходит на сервере Firebase, хотя.В сети он запускает 404.
Сервер Firebase Репозиторий Github
Любая помощь будет оценена.