11E 以太坊 ethereum hardhat : 构建插件

介绍
扩展Hardhat运行时环境
使用 Hardhat TypeScript 插件样板
从你的插件中抛出错误
优化你的插件以获得更好的启动时间
依赖项注意事项
hardhat Tutorials , hardhat 教程
Contact 联系方式

• 介绍

在本节中,我们将探索为 Hardhat 创建插件,这是集成其他工具和扩展内置功能的关键组件。

插件是一些可重用的配置。您可以在插件中执行的任何操作也可以在您的配置文件中完成。您可以在配置文件中测试您的想法,然后在准备好后将它们移动到插件中。

在开发插件时,可用于集成新功能的主要工具是扩展 Hardhat Runtime Environment、扩展 Hardhat 配置、定义新任务和覆盖现有任务,这些都是配置通过代码实现的操作。

您可以通过创建插件来实现的一些示例是:在“检查”任务运行时运行 linter,为不同的文件使用不同的编译器版本或为您的合约生成 UML 图。

• 扩展Hardhat运行时环境

让我们来看看创建一个插件的过程,这个插件可以为 Hardhat 运行时环境添加新功能。通过这样做,我们确保我们的新功能随处可用。这意味着您的插件用户可以从任务、测试、脚本和安全帽控制台访问它。

Hardhat 运行时环境 (HRE) 通过扩展函数队列进行配置,您可以使用 extendEnvironment() 函数添加这些函数。它接收一个参数,这是一个回调,将在 HRE 初始化后执行。如果 extendEnvironment 被多次调用,它的回调会按顺序执行。

例如,将以下内容添加到 hardhat.config.js 中:

extendEnvironment((hre) => {
  hre.hi = "Hello, Hardhat!";
});

将在环境可访问的任何地方提供“hi”。

extendEnvironment((hre) => {
  hre.hi = "Hello, Hardhat!";
});

task("envtest", async (args, hre) => {
  console.log(hre.hi);
});

module.exports = {};

将产生:

$ npx hardhat envtest
Hello, Hardhat!

从字面上看,这就是为 Hardhat 组装一个插件所需的全部内容。现在 hi 可用于 Hardhat 控制台、您的任务、测试和其他插件。

• 使用 Hardhat TypeScript 插件样板

有关插件的完整示例,您可以查看 Hardhat TypeScript 插件样板项目

插件不需要用 TypeScript 编写,但我们建议这样做,因为我们的许多用户都使用它。在 JavaScript 中创建插件可能会导致他们的体验不佳。

• 扩展神罗

要了解如何在 TypeScript 中成功扩展 HRE,并为您的用户提供有关您的扩展的类型信息,请查看 [src/index.ts](https 😕/github.com/nomiclabs/hardhat-ts-plugin-boilerplate/blob/master/src/index.ts) 并阅读 Extending the HRE 文档。

确保在主文件中保留类型扩展名,因为该约定用于不同的插件。

• 扩展安全帽配置

样板项目还有一个关于如何扩展安全帽配置的示例。

我们强烈建议在 TypeScript 中执行此操作并正确扩展配置类型。

可以在 [src/index.ts](https://github.com/nomiclabs/hardhat-ts-plugin-boilerplate/blob/master/src/index 中找到有关如何向 Hardhat 配置添加字段的示例.ts)。

• 从你的插件中抛出错误

为了在错误意味着中断任务执行时向您的用户显示更好的堆栈跟踪,请考虑抛出 HardhatPluginError 错误,该错误可以在 hardhat/plugins 中找到。

如果您的错误源于您的用户代码,例如调用您的某个函数的测试或脚本,则不应使用“HardhatPluginError”。

• 优化你的插件以获得更好的启动时间

缩短启动时间对于提供良好的用户体验至关重要。

为此,Hardhat 及其插件会将任何缓慢的导入或初始化延迟到最后一刻。为此,您可以使用 lazyObjecthardhat/plugins 中的 lazyFunction

src/index.ts 中提供了如何使用它们的示例。

• 依赖项注意事项

知道何时使用 dependencypeerDependency 可能很棘手。我们推荐这些[文章](https://lexi-lambda.github.io/blog/2016/08 /24/understanding-the-npm-dependency-model/) 了解它们的区别。

如果您仍有疑问,这些可能会有所帮助:

  • 经验法则 #1: Hardhat 必须是对等依赖项。

  • **经验法则#2:**如果你的插件 P 依赖于另一个插件 P2,P2 应该是 P 的对等依赖项,而 P2 的对等依赖项应该是 P 的对等依赖项。

  • 经验法则 #3: 如果您有一个非安全帽依赖项,您的用户可能会 require(),它应该是对等依赖项。

  • 经验法则 #4: 每个 peerDependency 也应该是 devDependency

挂钩到用户的工作流程

要集成到用户现有的工作流程中,我们建议插件作者在有意义的时候覆盖内置任务。

建议的覆盖示例如下:

  • 预处理智能合约应覆盖“编译”子任务之一。
  • Linter 集成应该覆盖 check 任务。
  • 生成中间文件的插件应该覆盖 clean 任务。

有关所有内置任务和子任务的列表,请查看 [task-names.ts](https://github.com/nomiclabs/hardhat/blob/master/packages/hardhat-core/src /builtin-tasks/task-names.ts)

• hardhat Tutorials , hardhat 教程

CN 中文 Github hardhat 教程 : github.com/565ee/hardhat_CN
CN 中文 CSDN hardhat 教程 : blog.csdn.net/wx468116118
EN 英文 Github hardhat Tutorials : github.com/565ee/hardhat_EN

• Contact 联系方式

Homepage : 565.ee
微信公众号 : wx468116118
微信 QQ : 468116118
GitHub : github.com/565ee
CSDN : blog.csdn.net/wx468116118
Email : 468116118@qq.com

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

wx468116118

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值