我最近将Angular 8应用程序升级为通用应用程序(SSR)。在将它作为SSR应用程序之前,我已经将其部署到Firebase,但是后来我发现,使用常规Firebase托管无法在Firebase上部署SSR应用程序。我做了一些研究,发现我必须使用Firebase Cloud Functions。
我使用以下方法创建了一个SSR应用程序:
ng add @nguniversal/express-engine --clientProject PROJECT_NAME
PROJECT_NAME
可以在angular.json
部分下面的"projects"
文件中找到。谁能帮我这个?
最佳答案
重要说明:此解决方案来自于Udemy的Angular课程(here)的“问答”部分。我尝试了一下,并进行了一些修改使其得以工作。
因此,首先通过运行npm run build:ssr
和npm run serve:ssr
来确保SSR确实起作用。
然后安装Firebase Tools并初始化项目:
npm install -g firebase-tools
firebase login
,如果需要,提供您的Firebase凭证(电子邮件/密码)。 firebase init
回答一些问题...
键入
y
并按Enter。 选择...
(*) Functions
(*) Hosting
...,同时使用SPACE键选择它们,然后按Enter。
用箭头键选择一个,然后按Enter。
使用箭头键选择
TypeScript
,然后按Enter。 键入
y
并按Enter。 键入
y
并按Enter。 键入
dist/browser
并按Enter(请注意:这与部署不带Universal的应用程序不同!)。 键入
y
并按Enter。 键入
n
(重要!),然后按Enter。 修改一些文件...
"destination": "/index.html"
替换为"function": "ssr"
(
ssr
指向此export const ssr = functions.https.onRequest(universal);
变量,您将在下面找到它)。 export
添加到app
初始化中:export const app = express();
代替const app = express();
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
上托管您的应用程序。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 i fs-extra
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
将无法工作。"build": "node copy-angular-app && tsc",
import * as functions from 'firebase-functions';
const universal = require(`${process.cwd()}/dist/server`).app;
export const ssr = functions.https.onRequest(universal);
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
(这样,它将把项目的dist
文件夹复制到您的函数 dist
文件夹,并删除项目的index.html
文件)。部署您的应用程序...
firebase serve
在 localhost:5000 上为本地应用提供服务。 firebase deploy
来部署应用程序,并通过终端中显示的URL对其进行访问。 这样,我设法在Firebase上部署了Angular SSR应用程序。
希望这可以帮助...
关于angular - 在Firebase上部署Angular 8 Universal(SSR)应用程序,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/58447458/