将Vue/Nuxt应用作为具有SSR的通用应用程序部署到Firebase

17

我正试图将我的 Universal Nuxt.js 应用部署到 Firebase。所有关于如何做这件事的信息似乎都已经过时了,而且我无法完全使其正常工作。

SSR似乎可以正常工作,静态资产也被托管。但是中间件(例如,当通过SSR首次加载时)只在客户端上执行,而不在服务器上执行,在使用Firebase函数/托管(或使用 firebase serve)部署时存在此问题。

我有以下项目结构:

project
└─ /functions (firebase functions including `nuxt/` built files)
└─ /src (nuxt app, using `create-nuxt-app` starter template)
└─ /public (includes static files and built nuxt client files)
└─ firebase.json

src/nuxt.config.js 中设置构建选项

mode: 'universal',
...
buildDir: process.env.NODE_ENV === 'development' ? '.nuxt' : '../functions/nuxt',
build: {
  publicPath: process.env.NODE_ENV === 'development' ? '/public/' : '/',
  extractCSS: true,

  ...
}

functions/package.json 中设置使用 Node v8 版本。

"engines": {
  "node": "8"
},
...

将以下内容添加到functions/index.js

const functions = require('firebase-functions');

const admin = require('firebase-admin')
const { Nuxt } = require('nuxt')
const express = require('express')

const app = express()

// Set Nuxt.js options
const config = {
  dev: false,
  buildDir: 'nuxt',
  build: {
    publicPath: '/'
  },
}

const nuxt = new Nuxt(config)

function handleRequest(req, res) {
  res.set('Cache-Control', 'public, max-age=300, s-maxage=600')
  nuxt.renderRoute('/')
    .then(result => {
      res.send(result.html)
    })
    .catch(e => {
      res.send(e)
    })
}
app.get('*', handleRequest)
exports.nuxtapp = functions.https.onRequest(app)

firebase.json中指示Firebase使用此函数

"rewrites": [
  {
    "source": "**",
    "function": "nuxtapp"
  }
]

我还从 src/package.json 添加了所有依赖项到 functions/package.json

src 文件夹中的 npm run build 命令会将已构建的 Nuxt 客户端文件 (firebase/nuxt/dist/client/*) 和应用程序的静态文件 (src/static/*) 复制到 public 文件夹中,然后再进行部署(用于 Firebase 静态托管和 CDN)。

使用这个设置,在 Firebase 上部署时静态资源托管和 SSR 似乎都能正常工作,但是当使用 Firebase 函数进行服务器端渲染时,middleware/asyncData/nuxtServerInit/etc 没有被执行。

例如,当在本地 dev 模式下运行 (npm run dev) 时,中间件的行为符合预期。

我错过了什么或做错了什么,无法在 Firebase 上运行它?

谢谢!


2
我找到了这个教程,它可能会对你有所帮助:https://dev.to/kiritchoukc/deploy-nuxt-on-firebase-4ad8 - Valentin
1
你解决了吗? - Jonathan Arias
我之前从未尝试过,但在一周内我将尝试完成这个项目。我想我会使用https://nuxtjs.org/docs/2.x/deployment/appengine-deployment。 - user5589998
这是我第一次尝试部署应用程序,所以我不是专家,但我读到的一些东西是 SSR 的 cold start 调用函数可能需要一段时间,这对 SEO 不好,而且 Firebase 函数对于这些计算时间可能不是非常经济。 - user5589998
我已经成功让它工作了,为了避免冷启动调用,我使用了像“uptimeRobot”这样的服务,每6/7分钟会ping我的网站,从而将其降至最低。我对结果感到非常满意。 - Luigi
显示剩余4条评论
1个回答

0

如果您正在使用Nuxt 2.12>,则您的nuxt.config.js文件不需要具有“mode”属性。只需使用target: https://nuxtjs.org/docs/configuration-glossary/configuration-target/(静态也适用于SSR)

您的middleware目录用于放置您想要在客户端和SSR中执行的中间件,以便每个用户访问的页面都能够使用。但是,如果您正在寻找一种与云函数配合使用的服务器中间件,则可以使用Nuxt服务器中间件:https://nuxtjs.org/docs/configuration-glossary/configuration-servermiddleware/

(有关中间件与服务器中间件的详细信息,请查看此文档)


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接