javascript - 如何使用 Nextjs 设置 Firebase 托管多站点

标签 javascript node.js reactjs firebase-hosting next.js

我正在尝试将 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/adminsrc/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/

相关文章:

javascript - 如何以 Angular 创建新数组

mysql - 在nodejs中使用现有的mysql模式

javascript - Ethereum web3 sendSignedTransaction : Insufficient funds. 该帐户...没有足够的资金。需要 750000000000000 并得到:0

node.js - 无法使用 "npm install"在 Node.js 中安装任何包

javascript - TypeError : Object(. ..) 不是函数 React S3

javascript - 如何在屏幕中间有一个 float 菜单

javascript - 如何正确设置 Ejs Partials

reactjs - 在 React 中,页面加载事件“获取数据”不起作用

javascript - 使用 sibling 之间的数据隐藏子组件

javascript - 将功能应用于当前点击并删除其他点击的功能