You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Prisma代码中declare let global的疑问:global是否来自Prisma?

理解这段Prisma客户端代码

先拆解代码各部分的作用:

  • import { PrismaClient } from "@prisma/client";
    从Prisma自动生成的客户端包中导入核心的PrismaClient类,这是后续操作数据库的入口。

  • declare let global: { prisma: PrismaClient };
    这是TypeScript的类型声明语句,和Prisma本身没有关系——它只是在告诉TypeScript编译器:当前环境的全局对象上,存在一个名为prisma的属性,其类型为PrismaClient。

关于global的核心疑问

这里的global不是Prisma提供的变量,它是Node.js运行环境自带的全局对象(浏览器环境对应window,现代JS环境可以统一用globalThis)。

开发者写这段声明的核心目的,是为了配合PrismaClient单例模式解决开发环境的问题:
像Next.js、NestJS这类框架在开发时会开启热重载,代码变动时会频繁重启模块。如果每次模块重启都新建PrismaClient实例,会快速耗尽数据库的连接数。所以大家会把PrismaClient实例挂载到全局对象上——全局对象不会随模块热重载被销毁,这样就能复用已有的实例,避免连接爆炸。

完整的典型用法参考

通常这段声明会配合如下代码使用:

import { PrismaClient } from "@prisma/client";

declare let global: { prisma: PrismaClient };

let prisma: PrismaClient;

if (process.env.NODE_ENV === "production") {
  // 生产环境直接新建实例,无需复用
  prisma = new PrismaClient();
} else {
  // 开发环境复用全局对象上的实例
  if (!global.prisma) {
    global.prisma = new PrismaClient();
  }
  prisma = global.prisma;
}

export default prisma;

总结

  • declare let global:... 只是TypeScript的类型提示,避免编辑器报“全局对象上不存在prisma属性”的类型错误。
  • global是Node.js的全局对象,和Prisma无关,这里只是借用来存储单例的PrismaClient实例,解决开发环境热重载导致的数据库连接过多问题。

内容的提问来源于stack exchange,提问作者Gary

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.05 03:25:30