【发布时间】:2021-10-11 07:22:17
【问题描述】:
按照一些教程 like this one,我能够将我的 Next.js 应用程序部署到 Firebase 托管/功能。这是我的项目的简化文件夹结构:
myApp
node_modules // Next.js app dependencies
.next // destination of npm run build of the Next.js project
pages // Next.js pages
functions
lib // this is where the functions compile
node_modules // functions' dependencies
src
app.ts
index.ts
other.ts
package.json
public // Next.js app public files
firebase.json
package.json
...
当我运行firebase deploy 时,它会将functions 编译到其lib 文件夹中并成功部署所有内容。
但是,当我尝试访问我的网络应用程序的 url 时,我得到了Error: could not handle the request。当我查看 Firebase 函数日志时,我可以看到一条错误消息 Error: Cannot find module 'react'。所以,我又成功地将react 添加到functions/package.json、npm install 和firebase deploy。然而,另一个错误,但这次是Cannot find module 'react-dom'。
我的理解是,这样做的原因是我的 Next.js 应用程序依赖于我的 package.json 在我的 root 文件夹中列出的所有依赖项(下面的简化列表):
"dependencies": {
"babel-plugin-prismjs": "^2.1.0",
"firebase": "^8.8.1",
"firebase-admin": "^9.11.0",
"formik": "^2.2.9",
"js-cookie": "^3.0.0",
"next": "11.0.1",
"next-i18next": "^8.5.5",
"nookies": "^2.5.2",
"prismjs": "^1.24.1",
"react": "17.0.2",
"react-dom": "17.0.2",
"react-ga": "^3.3.0",
"react-select": "^4.3.1",
"react-spinners": "^0.11.0",
"react-transition-group": "^4.4.2",
"recharts": "^2.0.10",
"styled-components": "^5.3.0",
"yup": "^0.32.9"
}
而我的functions/package.json 显然要短得多:
"dependencies": {
"@sendgrid/mail": "^7.4.4",
"firebase-admin": "^9.8.0",
"firebase-functions": "^3.14.1",
"next": "^11.0.1",
"react": "^17.0.2"
}
我假设错误会要求我将所有依赖项复制到 functions/package.json 文件中,这显然是我不想要的。
或者,我可以将firebase-functions 和其他相关依赖项从functions/package.json 添加到root/package.json,并在根文件夹中设置下一个服务器。但是,如何包含其他现有的云功能?
我的functions/src 文件的内容如下所示:
index.ts
import * as admin from 'firebase-admin'
admin.initializeApp()
export * from './app' // next.js
export * from './other'
other.ts
import * as functions from 'firebase-functions'
import * as admin from 'firebase-admin'
exports.onUserCreate = functions.database.ref...
// my other cloud functions, such as db triggers, https functions, etc.
app.ts
import next from 'next'
import {https} from 'firebase-functions'
const server = next({
dev: process.env.NODE_ENV !== 'production',
conf: {distDir: '.next'}
})
const nextjsHandler = server.getRequestHandler()
exports.app = https.onRequest(async (req, res) => {
await server.prepare()
return await nextjsHandler(req, res)
})
另外,这是我的firebase.json:
{
"functions": {
"predeploy": [
"npm --prefix \"$RESOURCE_DIR\" run lint",
"npm --prefix \"$RESOURCE_DIR\" run build"
]
},
"hosting": {
"target": "myApp",
"public": "public",
"ignore": ["firebase.json", "**/.*", "**/node_modules/**"],
"rewrites": [{
"source": "**",
"function": "app"
}]
}
}
如何正确部署Next.js 应用并确保我的其他云功能继续工作?
谢谢!
【问题讨论】:
标签: firebase google-cloud-functions next.js