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

使用keycloak-js15.0.1对接Keycloak15的React应用提示window未定义错误

错误根因

这个报错的核心原因是你的React应用启用了服务端渲染(SSR),Node.js服务端运行环境不存在浏览器专属的window全局对象,而keycloak-js@15.0.1本身是纯客户端SDK,代码底层直接依赖window对象完成初始化,服务端侧直接导入执行就会触发该错误。

解决方案

  • 方案1:仅在客户端侧导入初始化keycloak-js(最推荐)
    避开服务端渲染阶段加载该SDK,仅在浏览器端执行的生命周期中动态导入:
    // React 函数组件示例
    import { useEffect, useState } from 'react'
    
    function App() {
      const [keycloak, setKeycloak] = useState(null)
    
      useEffect(() => {
        // 仅客户端会执行useEffect回调
        const init = async () => {
          const Keycloak = (await import('keycloak-js')).default
          const instance = new Keycloak({
            url: '你的keycloak地址',
            realm: '你的realm',
            clientId: '你的clientId'
          })
          await instance.init({ onLoad: 'check-sso' })
          setKeycloak(instance)
        }
        init()
      }, [])
    
      // 未初始化完成前可以加载loading态
      if (!keycloak) return <div>加载中...</div>
      return <div>你的应用内容</div>
    }
    
    如果你用的是Next.js框架,也可以使用dynamic导入直接关闭组件的服务端渲染:
    import dynamic from 'next/dynamic'
    const KeycloakProvider = dynamic(() => import('../components/KeycloakProvider'), {
      ssr: false,
      loading: () => <div>加载中...</div>
    })
    
  • 方案2:服务端逻辑改用服务端适配包
    如果你需要在服务端完成Keycloak相关的鉴权、接口调用逻辑,不要使用keycloak-js,改用Keycloak官方提供的服务端SDK,例如Node.js环境可以使用@keycloak/keycloak-admin-client。
  • 方案3:服务端模拟window对象(临时调试用,不推荐)
    可以在服务端入口文件最顶部添加模拟代码,提前给全局注入空的window对象避免导入报错,但是该方案可能引发后续其他浏览器API调用异常,仅适合临时排查问题:
    // server-build/index.js 最顶部添加
    if (typeof window === 'undefined') {
      global.window = {}
    }
    

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.07 08:51:04