Skip to content

生命周期

字数
662 字
阅读时间
3 分钟

停用插件

ts
// 加载插件
const  = .({
  () {},
})

// 停用这个插件
.()

清理副作用 (Side Effects)

IPE 的插件都是可热插拔的,这意味着你也许需要手动清理副作用。

什么是副作用?副作用是指插件在启动后,产生的一些不可逆的影响。

比如,我们的插件在工具盒中添加了一个按钮,插件卸载之后它依然存在,而且点击它之后有可能会搞出报错。这就是一种副作用。

那么作为负责任的开发者,我们需要在插件卸载时移除这个按钮:

ts
.({
  : ['toolbox'],
  () {
    ..({
      : 'my-first-plugin',
      : '👋',
      : 'My First Plugin',
      : () => {
        ('hello, world')
      },
    })

    .('dispose', () => {                     
      ..('my-first-plugin') 
    })                                            
  },
})

如果你正确使用了插件上下文 ctx,而不是直接操作 InPageEdit 的实例,那么在插件中注册的事件监听器、注入的服务等都会在插件卸载时自动清理,无需手动处理。

错误案例,别抄

ts
mw.hook('InPageEdit.ready').add((ipe) => {
  ipe.plugin((ctx) => {
    // 错误示范:直接操作 ipe 实例
    ipe.on('someEvent', () => {
      console.log('这个不会被回收!监听器一直存在,可能会导致内存泄漏!')
    })
    ipe.myService = () => {} // 不要这么做!卸载后依然残留

    // 正确示范:使用 ctx 上下文
    ctx.on('someEvent', () => {
      console.log('卸载后自己就没了。')
    })
    ctx.set('myService', () => {}) // 卸载后自己就没了。
  })
})

重新认识上下文

从学习 IPE 插件开发的一开始,我们就已经接触到了 上下文 (Context) 这个概念。我们所熟悉的 ctx.on(), ctx.off() 等等 API 都是上下文类所提供的方法。而在本节中,我们进一步看到,上下文在插件开发中扮演着非常重要的角色。

上下文描述了插件的一种可能的运行环境,每个插件的上下文互不相同,这才保证了插件的副作用可以被有效地回收。

对于完整的运行环境有许多的刻画方式,而副作用的回收正是其中的一种。基于副作用的上下文也可以称为插件上下文。在接下来的章节中,我们还将看到运行环境的其他刻画维度,例如基于依赖的服务上下文。

贡献者

The avatar of contributor named as dragon-fish dragon-fish

✏️ InPageEdit NEXT