Skip to content

钩子系统

重要提示:Yumeri框架目前处于快速迭代阶段,本文档中的API可能随时发生变化。请始终以GitHub仓库中的最新代码为准:https://github.com/yumerijs/yumeri

钩子系统简述

在类似于网站组件化开发的场景中,我们经常需要将一些功能或内容插入到特定的位置,比如页面加载完成之后,或者某个组件渲染完成之后,我们希望在这些时候执行一些特定的代码或添加一些内容,钩子系统应运而生。

使用场景

  • 网页内部添加可扩展控件区域
  • 网页加载完成之后执行特定代码
  • 网页全局插入登录弹窗

钩子使用

注册钩子

在开始之前,我们需要区分两个概念:Hook 点和钩子。

  • Hook 点,指的是一个可以被插入的点位
  • 钩子,指的是插入其中的一段函数

每个 Hook 点和钩子都会有自己的一个名称,在全局范围内,Hook 点的名称是唯一的;在每个 Hook 点的范围内,钩子的名称是唯一的。

typescript
ctx.hook('name', 'hookName', (arg1, arg2, ...) => {
  // 钩子内容
});

执行以上函数,将会在名为 name 的 Hook 点插入一个名为 hookname 的钩子。当 name Hook 点被触发时,hookname 钩子将会被调用。

触发钩子

typescript
const result: any[] = async ctx.excuteHook('name', arg1, arg2, ...);

执行以上函数,将会触发名为 name 的 Hook 点,并依次执行所有注册在 name Hook 点上的钩子,最终将执行结果通过一个数组返回给 result 变量。这个 any 数组是每一个钩子执行完后的返回值集合。

最佳实践

钩子命名规范

从上述表述中可以得出,如果 Hook 点命名不当,将会导致不正确的钩子注册到这个 Hook 点位上,从而导致参数传递格式错误。因此,Hook 点的命名要满足以下规范:

  • Hook 点名称必须保证唯一性
  • Hook 点名称避免使用极短字符
  • Hook 点名称可以使用点字符来表示所属关系以便快速识别

钩子挂载规范

钩子的主要作用有两种:一是插入内容,二是执行代码。为防止出现本该执行代码的区域却错误返回内容,钩子挂载时需要遵循以下规范:

  • 钩子挂载时,必须明确目标 Hook 点的实际作用
  • 钩子挂载时,必须明确目标 Hook 点的参数格式
  • 钩子挂载时,不可返回本不该返回的内容