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

MetaMask不再注入web3,如何正确加载web3?

MetaMask不再自动注入web3时的正确web3加载方式

MetaMask现在已经不再默认注入web3.js,官方推荐遵循EIP-1193标准,通过window.ethereum对象来和钱包交互。你原来的代码里window.ethereum.enable()已经被废弃,下面是修正后的实现:

async function loadWeb3() {
  let web3Instance;
  // 优先使用EIP-1193标准的window.ethereum(MetaMask当前推荐方式)
  if (window.ethereum) {
    try {
      // 请求用户授权连接钱包,替代废弃的enable()方法
      await window.ethereum.request({ method: 'eth_requestAccounts' });
      // 初始化web3实例
      web3Instance = new Web3(window.ethereum);
    } catch (error) {
      // 处理用户拒绝授权的情况
      console.error('用户拒绝了钱包授权:', error);
      return null;
    }
  } 
  // 兼容极少数还保留旧web3注入的环境(可选)
  else if (window.web3) {
    web3Instance = new Web3(window.web3.currentProvider);
  } 
  // 没有检测到以太坊钱包
  else {
    alert('未检测到以太坊兼容浏览器/钱包,请尝试安装MetaMask');
    return null;
  }
  return web3Instance;
}

// 使用示例
// loadWeb3().then(web3 => {
//   if (web3) {
//     // 在这里使用web3实例进行后续操作,比如获取账户、调用合约等
//     web3.eth.getAccounts().then(accounts => console.log('当前账户:', accounts[0]));
//   }
// });

关键修正点:

  • 替换了废弃的window.ethereum.enable(),改用标准的eth_requestAccounts方法请求授权
  • 不再污染全局的window.web3,改用局部变量存储web3实例,避免冲突
  • 添加了错误捕获,处理用户拒绝授权的场景
  • 代码结构更清晰,后续使用时可以直接拿到返回的web3实例

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.17 22:05:20