如何将 swagger-ui npm 模块与现有 OpenAPI 规范文件结合使用

Dir*_*irk 4 node.js npm swagger swagger-ui openapi

查看安装 Swagger-UI 的文档可以看到npm正在发布两个官方模块:swagger-uiswagger-ui-dist。然而,我真的很难弄清楚如何将它们与现有的OpenApi 3.0规范一起使用。

我唯一需要的是一个简单的 Web 应用程序(普通node.jsexpress.js或任何有效的),它将为specification.yml嵌入到普通 Swagger-UI 文件中的现有文档提供服务,路径如/docs.

由于这需要以可重复的方式完成(最终将在 Docker 容器中运行),因此在此过程中不需要手动编辑文件。

我能得到的最接近的是下载一个发布 tar 球,提取dist文件夹,使用诸如sed用我自己的文件替换默认规范文件之类的工具,最后将其托管在像nginx.

然而,这对我来说看起来不必要的复杂,让我想知道这些npm模块应该用来做什么。

Dir*_*irk 5

最后,我找到了两种方法来实现问题中概述的目标。

使用unpkg

unpkg是一个自动内容交付网络,适用于在注册表上发布的所有模块npm。它允许在静态 HTML 文件中包含和使用任何npm模块,而无需任何复杂的包管理器、依赖解析器等。如果您没有任何其他需要npm直接使用生态系统,那么这尤其有用。

对于swagger-ui,这样的 HTML 文件将如下所示。请注意,我们正在导入swagger-ui-dist已经包含所有必需依赖项的包。

<!DOCTYPE html>
<!--Inspired by https://gist.github.com/buzztaiki/e243ccc3203f96777e2e8141d4993664-->
<html lang="en">
  <head>
    <meta charset="UTF-8">
    <title>Swagger UI</title>
    <link rel="stylesheet" type="text/css" href="https://unpkg.com/swagger-ui-dist@3/swagger-ui.css" >
  </head>

  <body>
    <div id="swagger-ui"></div>
    <script src="https://unpkg.com/swagger-ui-dist@3/swagger-ui-bundle.js"> </script>
    <script type="text/javascript">
      window.onload = function() {
        // Swagger-ui configuration goes here.
        // See further: https://github.com/swagger-api/swagger-ui/blob/master/docs/usage/configuration.md
        SwaggerUIBundle({
          deepLinking: true,
          dom_id: '#swagger-ui',
          showExtensions: true,
          showCommonExtensions: true,
          url: specification.json // <-- adjust this to your webserver's structure
        });
      };
    </script>
  </body>
</html>
Run Code Online (Sandbox Code Playgroud)

将此 HTML 文件托管在您的网络服务器上,一切就都解决了。

使用 browserify / webpack

browserifywebpack是来自npm生态系统的模块捆绑器,可以收集npm模块及其所有依赖项,然后将它们捆绑在一个js文件中。然后可以加载该文件并在 HTML 页面中使用。

虽然这两种工具在细节方面可能有所不同,但对于这项工作,它们的工作方式几乎相同。以下示例使用browserify,但是,一般方法webpack是相同的。

首先,browserify全局安装:

npm install -g browserify

然后,swagger-ui在当前文件夹中本地安装该模块:

npm install --save swagger-ui

最后,将swagger-ui模块及其所有依赖项捆绑到一个输出文件中:

browserify --require swagger-ui -o bundle.js

包含它的相应 HTML 页面可能如下所示:

<!DOCTYPE html>
<html>
    <head>
        <meta charset="utf-8">
        <meta name="viewport" content="width=device-width, initial-scale=1.0">
        <link rel="stylesheet" href="./node_modules/swagger-ui/dist/swagger-ui.css">
        <title>Swagger-UI</title>
    </head>
    <body>
        <div id="swagger-ui"></div>
    </body>
    <script type="text/javascript" src="./bundle.js"></script>
    <script type="text/javascript">
      window.onload = function() {
        // Swagger-ui configuration goes here.
        // See further: https://github.com/swagger-api/swagger-ui/blob/master/docs/usage/configuration.md
        SwaggerUI({
          deepLinking: true,
          dom_id: '#swagger-ui',
          showExtensions: true,
          showCommonExtensions: true,
          url: specification.json // <-- adjust this to your webserver's structure
        });
      };
    </script>
</html>
Run Code Online (Sandbox Code Playgroud)

如果您正在使用browserifywebpack在您的生态系统中执行其他任务,则此方法可能是首选。