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
相关产品推荐
相关产品推荐

