# 插件(Plugins)
> 使用自定义插件扩展 Nitro,用于钩子和生命周期事件。
```ts [nitro.config.ts]
import { defineConfig } from "nitro";
export default defineConfig({
serverDir: true,
});
```
```json [package.json]
{
"type": "module",
"scripts": {
"dev": "nitro dev",
"build": "nitro build"
},
"devDependencies": {
"nitro": "latest"
}
}
```
```ts [server.ts]
import { eventHandler } from "h3";
export default eventHandler(() => "Hello Nitro!
");
```
```json [tsconfig.json]
{
"extends": "nitro/tsconfig"
}
```
```ts [vite.config.ts]
import { defineConfig } from "vite";
import { nitro } from "nitro/vite";
export default defineConfig({ plugins: [nitro()] });
```
```ts [server/plugins/test.ts]
import { definePlugin } from "nitro";
import { useNitroHooks } from "nitro/app";
export default definePlugin((nitroApp) => {
const hooks = useNitroHooks();
hooks.hook("response", (event) => {
event.headers.set("content-type", "html; charset=utf-8");
});
});
```
插件让你可以挂载到 Nitro 的运行时生命周期中。此示例展示了一个修改每个响应的 `Content-Type` 头的插件。在 `server/plugins/` 中创建文件,插件会在启动时自动加载。
## 定义一个插件
```ts [server/plugins/test.ts]
import { definePlugin } from "nitro";
import { useNitroHooks } from "nitro/app";
export default definePlugin((nitroApp) => {
const hooks = useNitroHooks();
hooks.hook("response", (event) => {
event.headers.set("content-type", "html; charset=utf-8");
});
});
```
该插件使用 `useNitroHooks()` 访问钩子系统,然后注册了一个 `response` 钩子,会在每次请求后执行。这里它将内容类型设置为 HTML,但你也可以记录请求、添加安全头,或以任何方式修改响应。
## 主处理器
```ts [server.ts]
import { eventHandler } from "h3";
export default eventHandler(() => "
Hello Nitro!
");
```
处理器返回 HTML,但没有设置内容类型。插件会自动给响应添加正确的 `Content-Type: html; charset=utf-8` 头。
## 了解更多
- [插件](/docs/plugins)
- [生命周期](/docs/lifecycle)