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
相关产品推荐
相关产品推荐

