You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何从swagger-ui-dist服务端生成Swagger Docs的HTML字符串?

服务端生成Swagger Docs HTML字符串(Fastify环境)

1. 安装依赖

先安装核心依赖包:

npm install swagger-ui-dist

2. 核心实现思路

swagger-ui-dist自带了基础的Swagger UI HTML模板,我们只需要读取该模板,替换其中的配置占位符,就能生成可自定义的HTML字符串。整个过程无需依赖Express或其他额外工具,纯Node.js+Fastify即可完成,完全符合KISS原则。

3. 完整代码示例

const fastify = require('fastify')({ logger: true });
const fs = require('fs');
const path = require('path');
// 获取swagger-ui-dist的绝对路径
const swaggerUiDistRoot = require('swagger-ui-dist').absolutePath();

// 预读取并缓存Swagger UI的基础HTML模板(仅需读取一次)
const baseSwaggerTemplate = fs.readFileSync(path.join(swaggerUiDistRoot, 'index.html'), 'utf8');

// 生成自定义Swagger HTML的工具函数
function buildSwaggerHtml(swaggerSource, uiOptions = {}) {
  // 构造Swagger UI初始化脚本
  const initScript = `
    window.onload = function() {
      SwaggerUIBundle({
        ${typeof swaggerSource === 'string' ? `url: "${swaggerSource}"` : `spec: ${JSON.stringify(swaggerSource)}`},
        dom_id: '#swagger-ui',
        ${Object.entries(uiOptions).map(([key, val]) => `${key}: ${JSON.stringify(val)}`).join(',\n        ')}
      });
    };
  `;

  // 替换模板中的默认初始化脚本,注入自定义配置
  return baseSwaggerTemplate.replace(/<script>window\.onload.*?<\/script>/s, `<script>${initScript}</script>`);
}

// Fastify路由:返回生成的Swagger HTML页面
fastify.get('/docs', async (req, reply) => {
  // 两种Swagger数据源可选:
  // 1. 接口地址(比如动态生成的Swagger JSON接口)
  const swaggerSource = '/swagger.json';
  // 2. 直接传入Swagger JSON对象(无需额外请求)
  // const swaggerSource = {
  //   openapi: '3.0.0',
  //   info: { title: 'My Fastify API', version: '1.0.0' },
  //   paths: { /* 接口定义 */ }
  // };

  // 自定义UI展示配置
  const uiConfig = {
    docExpansion: 'full', // 默认展开所有接口文档
    darkMode: true, // 启用深色主题
    defaultModelsExpandDepth: -1, // 隐藏Models面板
    persistAuthorization: true // 保留授权信息
  };

  const swaggerHtml = buildSwaggerHtml(swaggerSource, uiConfig);
  reply.type('text/html').send(swaggerHtml);
});

// 示例:提供Swagger JSON的路由(如果用接口地址作为数据源)
fastify.get('/swagger.json', async (req, reply) => {
  reply.send({
    openapi: '3.0.0',
    info: { title: 'My Fastify API', version: '1.0.0' },
    paths: {
      '/hello': {
        get: {
          summary: 'Say hello',
          responses: {
            '200': {
              description: 'Success',
              content: {
                'application/json': { schema: { type: 'object', properties: { message: { type: 'string' } } } }
              }
            }
          }
        }
      }
    }
  });
});

// 启动服务
fastify.listen({ port: 3000 }, (err) => {
  if (err) {
    fastify.log.error(err);
    process.exit(1);
  }
});

4. 关键细节说明

  • 模板缓存:预读取基础HTML模板并缓存,避免每次请求都读取文件,提升性能。
  • 数据源灵活:支持传入Swagger JSON的接口地址,或直接传入JSON对象(无需额外HTTP请求)。
  • UI自定义:uiConfig可传入所有Swagger UI支持的配置项,比如主题、文档展开方式、面板显示控制等。
  • 缓存策略:如果Swagger配置不常变动,可将生成好的HTML字符串缓存到内存、文件或Redis中,进一步优化性能。

5. 方案优势

  • 无额外依赖,仅使用核心包与Node.js API。
  • 逻辑简单直接:读模板→替换配置→输出HTML,无复杂设计模式。
  • 完全可控:生成的HTML字符串可自行缓存、保存或通过任意方式提供服务,不受框架限制。

内容的提问来源于stack exchange,提问作者Seph Reed

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.16 10:25:21