# 组件、应用和插件的概念

在Serverless Devs Tool和应用中心，我们有三个有趣的概念，分别是组件、应用和插件。

首先可以肯定的是，Serverless Devs Tool是一个组件+插件共存的项目，所以这里的组件和插件的区别是：

|     | 组件  | 插件  |
|  ----  | ----  |  ----  |
| 可以独立使用  | 是 |  否 |
| 是否有依赖  | 依赖项目 |  依赖组件 |

好了，这样一个简单的表格，可能很难描述清楚，那么我们就用一个实际的例子来表示：

![](https://images.serverlessfans.com/s-tool/zh/component-application-plugin-1.jpg)

在这个Yaml中，我们可以看到，这里有一个项目是`Projectname`，这个项目依赖了组件`stest`，在项目执行`deploy`方法（这个方法是`stest`组件自己定义的）之前，要执行一个叫做`stest_plugin`的组件。其组件和插件以及Yaml等关系如下：

![](https://images.serverlessfans.com/s-tool/zh/component-application-plugin-2.jpg)

换一种说法就是，一个Yaml，可以部署多个项目，每个项目对应了一个组件，这个组件来完成每个项目的部署。但是有一些组件在某些情况下没办法更好地完成一个任务，所以这个时候就需要插件/Hook了。例如，当我们部署一个静态网站项目，我们可以把这个静态网站项目通过`Website`组件部署到线上，但是如果这个项目是一个Vue的项目，我们在部署之前可能要`npm build`一下，这个时候我们就可以在`Website`组件之上，增加一个插件，在部署执行，先执行这个部分。这种做法实际上在我们工程化一个项目或者CICD流程中，将会有比较有趣的作用。

那么，什么是应用呢？其实一个应用的定义就比较广泛了，你可以认为所谓的一个应用是一个Yaml，这个应用中包括Yaml所附带的代码，包括资源描述文件(Yaml文件)等。一般情况下是这样的：

![](https://images.serverlessfans.com/s-tool/zh/component-application-plugin-3.jpg)

我们可以认为一个应用可以是一个`hello_world`的案例，一个音视频处理的案例，部署一个在线转码的能力，部署一个......

组件、应用和插件的概念，其实并不复杂，如果据一个身边常见的例子为例就是：

一个应用就是一个拍照的手机APP，这个APP里面会有很多组件，例如打开摄像头组件、拍照组建、以及存储照片组件，当我们在存储照片的时候需要默认将用户拍的照片进行一些特征提取，例如提取出来拍摄时间、拍摄地点，但是这些能力又不是存储照片组件所提供的，所以这个时候，我们就可以在存储照片之前，放一个提取出来拍摄时间和拍摄地点的插件。

其实组件、插件和应用之间，是有一定的区别，但是在某些极端情况下，也没有非常非常明确的区别，所以大家也不用过分纠结这些内容具体的细致的区别：好用，就可以了，能用的起来，用的方便，简单，快速，就可以了。