为何Hardhat测试与React前端中ethers导入方式存在差异
ethers两种导入方式的差异与适用场景
核心逻辑差异
两种写法的区别不只是模块语法不同,导入的根本就不是同一个对象:
const { ethers } = require("hardhat")是Node.js原生支持的CommonJS模块导入语法,导入的是Hardhat框架深度封装过的ethers实例。Hardhat启动时会把hardhat.config.js里配置的网络参数、预生成的测试账户、合约编译后的ABI/字节码、本地测试节点连接信息全部绑定到这个实例上,不需要开发者手动初始化provider、signer就能直接调用部署合约、发送测试交易、查询链上状态的方法。import { ethers } from "ethers"是ESModule(ESM)标准的导入语法,导入的是ethers.js官方发布的原生库实例。React前端代码最终运行在用户浏览器中,构建工具默认适配ESM规范,且浏览器环境不存在Hardhat的运行时上下文,没有预配置的测试节点和账户,必须手动对接用户钱包(比如MetaMask注入的provider)、初始化合约实例才能正常交互。
适用场景
两种导入方式完全不能互换,各自有严格的使用边界:
- Hardhat封装版ethers:仅适用于跑在Hardhat运行环境内的脚本,包括
npx hardhat test执行的测试脚本、npx hardhat run执行的部署脚本、自定义Hardhat任务脚本。这个版本的ethers绑定了Hardhat开发环境的所有预设配置,能大幅减少本地开发、测试、部署阶段的重复配置工作。踩坑提示:不要在前端代码中导入hardhat包内的ethers,hardhat是Node端开发依赖,内置大量Node原生API,打包到前端会直接触发构建错误,包体积也完全不符合前端性能要求。
- 原生ethers.js:适用于所有脱离Hardhat运行时的场景,最常见的就是React/Vue等框架开发的DApp前端代码,也包括独立运行的Node.js服务端脚本。这个版本没有绑定任何预设环境配置,可以自由对接任意公链RPC、传入任意签名者,灵活性更高,同时适配浏览器和独立Node运行环境。
内容的提问来源于stack exchange,提问作者SHADAB IQBAL
相关产品推荐
相关产品推荐

