如何使用 Web3.js 将 Metamask 连接到 Angular App?

Posted

技术标签:

【中文标题】如何使用 Web3.js 将 Metamask 连接到 Angular App?【英文标题】:How to connect Metamask to Angular App using Web3.js? 【发布时间】:2021-07-25 02:24:00 【问题描述】:

我刚刚开始探索区块链技术,并在前几天制作了我的第一个智能合约。为了继续,我尝试为智能合约制作前端,但我在使用 web3.js 将我的 Angular 应用程序连接到 Metamask 时遇到了困难。

具体来说,我遇到了一个问题,当我尝试为我的 Angular 应用程序提供服务时,它给了我这个错误:

Error: ./node_modules/eth-lib/lib/bytes.js Module not found: Error: Can't resolve 'crypto' in 'C:\Users\profile\Desktop\Coding\EthSmartContractProject\Frontend\node_modules\eth-lib\lib'

Error: ./node_modules/eth-lib/lib/bytes.js Module not found: Error: Can't resolve 'stream' in 'C:\Users\profile\Desktop\Coding\EthSmartContractProject\Frontend\node_modules\eth-lib\lib'

这是我的 Blockchain.service.ts,我尝试在 Angular 应用程序中处理所有与区块链相关的任务:

import  Injectable  from '@angular/core';
import Web3 from "web3";
declare let window:any;

@Injectable(
  providedIn: 'root'
)
export class ContractService 
  web3: any;
  accounts: Array<String>;

  async loadWeb3() 
    if (window.ethereum) 
        window.web3 = new Web3(window.ethereum);
        await window.ethereum.enable;
     else if (window.web3) 
        window.web3 = new Web3(window.web3.currentProvider);
     else 
        window.alert('Non-Ethereum browser detected. You Should consider using MetaMask!');
    
  

重现步骤:

ng 新项目 npm i web3 创建区块链服务 ng 服务

我尝试实施但没有奏效的解决方案:

在 package.json 中添加 "browser": "crypto": false 使用自定义 webpack 并尝试通过启用 crypto: true 或其他方式“修补”该行为。

我想我知道问题出在哪里,它的依赖项试图导入内置模块的 nodejs。但我不知道如何解决它。

【问题讨论】:

【参考方案1】:

通过在tsconfig.json 中添加此问题解决了这个问题:


  "compilerOptions": 
    "paths" : 
      "crypto": ["./node_modules/crypto-browserify"],
      "stream": ["./node_modules/stream-browserify"],
      "assert": ["./node_modules/assert"],
      "http": ["./node_modules/stream-http"],
      "https": ["./node_modules/https-browserify"],
      "os": ["./node_modules/os-browserify"],
    
  

别忘了安装所需的依赖项:

npm install crypto-browserify stream-browserify assert stream-http https-browserify os-browserify

(更多信息请参见https://github.com/ChainSafe/web3.js/issues/4070#issuecomment-843193781)

【讨论】:

【参考方案2】:

在根文件夹中创建patch.js 并粘贴以下代码并添加脚本package.json,如下所示:

"postinstall": "node patch.js"
const fs = require('fs')
const f = './node_modules/@angular-devkit/build-angular/src/webpack/configs/browser.js'
fs.readFile(f, 'utf8', function(err, data) 
 if (err) 
   return console.log(err)
 
 var result = data.replace(/node: false/g, 'node: crypto: true, stream: true,')
 fs.writeFile(f, result, 'utf8', function(err) 
   if (err) return console.log(err)
 )
);

【讨论】:

【参考方案3】:

这是一个对我有用的解决方法:

转至:node_modules &gt; @angular-devkit &gt; build-angular &gt; src &gt; webpack &gt; configs &gt; browser.js

在文件末尾,将node: false 替换为node: "stream":true, "crypto":true

现在,重新提供或重建 Angular 应用程序。

【讨论】:

【参考方案4】:

解决方案:

我不得不使用 jsdelivr 将其包含在 index.html 文件中,而不是通过 npm 导入 Web3。

<script src="https://cdn.jsdelivr.net/npm/web3@1.3.5/dist/web3.min.js"></script>

【讨论】:

以上是关于如何使用 Web3.js 将 Metamask 连接到 Angular App?的主要内容,如果未能解决你的问题,请参考以下文章

如何使用 web3.js 注销 MetaMask 帐户

如何将 MetaMask 与 Web3.js 版本 1.2.6 连接?

Metamask 停止注入 web3.js

React / Web3:componendDidMount 和 Function 中的不同行为

Web3 JS 库(& Metamask),获取代币余额

Metamask BSC bep20 令牌的 web3 JS 支付按钮