使用@walletconnect/client报is not a constructor错误如何解决
错误诱发原因
- 核心原因是
@walletconnect/client版本迭代带来的导出规则不兼容:1.x版本为CommonJS默认导出,直接导入即可拿到构造函数;2.x版本为ESM规范导出,且做了大量API破坏性变更,使用require()直接导入时拿到的是模块元对象,不存在可直接实例化的构造函数,调用new就会抛出该错误。另外官方v2版本已将核心连接能力拆分到@walletconnect/sign-client包,原@walletconnect/clientv2版本API和v1完全不通用。 - 少数情况是项目构建配置的模块解析逻辑异常,比如打包工具错误处理ESM与CommonJS的转换规则,导致导入的内容和预期不符。
排查与修复步骤
- 第一步先确认本地安装的包版本,执行以下命令查看版本号:
npm ls @walletconnect/client
- 如果版本号为1.x开头:检查是否存在模块别名、路径映射配置导致导入的不是包本身的默认导出,可先删除
node_modules目录和包锁文件(package-lock.json/yarn.lock/pnpm-lock.yaml),重新执行依赖安装命令后重试。 - 如果版本号为2.x开头,根据业务需求二选一修复:
- 适配v2官方推荐方案:卸载旧包,安装v2核心依赖包
注意v2初始化是异步方法,不能直接同步new实例,参考代码如下:npm uninstall @walletconnect/client npm install @walletconnect/sign-client// ESM环境导入 import SignClient from '@walletconnect/sign-client' // CommonJS环境导入需要取default属性 // const SignClient = require('@walletconnect/sign-client').default const createConnector = async () => { const connector = await SignClient.init({ projectId: '你的WalletConnect项目ID', // 其余配置按业务需求填写 }) // 传入连接uri完成配对 await connector.pair({ uri }) return connector }- 沿用v1版本写法:将包降级到v1最后一个稳定版本即可,不需要修改原有业务代码
npm install @walletconnect/client@1.8.0 - 如果重新安装依赖、调整版本后仍报错,检查打包工具(Webpack/Vite/Rollup等)的模块解析配置,关闭对
@walletconnect相关包的强制模块转换规则,避免篡改包的原生导出结构。
内容的提问来源于stack exchange,提问作者Clearshine
相关产品推荐
相关产品推荐

