在 nextjs 中,“/api”路由的代码是否会随时出现在浏览器中?如果是这样,有没有办法强制仅在服务器端执行?

In nextjs, does the code for "/api" routes end up in the browser at any point? If so Is there a way to force server-side-only execution?

我刚刚意识到 nextjs 环境变量的这种行为 here,这与 nodejs 应用程序通常的设置方式不同:

Note: .env files should be included in your repository, and .env*.local should be in .gitignore, as those files are intended to be ignored. Consider .local files as a good place for secrets, and non-local files as a good place for defaults.

所以我正在考虑限制自己使用仅在构建时可用的秘密,以便在 "backend" /api 路由中使用。

但是 /api 路由甚至表现得像真正的后端吗?由于 nextjs 是 SSR 仅当它必须是 (?) 时,我推测此 /api 代码也可能最终出现在浏览器中,因此暴露了秘密?有没有办法强制代码仅 运行 服务器端而不是浏览器内?我是 SSR 概念的新手。我的 "real" 后端暂时不会启动。这不是一个非常重要的秘密,但仍然如此。谢谢

API 路由不会最终出现在客户端包中,因此您放入 /pages/api 中的任何代码都将对用户隐藏。这些路由旨在 运行 专门用于服务器环境。

相同的概念适用于 getStaticProps,它在构建期间仅 运行 在服务器上。

NextJS 有一种叫做“内联环境变量”的机制。对以 NEXT_PUBLIC_ 开头的环境变量的任何引用都将自动替换为它们的值。因此,如果您的 local/build/production 机器设置了变量 NEXT_PUBLIC_APPNAME,NextJS 将用变量的值替换对 process.env.NEXT_PUBLIC_APPNAME 的引用。

或者您可以在 .env 文件中定义变量。这些也将被您的应用程序使用,如果您在客户端呈现的任何代码中引用它们(例如 pages/about.js 中的 JSX),它们可能最终会出现在您的客户端包中。

结论:秘密应该添加到.env,并且只能在服务器端代码中引用,如API路由和getStaticProps

您可能也对这个工具感兴趣:https://next-code-elimination.vercel.app/

它可以让您验证您的服务器端代码不在客户端包中。