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

Next.js+TypeScript构建失败:未找到cloudinary变量

解决Next.js + TypeScript集成Cloudinary Media Library构建报错「Cannot find name 'cloudinary'」

这个问题的核心是TypeScript静态类型检查无法识别全局注入的cloudinary变量——开发环境中浏览器已经加载了Cloudinary的脚本,全局对象上存在cloudinary所以运行正常,但构建时TS会做预检查,不知道这个变量的存在,因此抛出错误。

下面是两种可行的解决方法:

方法一:声明全局类型(推荐,类型安全)

在项目根目录创建一个类型声明文件,比如types/cloudinary-media-library.d.ts,写入以下内容:

declare var cloudinary: {
  createMediaLibrary: (
    config: {
      cloud_name: string;
      api_key: string;
      multiple?: boolean;
    },
    handlers: {
      insertHandler: (data: { assets: Array<{ url: string }> }) => void;
    }
  ) => { show: () => void };
};

然后确保你的tsconfig.json中包含该类型目录,比如:

{
  "include": ["types/**/*.d.ts", "src/**/*"]
}

这样TypeScript就能识别cloudinary的类型,原代码无需修改即可通过构建。

方法二:通过window对象访问(快速解决)

直接将代码中的cloudinary替换为(window as any).cloudinary,利用window全局对象绕过TS的类型检查:

<Script
  id="cloudinary"
  defer
  src="https://media-library.cloudinary.com/global/all.js"
  onReady={() => {
    widgetRef.current = (window as any).cloudinary.createMediaLibrary(
      {
        cloud_name: "<cloud name here>",
        api_key: "<api key here>",
        multiple: false,
      },
      {
        insertHandler: (data) => {
          const selectedImage = { ...data.assets[0] };
          form.setFieldValue("image", selectedImage.url);
        },
      }
    );

    setWidgetReady(true);
  }}
></Script>

额外优化:完善widgetRef类型

为了让按钮点击时的类型更安全,建议给widgetRef指定类型:

const widgetRef = useRef<{ show: () => void } | null>(null);

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.31 04:09:27