• 介绍
• 扩展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 及其插件会将任何缓慢的导入或初始化延迟到最后一刻。为此,您可以使用 lazyObject
和 hardhat/plugins
中的 lazyFunction
。
src/index.ts
中提供了如何使用它们的示例。
• 依赖项注意事项
知道何时使用 dependency
或 peerDependency
可能很棘手。我们推荐这些[文章](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