我是NextJs的新手,当我试图将我的项目部署到Vercel时,我收到了以下错误:
错误!"无服务器功能";api/auth";是50.55mb,超过了50mb的最大大小限制。
我花了很多时间试图找到一个合适的答案,但没有找到。以下是我正在进行的api请求的代码:
const { auth: adminAuth } = require("firebase/admin");
export default async function auth(req, res) {
const tokenId = req.query.token;
return new Promise((resolve) => {
adminAuth
.verifyIdToken(tokenId)
.then((user) => {
res.json(user);
resolve();
})
.catch(() => {
res.status(302).send("Invalid authentication");
resolve();
});
});
}
如果有人能帮助我,我将非常感激,谢谢你们!
我一直在处理同样的问题。捆绑无服务器功能时,vercel似乎正在引入项目中的所有资产。因此50.55MB可能相当于您当前整个构建的大小。我正在研究如何只在vercel.json中包含某些文件,但到目前为止还没有弄清楚如何做到这一点。现在,你可能只需要从你的公共资产中删除一些文件就可以达到限制。
这可能是由于firebase/admin
包括firebase
包中的所有内容,而不仅仅是";管理员";零件。
您可以通过仅使用导入创建一个文件并运行@vercel/nft
来跟踪文件来验证这一点。
npm init -y
npm add firebase
echo "const { auth: adminAuth } = require('firebase/admin')" > index.js
npm i -g @vercel/nft
nft print index.js
整个firebase
包相当大,因此最好遵循firebase团队的建议,在Serverless Functions中使用firebase-admin
包。
此SDK(
firebase
(适用于从Web、移动Web(例如React Native、Ionic(、Node.js桌面(例如Electron(或运行Node.js的物联网设备等环境访问最终用户客户端。如果您对使用Node.js SDK感兴趣,该SDK允许您从特权环境(如服务器(进行管理访问,则应使用Firebase admin Node.js(firebase-admin
(。来源:火球NPM
Next.js 12.3包括您在package.json
中指定的依赖项以及它们在构建中的依赖项,因此可能会增加构建大小,直到达到当前50MB的最大值。
在我的案例中,是pdfjs-dist
包将canvas
作为依赖项。将pdfjs-dist
列为package.json
中的依赖项就足以使Vercel构建失败。即使您真的从包中导入了任何文件,这也无关紧要。
Error: The Serverless Function "api/***" is 64.75mb which exceeds the maximum size limit of 50mb.
找出罪魁祸首
Vercel构建日志应列出构建中包含的包及其大小。在我们的案例中:
All dependencies 208.68 MB 57.14 MB
Serverless Function's page: api/***
Large Dependencies Uncompressed size Compressed size
node_modules/canvas/build 164.01 MB 42.82 MB
node_modules/sharp/vendor 16.13 MB 6.76 MB
...
从构建中排除包
在我们的案例中不需要canvas
依赖项。从捆绑包中排除包,从而减少无服务器功能的大小:
- 使用Next.js 13.3,
next.config.js
中的experimental.outputFileTracingExcludes
密钥应允许排除包
const nextConfig = {
experimental: {
outputFileTracingRoot: path.join(__dirname, '../../'),
outputFileTracingExcludes: {
'*': [
'node_modules/canvas',
],
},
},
}
- 由于我使用的是Next.js 12.3和Yarn,我最终通过在
package.json
中使用以下内容用存根替换了依赖项:
"resolutions": {
"canvas": "https://registry.yarnpkg.com/@favware/skip-dependency/-/skip-dependency-1.2.1.tgz"
}
NPM也应该有类似的解决方案。
将其添加到您的next.config
experimental: {
outputFileTracingIgnores: ["**canvas**"],
},
对于任何出现此错误的人,我发现它是由nextjs引起的,在不需要的时候,它在我的无服务器函数中包含了swc和esbuild依赖项。修复方法是将此添加到我的next.config.js
中
experimental: {
outputFileTracingExcludes: {
'*': [
'node_modules/@swc/core-linux-x64-gnu',
'node_modules/@swc/core-linux-x64-musl',
'node_modules/@esbuild/linux-x64',
],
},
},
在我的案例中,是pdfjs-dist
的canvas
依赖项,向我的package.json
(pnpm(添加覆盖解决了这个问题。
"pnpm": {
"overrides": {
"canvas": "../_EXCLUDED_"
}
},
您可以添加.vercelignore
文件来避免此
参考编号:https://vercel.com/guides/prevent-uploading-sourcepaths-with-vercelignore
# Ignore everything (folders and files) on root only
/*
!api
!vercel.json
!*.html
!*.css