---
url: 'https://elysiajs.com/plugins/html.md'
---
# HTML 插件
允许您在 Elysia 服务器中使用 [JSX](#jsx) 和 HTML,并提供适当的头部和支持。
安装方法:
```bash
bun add @elysiajs/html
```
然后使用它:
```tsx twoslash
import React from 'react'
// ---cut---
import { Elysia } from 'elysia'
import { html, Html } from '@elysiajs/html'
new Elysia()
.use(html())
.get(
'/html',
() => `
Hello World
Hello World
`
)
.get('/jsx', () => (
Hello World
Hello World
))
.listen(3000)
```
该插件将自动在响应中添加 `Content-Type: text/html; charset=utf8` 头部,添加 ``,并将其转换为一个响应对象。
## JSX
Elysia HTML 基于 [@kitajs/html](https://github.com/kitajs/html),允许我们在编译时将 JSX 定义为字符串,以实现高性能。
需要使用 JSX 的文件名称应以后缀 **"x"** 结尾:
* .js -> .jsx
* .ts -> .tsx
要注册 TypeScript 类型,请将以下内容添加到 **tsconfig.json**:
```jsonc
// tsconfig.json
{
"compilerOptions": {
"jsx": "react",
"jsxFactory": "Html.createElement",
"jsxFragmentFactory": "Html.Fragment"
}
}
```
就是这样,现在您可以将 JSX 用作模板引擎:
```tsx twoslash
import React from 'react'
// ---cut---
import { Elysia } from 'elysia'
import { html, Html } from '@elysiajs/html' // [!code ++]
new Elysia()
.use(html()) // [!code ++]
.get('/', () => (
Hello World
Hello World
))
.listen(3000)
```
如果出现错误 `Cannot find name 'Html'. Did you mean 'html'?`,则必须将此导入添加到 JSX 模板中:
```tsx
import { Html } from '@elysiajs/html'
```
务必以大写字母书写。
## XSS
Elysia HTML 基于 Kita HTML 插件,在编译时检测可能的 XSS 攻击。
您可以使用专用的 `safe` 属性来清理用户值,以防止 XSS 漏洞。
```tsx
import { Elysia, t } from 'elysia'
import { html, Html } from '@elysiajs/html'
new Elysia()
.use(html())
.post(
'/',
({ body }) => (
Hello World
{body}
),
{
body: t.String()
}
)
.listen(3000)
```
然而,在构建大型应用时,最好有类型提醒以检测代码库中可能的 XSS 漏洞。
要添加类型安全提醒,请安装:
```sh
bun add @kitajs/ts-html-plugin
```
然后在 **tsconfig.json** 中添加以下内容:
```jsonc
// tsconfig.json
{
"compilerOptions": {
"jsx": "react",
"jsxFactory": "Html.createElement",
"jsxFragmentFactory": "Html.Fragment",
"plugins": [{ "name": "@kitajs/ts-html-plugin" }]
}
}
```
## 选项
### contentType
* 类型: `string`
* 默认值: `'text/html; charset=utf8'`
响应的内容类型。
### autoDetect
* 类型: `boolean`
* 默认值: `true`
是否自动检测 HTML 内容并设置内容类型。
### autoDoctype
* 类型: `boolean | 'full'`
* 默认值: `true`
是否在响应开头是 `` 时自动添加 ``,如果未找到。
使用 `full` 还可以在没有此插件的响应中自动添加文档类型。
```ts
// 没有插件
app.get('/', () => '')
// 有插件
app.get('/', ({ html }) => html(''))
```
### isHtml
* 类型: `(value: string) => boolean`
* 默认: `isHtml` (导出的函数)
该函数用于检测一个字符串是否为 HTML。默认实现是如果长度大于 7,且以 `<` 开头并以 `>` 结尾。
请注意,没有真正的方法来验证 HTML,因此默认实现只是一个最佳猜测。