Skip to content

HTML 插件

允许您使用 JSX 和 HTML,并具有适当的头信息和支持。

安装方式:

bash
bun add @elysiajs/html

然后使用它:

tsx
import { Elysia } from 'elysia'
import { html, Html } from '@elysiajs/html'

new Elysia()
    .use(html())
    .get(
        '/html',
        () => `
            <html lang='en'>
                <head>
                    <title>你好,世界</title>
                </head>
                <body>
                    <h1>你好,世界</h1>
                </body>
            </html>`
    )
    .get('/jsx', () => (
        <html lang='en'>
            <head>
                <title>你好,世界</title>
            </head>
            <body>
                <h1>你好,世界</h1>
            </body>
        </html>
    ))
    .listen(3000)

该插件将自动为响应添加 Content-Type: text/html; charset=utf8 头信息,添加 <!doctype html>,并将其转换为 Response 对象。

JSX

Elysia HTML 基于 @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
import { Elysia } from 'elysia'
import { html, Html } from '@elysiajs/html'

new Elysia()
    .use(html()) 
    .get('/', () => (
        <html lang="en">
            <head>
                <title>你好,世界</title>
            </head>
            <body>
                <h1>你好,世界</h1>
            </body>
        </html>
    ))
    .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 }) => (
        <html lang="en">
            <head>
                <title>你好,世界</title>
            </head>
            <body>
                <h1 safe>{body}</h1>
            </body>
        </html>
    ), {
        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

是否在响应中自动添加 <!doctype html>,如果未找到 <html> 开头的响应。

使用 full 也可以在没有此插件的情况下自动添加文档类型。

ts
// 没有插件
app.get('/', () => '<html></html>')

// 有插件
app.get('/', ({ html }) => html('<html></html>'))

isHtml

  • 类型: (value: string) => boolean
  • 默认值: isHtml (导出函数)

该函数用于检测一个字符串是否为 HTML。默认实现是长度大于 7,且以 < 开头并以 > 结尾。

请记住,实际上没有真正的方法来验证 HTML,因此默认实现是一种最佳猜测。