如何通过云功能将 Nuxt SSR 应用部署到 Firebase?

ilr*_*ock 8 firebase vue.js google-cloud-functions nuxt.js

我按照这篇中等文章作为在 firebase 托管上托管我的 nuxt 应用程序的指南。

但是,部署会通过,然后当我访问该url 时,我收到一条Cannot GET /错误消息。如果我检查函数日志,我会看到函数完成时出现 404 错误。

这是我的函数/index.js

const functions = require('firebase-functions')
const admin = require("firebase-admin")
const { Nuxt } = require('nuxt-start')
const nuxtConfig = require('./nuxt.config.js')

admin.initializeApp()

const config = {
  ...nuxtConfig,
  dev: false,
  debug: true,
  buildDir: "nuxt",
  publicPath: "public",
}

const nuxt = new Nuxt(config)

exports.ssrapp = functions.https.onRequest(async (req, res) => {
  await nuxt.ready()
  nuxt.render(req, res)
})
Run Code Online (Sandbox Code Playgroud)

这是firebase配置

{
  "functions": {
    "source": "functions",
    "predeploy": [
      "npm --prefix src run build && rm -rf functions/nuxt && cp -r src/nuxt/ functions/nuxt/ && cp src/nuxt.config.js functions/"
    ]
  },
  "hosting": {
    "predeploy": [
      "rm -rf public/* && mkdir -p public/_nuxt && cp -a src/nuxt/dist/client/. public/_nuxt && cp -a src/static/. public/ && cp -a public_base/. public/"
    ],
    "public": "public",
    "ignore": [
      "firebase.json",
      "**/.*",
      "**/node_modules/**"
    ],
    "rewrites": [
      {
        "source": "**",
        "function": "ssrapp"
      }
    ]
  }
}
Run Code Online (Sandbox Code Playgroud)

项目结构是这样的

/
 /src
 /functions
 /public
 /public_base
Run Code Online (Sandbox Code Playgroud)

当我运行时,firebase deploy我确实看到 /src 的内容被复制到 /functions/nuxt。为了测试,我的/functions/package.json文件也包含了我在/src/package.json文件中的所有依赖

我怎样才能启动并运行这个应用程序?如果您需要更多详细信息,请告诉我。

更新 #1

我尝试使用命令提供托管和功能firebase serve --only functions,hosting -p 5004

像这样运行服务器给了我更多的见解。具体来说,我在加载时收到此警告消息,然后在加载页面时导致实际错误消息。

WARN  Module @firebase/app not found. Silently ignoring module as programatic usage detected
Run Code Online (Sandbox Code Playgroud)

我没有在函数目录中安装这个包,因为我的 src 目录中也没有它。但是,在 /functions 中安装它并重新启动开发服务器后,该警告消息消失了,并且我在页面加载时出现了错误。

我还发现了一些与 vue、vue-server-renderer 和 vue-template-compiler 没有运行相同版本有关的警告。

现在一切似乎都运行良好!

Flo*_*las 3

您的配置和结构看起来正确。

大约一年前,我也用我的应用程序做到了这一点,并且遇到了同样的问题。它与功能代码本身有关。我也尝试过使用nuxt.render(req, res)Docs),但它对我来说从来没有用,所以我最终使用nuxt.renderRoute(route)Docs)代替。这工作得很好。

您可以将代码更改为如下所示:

const { Nuxt } = require('nuxt')

...

exports.ssrapp = functions.https.onRequest(async (req, res) => {
  await nuxt.ready()

  const result = await nuxt.renderRoute(req.path) // Returns { html, error, redirected }
  res.send(result.html) // Sends html as response
})
Run Code Online (Sandbox Code Playgroud)

这对我有用。不过,您应该考虑捕获任何错误。我希望这能解决您的问题。

这只是一种解决方法,如果有人知道为什么nuxt.render不起作用,我很想知道。因此我在我的应用程序上浪费了很多时间......