NextJs:Serverless函数超出了50mb的最大大小限制



我是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-distcanvas依赖项,向我的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

相关内容

  • 没有找到相关文章

最新更新