Разверните приложение Angular 8 Universal (SSR) на Firebase - PullRequest
0 голосов
/ 18 октября 2019

Недавно я обновил свое приложение Angular 8 до универсального (SSR). Я развернул его в Firebase до того, как он стал SSR-приложением, но потом я понял, что развертывание SSR-приложения в Firebase не работает при использовании обычного хостинга Firebase. Я провел некоторое исследование и обнаружил, что должен использовать Облачные функции Firebase .

Я создал приложение SSR, используя:

ng add @nguniversal/express-engine --clientProject PROJECT_NAME

PROJECT_NAME можно найти в angular.json файле ниже "projects" section.

Может кто-нибудь помочь мне с этим?

1 Ответ

1 голос
/ 18 октября 2019

Важное примечание : Это решение было взято из раздела вопросов и ответов Углового курса по Удеми ( здесь ). Я опробовал его и с некоторыми изменениями смог заставить его работать.


Итак, сначала убедитесь, что SSR действительно работает, запустив npm run build:ssr и npm run serve:ssr.

Затем установите FirebaseИнструменты и инициализация проекта:

  • Если вы ранее не устанавливали Инструменты командной строки Firebase, запустите npm install -g firebase-tools
  • Запустите firebase login, предоставив свои учетные данные Firebase (электронная почта/ пароль), если требуется.
  • Выполнить firebase init

Ответить на несколько вопросов ...

  • "Вы готовы продолжить? "

    Введите y и нажмите клавишу ВВОД.

  • " Какие функции CLI для Firebase вы хотите настроить? "

    Выберите ...

    (*) Functions
    
    (*) Hosting
    

    ..., выбрав и клавишу пробела, и нажав клавишу ВВОД.

  • "Выбрать проект Firebase по умолчанию для этого каталога?"

    Выберите один из них с помощью клавиш со стрелками и нажмите ENTER.

  • «Какой язык вы хотели бы использовать для написания облачных функций?»

    Выбрать TypeScript с помощью клавиш со стрелками и нажмите ENTER.

  • "Хотите использовать TSLint?"

    Введите y и нажмите ENTER.

  • "Хотите ли вы установить зависимости с помощью npm сейчас?"

    Введите y и нажмите клавишу ВВОД.

  • "Что вы хотитеиспользовать в качестве общедоступного каталога? "

    Введите dist/browser и нажмите клавишу ВВОД (обратите внимание: это отличается от развертывания приложения без Universal!).

  • "Настроить как одностраничное приложение? "

    Введите y и нажмите клавишу ВВОД.

  • Файл index.html уже существует. Перезаписать?

    Введите n (важно!) И нажмите клавишу ВВОД.

Изменить некоторые файлы ...

  • В firebase.json замените "destination": "/index.html" на "function": "ssr"

    (ssr указывает на эту переменную export const ssr = functions.https.onRequest(universal);, вы найдете ее ниже).

  • В server.ts добавить export к инициализации app: export const app = express(); вместо const app = express();

  • В server.ts либо закомментируйте последние три строки (app.listen(...)), либо замените их следующими:

    // If we're not in the Cloud Functions environment, spin up a Node server
    if (!process.env.FUNCTION_NAME) {
        // Start up the Node server
        app.listen(PORT, () => {
            console.log(`Node Express server listening on http://localhost:${PORT}`);
        });
    }

Вы можете удалить их при развертывании в Firebase, но вам нужноих при запуске npm run serve:ssr, чтобы иметь возможность разместить ваше приложение на localhost.

  • В webpack.server.config.js изменить output следующим образом:
    output: {
        // Puts the output at the root of the dist folder
        path: path.join(__dirname, 'dist'),
        // Export a UMD of the webpacked server.ts & dependencies for rendering in Cloud Functions
        library: 'app',
        libraryTarget: 'umd',
        filename: '[name].js',
    },

и изменить externals следующим образом:

    externals: [
        // Firebase has some troubles being webpacked when it's in the Node environment, so we will skip it.
        /^firebase/
    ],

Это исправит ошибку:

Невозможнонайти модуль 'require ("./ server / main")'

при выполнении команд npm run serve:ssr или firebase serve.

  • Перестройте приложение, запустив npm run build:ssr.

  • С помощью терминала перейдите в папку функций: cd functions

  • Установите пакет npm для доступа к файловой системе: npm i fs-extra

  • Внутри папки functions создайте новый файл с именем copy-angular-app.js , с этим содержанием:

    const fs = require('fs-extra');
    fs.copy('../dist', './dist').then(() => {
        // We should remove the original "index.html" since Firebase will use it when SSR is enabled (instead of calling SSR functions),
        // and because of that, SSR won't work for the initial page.
        fs.remove('../dist/browser/index.html').catch(e => console.error('REMOVE ERROR: ', e));
    }).catch(err => {
        console.error('COPY ERROR: ', err)
    });

Это исправляет начальную страницу, не загруженную как SSR (вместо отображения содержимого для начальной страницы этопо-прежнему показывает <app-root></app-root>).

Примечание: Поскольку мы удалили файл index.html, запуск npm run serve:ssr не будет работать, если вы сначала не перестроите свое приложение (запустив npm run build:ssr -> это создаст файл index.html).

  • В functions / package.json (не в package.json проекта!) измените сборкувведите следующую запись:

"build": "node copy-angular-app && tsc",

  • В 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);
  • В терминале маУбедитесь, что вы находитесь в каталоге functions и там запускаете npm run build, чтобы скопировать папку dist в папку functions.

Дополнительное примечание: Чтобы упростить сборку для Firebase, вы можете создать скрипт в файле package.json основного проекта:

    "build:ssr": "npm run build:client-and-server-bundles && npm run compile:server", // this one should already exist
    "build:ssr-firebase": "npm run build:ssr && npm --prefix functions/ run build",

Этот скрипт будетсначала создайте приложение Angular SSR (npm run build:ssr), а затем оно будет запускаться npm run build в папке functions (таким образом, оно скопирует папку dist проекта в ваши functions dist и удалит файл проекта index.html).

Развертывание приложения ...

  • Вы можете обслуживать свое приложение локально перед развертыванием в localhost: 5000 , запустив firebase serve (если хотите).

  • Остановите сервер (Ctrl + C).

  • Затем вы можете развернуть приложение, запустив firebase deploy и перейти к нему через URL, который отображается в терминале.

Таким образом, мне удалось развернуть мое приложение Angular SSR наFirebase.

Надеюсь, это поможет ...

...