# 插件

插件化是软件设计中一个很重要的思想,很多软件像 Eclipse 都支持这样的特性,插件化可以让我们的系统解耦,每个模块做到独立开发,而模块之间又不会相互影响,这样的特性对于大型项目来说是非常重要的。

插件化是 Astroboy 框架中最核心的一个实现,它是服务(Service)、中间件(Middleware)和工具函数库(Lib)等的载体,它本质上还是 NPM 包,只不过是在 NPM 包的基础上,做了更深层次的抽象。基于 Astroboy 的应用,就是由一个一个的 Plugin 组成的,Plugin 就是我们手中的积木,通过 Astroboy 的框架引擎把这些积木组织在一起,就形成了系统。

# 1. 插件跟普通的 NPM 包有什么区别呢?

插件约定了目录结构,这样每个插件看起来都是类似的,这对于团队的协作是非常重要,如果每个模块看起来都不一样,那么团队的协作成本就会很高。 应用启动后,插件的代码是自动注入到整个应用的,只需要在插件的配置文件里面开启这个插件即可。

# 2. 一个插件可以包含哪些信息?

  • 插件元数据,包括插件名称、版本、描述等;
  • 服务(Service)、中间件(Middleware)以及工具函数库(Lib)等;
  • Koa 内置对象的扩展,包括 Context、Application、Request 以及 Response 等;

# 3. 插件的管理

  • 安装插件,通过npm install 命令即可,例如:npm install [<@scope>/]<name>@<version>
  • 启用插件,安装插件后还需要启用插件,插件才会真正生效。启用插件也很简单,只需要配置 plugin.default.js 即可,如果不同环境插件配置不一样,也只需修改相应环境的配置(plugin.${env}.js)即可,这里 env 表示 Node 运行时的环境变量,例如:development、test、production 等。如下代码所示:
'astroboy-cookie': {  
  enable: true,
  path: path.resolve(__dirname, '../plugins/astroboy-cookie')
}

enable 设置成 true 就可以开启这个插件,path 表示插件的绝对路径,这种一般适合于还在快速迭代中的插件,如果插件已经很稳定了,你就可以把这个插件打包发布成一个 NPM 包,然后通过 package 声明你的插件即可,如下代码所示:

'astroboy-cookie': {  
  enable: true,
  package: 'astroboy-cookie'
}
  • 禁用插件,禁用插件就更加简单了,只需将 enable 设置成 false 即可。