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

Next.js中ZAFClient.init()无法使用,求解决方法

解决Next.js中ZAFClient未定义的问题

问题原因

你遇到的ReferenceError: ZAFClient is not defined,是因为Next.js的<Script>组件默认采用异步加载策略,而你的useEffect在组件挂载后立即执行,此时Zendesk ZAF SDK脚本还未加载完成,全局变量ZAFClient还不存在。

解决方案

方案1:利用Script组件的onLoad回调标记加载状态

通过onLoad回调确认SDK加载完成后,再执行相关API调用逻辑:

import { Script, useEffect, useState } from 'next/script';

export default function ZendeskAppComponent() {
  const [isZafReady, setIsZafReady] = useState(false);

  useEffect(() => {
    if (isZafReady) {
      getRequester();
    }
  }, [isZafReady]);

  const getRequester = async () => {
    console.log("indexjs getRequester");
    const client = ZAFClient.init();
    client.invoke("resize", { width: "100%", height: "600px" });
    const ticketData = await client.get("ticket");
    // 处理获取到的工单数据
    console.log('工单信息:', ticketData);
  };

  return (
    <div>
      <Script
        type="text/javascript"
        src="https://static.zdassets.com/zendesk_app_framework_sdk/2.0/zaf_sdk.min.js"
        onLoad={() => setIsZafReady(true)}
      />
      {/* 你的组件内容 */}
    </div>
  );
}

方案2:直接在onLoad中执行SDK逻辑

如果不需要在组件其他地方复用SDK实例,可以直接把API调用写在onLoad回调里:

import { Script } from 'next/script';

export default function ZendeskAppComponent() {
  return (
    <div>
      <Script
        type="text/javascript"
        src="https://static.zdassets.com/zendesk_app_framework_sdk/2.0/zaf_sdk.min.js"
        onLoad={() => {
          const client = ZAFClient.init();
          client.invoke("resize", { width: "100%", height: "600px" });
          client.get("ticket").then(ticketData => {
            console.log('工单信息:', ticketData);
            // 处理数据逻辑
          });
        }}
      />
      {/* 你的组件内容 */}
    </div>
  );
}

方案3:全局预加载SDK(推荐用于全页面依赖的场景)

如果你的整个应用都依赖ZAF SDK,可以在_app.js中使用strategy="beforeInteractive"加载脚本,这样脚本会在页面交互前完成加载,子组件中可以直接使用ZAFClient:

// pages/_app.js
import { Script } from 'next/script';

export default function MyApp({ Component, pageProps }) {
  return (
    <>
      <Script
        type="text/javascript"
        src="https://static.zdassets.com/zendesk_app_framework_sdk/2.0/zaf_sdk.min.js"
        strategy="beforeInteractive"
      />
      <Component {...pageProps} />
    </>
  );
}

此时你的业务组件可以直接在useEffect中调用SDK:

import { useEffect } from 'react';

export default function ZendeskAppComponent() {
  useEffect(() => {
    getRequester();
  }, []);

  const getRequester = async () => {
    const client = ZAFClient.init();
    client.invoke("resize", { width: "100%", height: "600px" });
    const ticketData = await client.get("ticket");
    console.log('工单信息:', ticketData);
  };

  return <div>你的组件内容</div>;
}

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.22 17:54:26