我正在尝试将 nextjs 应用程序部署到 Firebase 托管并希望支持多个站点。当我部署它时,所有应用程序都会呈现默认应用程序。我该如何解决这个问题?
我正在关注教程here关于使用 AngularJs 将多个站点部署到 firebase,我尝试用 NextJs 替换 Angularjs
package.json 中的脚本
{
"scripts": {
"accounts": "next \"src/apps/accounts/\"",
"accounts-build": "next build \"src/apps/accounts/\"",
"admin": "next \"src/apps/admin/\"",
"admin-build": "next build \"src/apps/admin/\"",
"preserve": "npm run build-public && npm run build-funcs && npm run admin-build && npm run copy-deps && npm run install-deps",
"serve": "cross-env NODE_ENV=production firebase serve",
"predeploy": "npm run build-public && npm run build-funcs && npm run accounts-build && npm run admin-build && npm run copy-deps",
"deploy": "firebase deploy",
"clean": "rimraf \"dist/functions/**\" && rimraf \"dist/public\"",
"build-public": "cpx \"src/public/**/*.*\" \"dist/public\" -C",
"build-funcs": "babel \"src/functions\" --out-dir \"dist/functions\"",
"copy-deps": "cpx \"*{package.json,package-lock.json,yarn.lock}\" \"dist/functions\" -C",
"install-deps": "cd \"dist/functions\" && npm i"
}
}
firebase.json
{
"hosting": [
{
"target": "accounts",
"public": "dist/public",
"rewrites": [
{
"source": "**/**",
"function": "accounts"
}
]
},
{
"target": "admin",
"public": "dist/public",
"rewrites": [
{
"source": "**/**",
"function": "admin"
}
]
}
],
"functions": {
"source": "dist/functions"
}
}
.firebaserc
{
"projects": {
"default": "example-app"
},
"targets": {
"example-app": {
"hosting": {
"accounts": [
"example-accounts"
],
"admin": [
"example-admin"
]
}
}
}
}
函数中的index.js
import {https} from 'firebase-functions'
const dev = process.env.NODE_ENV !== 'production'
const app = require('next')({dev, conf: {distDir: 'next'}})
const handle = app.getRequestHandler()
const accounts = https.onRequest((req, res) =>
app.prepare().then(() => handle(req, res)))
const admin = https.onRequest((req, res) =>
app.prepare().then(() => handle(req, res)))
export {accounts, admin}
next.config.js 将其移至根文件夹
module.exports = {
distDir: '../../../dist/functions/next'
}
所有应用程序均呈现默认帐户应用程序。希望管理员呈现管理应用程序。
最佳答案
由于您的应用程序目录中有不同的文件夹作为管理员和帐户,因此当您为每个文件夹进行构建时,next.js 始终考虑您正在构建的最后一个构建并为最后一个构建的页面提供服务,以便克服这个问题问题是我们必须在不同的目录中为管理员创建构建,该目录将是
dist/functions/admin/next
对于客户来说,目录将是
dist/functions/accounts/next
您必须为此定义不同的 distDir,以便在提供页面时它将在指定的目录中查找,因此请更改您的
next.config.js 用于管理
module.exports = {
distDir: '../../../dist/functions/admin/next'
}
帐户的 next.config.js
module.exports = {
distDir: '../../../dist/functions/accounts/next'
}
将此 next.config.js 分别保存在 src/apps/admin 和 src/apps/customer 目录中 并更改您的
函数中的index.js
import {https} from 'firebase-functions'
const dev = process.env.NODE_ENV !== 'production'
const appAdmin = require('next')({dev, conf: {distDir: 'admin/next'}});
const appAccounts= require('next')({dev, conf: {distDir: 'accounts/next'}});
const handle = app.getRequestHandler()
const accounts = https.onRequest((req, res) =>
appAccounts.prepare().then(() => handle(req, res)))
const admin = https.onRequest((req, res) =>
appAdmin.prepare().then(() => handle(req, res)))
export {accounts, admin}
关于javascript - 如何使用 Nextjs 设置 Firebase 托管多站点,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54600401/