swagger-ui-express vs swagger-jsdoc vs @umijs/openapi
API Documentation Tools Comparison
1 Year
swagger-ui-expressswagger-jsdoc@umijs/openapi
What's API Documentation Tools?

API documentation tools are essential for creating, managing, and presenting the documentation of APIs. They provide a structured way to describe the endpoints, request/response formats, and other relevant details that help developers understand how to interact with the API. These tools can automate the generation of documentation from code annotations, making it easier to keep the documentation in sync with the actual API implementation. Furthermore, they often include interactive features that allow users to test API endpoints directly from the documentation, enhancing usability and developer experience.

Package Weekly Downloads Trend
Github Stars Ranking
Stat Detail
Package
Downloads
Stars
Size
Issues
Publish
License
swagger-ui-express2,269,2921,48024 kB50a year agoMIT
swagger-jsdoc724,5631,747712 kB362 years agoMIT
@umijs/openapi16,146391113 kB5713 days agoMIT
Feature Comparison: swagger-ui-express vs swagger-jsdoc vs @umijs/openapi

Integration

  • swagger-ui-express:

    swagger-ui-express is specifically built for Express applications, allowing you to easily serve the Swagger UI documentation alongside your API. It integrates directly with the Express middleware, making it straightforward to set up.

  • swagger-jsdoc:

    swagger-jsdoc provides a flexible way to integrate with any Node.js application by allowing you to write JSDoc comments that describe your API. This makes it adaptable to various frameworks and setups, as it does not impose any specific structure.

  • @umijs/openapi:

    @umijs/openapi is designed to integrate seamlessly with UmiJS applications, leveraging its routing and configuration capabilities to generate OpenAPI specifications automatically from your routes and controllers.

Documentation Generation

  • swagger-ui-express:

    While swagger-ui-express does not generate documentation itself, it serves the generated OpenAPI specification in a user-friendly format. It allows for interactive exploration of the API, enhancing the developer experience.

  • swagger-jsdoc:

    swagger-jsdoc generates OpenAPI documentation from JSDoc comments in your code, allowing you to keep your documentation close to the implementation. This approach helps ensure that the documentation reflects the current state of the API as developers update their code.

  • @umijs/openapi:

    This package automatically generates OpenAPI specifications based on your UmiJS application structure, minimizing manual documentation efforts and ensuring that your API documentation is always up-to-date with the code.

Ease of Use

  • swagger-ui-express:

    swagger-ui-express is user-friendly for both developers and API consumers, providing an intuitive interface to interact with the API documentation. It allows users to test endpoints directly from the documentation, enhancing usability.

  • swagger-jsdoc:

    swagger-jsdoc is easy to use for developers familiar with JSDoc, as it allows them to annotate their code directly. This familiarity can reduce the learning curve and make it easier to maintain documentation as the code evolves.

  • @umijs/openapi:

    @umijs/openapi simplifies the process of API documentation for UmiJS users by providing a straightforward configuration and automatic generation of specifications, making it easy for developers to adopt without extensive setup.

Customization

  • swagger-ui-express:

    swagger-ui-express provides options to customize the appearance and behavior of the Swagger UI, allowing developers to tailor the documentation interface to better fit their application's branding and user experience.

  • swagger-jsdoc:

    swagger-jsdoc allows for extensive customization through JSDoc comments, enabling developers to define detailed descriptions, parameter types, and response formats, making it highly adaptable to various API requirements.

  • @umijs/openapi:

    @umijs/openapi offers limited customization options since it follows the conventions of UmiJS. However, it allows for some level of configuration to tailor the generated OpenAPI specifications to specific needs.

Community and Support

  • swagger-ui-express:

    swagger-ui-express is part of the popular Swagger ecosystem, which is well-supported and widely adopted. This means that developers can easily find documentation, tutorials, and community support.

  • swagger-jsdoc:

    swagger-jsdoc has a strong community and is widely used in the Node.js ecosystem, ensuring that developers can find ample resources, examples, and support when implementing this package.

  • @umijs/openapi:

    As a part of the UmiJS ecosystem, @umijs/openapi benefits from the community surrounding UmiJS, which can provide support and resources for users, although it may not be as widely adopted as other solutions.

How to Choose: swagger-ui-express vs swagger-jsdoc vs @umijs/openapi
  • swagger-ui-express:

    Select swagger-ui-express if you need to serve your OpenAPI documentation in a web application built on Express. It provides a user-friendly interface for displaying your API documentation and allows for interactive testing of endpoints, making it suitable for projects that require a polished presentation of the API.

  • swagger-jsdoc:

    Opt for swagger-jsdoc if you prefer a flexible solution that allows you to define your API documentation using JSDoc comments in your code. This package is ideal for projects where you want to maintain documentation close to the code and leverage JSDoc's capabilities to annotate your API endpoints.

  • @umijs/openapi:

    Choose @umijs/openapi if you are using UmiJS and need a seamless integration for generating OpenAPI specifications directly from your codebase. It is particularly useful for projects heavily relying on UmiJS's conventions and ecosystem.

README for swagger-ui-express

Swagger UI Express

| Statements | Branches | Functions | Lines | | --------------------------- | ----------------------- | ------------------------- | -------------------- | | Statements | Branches | Functions | Lines |

This module allows you to serve auto-generated swagger-ui generated API docs from express, based on a swagger.json file. The result is living documentation for your API hosted from your API server via a route.

Swagger version is pulled from npm module swagger-ui-dist. Please use a lock file or specify the version of swagger-ui-dist you want to ensure it is consistent across environments.

You may be also interested in:

  • swagger-jsdoc: Allows you to markup routes with jsdoc comments. It then produces a full swagger yml config dynamically, which you can pass to this module to produce documentation. See below under the usage section for more info.
  • swagger tools: Various tools, including swagger editor, swagger code gen etc.

Usage

Install using npm:

$ npm install swagger-ui-express

Express setup app.js

const express = require('express');
const app = express();
const swaggerUi = require('swagger-ui-express');
const swaggerDocument = require('./swagger.json');

app.use('/api-docs', swaggerUi.serve, swaggerUi.setup(swaggerDocument));

or if you are using Express router

const router = require('express').Router();
const swaggerUi = require('swagger-ui-express');
const swaggerDocument = require('./swagger.json');

router.use('/api-docs', swaggerUi.serve);
router.get('/api-docs', swaggerUi.setup(swaggerDocument));

Open http://<app_host>:<app_port>/api-docs in your browser to view the documentation.

If you want to set up routing based on the swagger document checkout swagger-express-router

swagger-jsdoc

If you are using swagger-jsdoc simply pass the swaggerSpec into the setup function:

// Initialize swagger-jsdoc -> returns validated swagger spec in json format
const swaggerSpec = swaggerJSDoc(options);

app.use('/api-docs', swaggerUi.serve, swaggerUi.setup(swaggerSpec));

Swagger Explorer

By default the Swagger Explorer bar is hidden, to display it pass true as the 'explorer' property of the options to the setup function:

const express = require('express');
const app = express();
const swaggerUi = require('swagger-ui-express');
const swaggerDocument = require('./swagger.json');

var options = {
  explorer: true
};

app.use('/api-docs', swaggerUi.serve, swaggerUi.setup(swaggerDocument, options));

Custom swagger options

To pass custom options e.g. validatorUrl, to the SwaggerUi client pass an object as the 'swaggerOptions' property of the options to the setup function:

const express = require('express');
const app = express();
const swaggerUi = require('swagger-ui-express');
const swaggerDocument = require('./swagger.json');

var options = {
  swaggerOptions: {
    validatorUrl: null
  }
};

app.use('/api-docs', swaggerUi.serve, swaggerUi.setup(swaggerDocument, options));

For all the available options, refer to Swagger UI Configuration

Custom CSS styles

To customize the style of the swagger page, you can pass custom CSS as the 'customCss' property of the options to the setup function.

E.g. to hide the swagger header:

const express = require('express');
const app = express();
const swaggerUi = require('swagger-ui-express');
const swaggerDocument = require('./swagger.json');

var options = {
  customCss: '.swagger-ui .topbar { display: none }'
};

app.use('/api-docs', swaggerUi.serve, swaggerUi.setup(swaggerDocument, options));

Custom CSS styles from Url

You can also pass the url to a custom css file, the value must be the public url of the file and can be relative or absolute to the swagger path.

const express = require('express');
const app = express();
const swaggerUi = require('swagger-ui-express');
const swaggerDocument = require('./swagger.json');

var options = {
  customCssUrl: '/custom.css'
};

app.use('/api-docs', swaggerUi.serve, swaggerUi.setup(swaggerDocument, options));

You can also pass an array of css urls to load multiple css files.

const express = require('express');
const app = express();
const swaggerUi = require('swagger-ui-express');
const swaggerDocument = require('./swagger.json');

var options = {
  customCssUrl: [
    '/custom.css',
    'https://example.com/other-custom.css'
  ]
};

app.use('/api-docs', swaggerUi.serve, swaggerUi.setup(swaggerDocument, options));

Custom JS

If you would like to have full control over your HTML you can provide your own javascript file, value accepts absolute or relative path. Value must be the public url of the js file.

const express = require('express');
const app = express();
const swaggerUi = require('swagger-ui-express');
const swaggerDocument = require('./swagger.json');

var options = {
  customJs: '/custom.js'
};

app.use('/api-docs', swaggerUi.serve, swaggerUi.setup(swaggerDocument, options));

You can also pass an array of js urls to load multiple js files.

const express = require('express');
const app = express();
const swaggerUi = require('swagger-ui-express');
const swaggerDocument = require('./swagger.json');

var options = {
  customJs: [
    '/custom.js',
    'https://example.com/other-custom.js'
  ]
};

app.use('/api-docs', swaggerUi.serve, swaggerUi.setup(swaggerDocument, options));

It is also possible to add inline javascript, either as string or array of string.

const express = require('express');
const app = express();
const swaggerUi = require('swagger-ui-express');
const swaggerDocument = require('./swagger.json');

var options = {
  customJsStr: 'console.log("Hello World")'
};

app.use('/api-docs', swaggerUi.serve, swaggerUi.setup(swaggerDocument, options));
const express = require('express');
const app = express();
const swaggerUi = require('swagger-ui-express');
const swaggerDocument = require('./swagger.json');

var options = {
  customJsStr: [
    'console.log("Hello World")',
    `
    var x = 1
    console.log(x)
    `
  ]
};

app.use('/api-docs', swaggerUi.serve, swaggerUi.setup(swaggerDocument, options));

Load swagger from url

To load your swagger from a url instead of injecting the document, pass null as the first parameter, and pass the relative or absolute URL as the 'url' property to 'swaggerOptions' in the setup function.

const express = require('express');
const app = express();
const swaggerUi = require('swagger-ui-express');

var options = {
  swaggerOptions: {
    url: 'http://petstore.swagger.io/v2/swagger.json'
  }
}

app.use('/api-docs', swaggerUi.serve, swaggerUi.setup(null, options));

To load multiple swagger documents from urls as a dropdown in the explorer bar, pass an array of object with name and url to 'urls' property to 'swaggerOptions' in the setup function.

const express = require('express');
const app = express();
const swaggerUi = require('swagger-ui-express');

var options = {
  explorer: true,
  swaggerOptions: {
    urls: [
      {
        url: 'http://petstore.swagger.io/v2/swagger.json',
        name: 'Spec1'
      },
      {
        url: 'http://petstore.swagger.io/v2/swagger.json',
        name: 'Spec2'
      }
    ]
  }
}

app.use('/api-docs', swaggerUi.serve, swaggerUi.setup(null, options));

Make sure 'explorer' option is set to 'true' in your setup options for the dropdown to be visible.

Load swagger from yaml file

To load your swagger specification yaml file you need to use a module able to convert yaml to json; for instance yaml.

npm install yaml
const express = require('express');
const app = express();
const swaggerUi = require('swagger-ui-express');
const fs = require("fs")
const YAML = require('yaml')

const file  = fs.readFileSync('./swagger.yaml', 'utf8')
const swaggerDocument = YAML.parse(file)

app.use('/api-docs', swaggerUi.serve, swaggerUi.setup(swaggerDocument));

Modify swagger file on the fly before load

To dynamically set the host, or any other content, in the swagger file based on the incoming request object you may pass the json via the req object; to achieve this just do not pass the the swagger json to the setup function and it will look for swaggerDoc in the req object.

const express = require('express');
const app = express();
const swaggerUi = require('swagger-ui-express');
const swaggerDocument = require('./swagger.json');

var options = {}

app.use('/api-docs', function(req, res, next){
    swaggerDocument.host = req.get('host');
    req.swaggerDoc = swaggerDocument;
    next();
}, swaggerUi.serveFiles(swaggerDocument, options), swaggerUi.setup());

Two swagger documents

To run 2 swagger ui instances with different swagger documents, use the serveFiles function instead of the serve function. The serveFiles function has the same signature as the setup function.

const express = require('express');
const app = express();
const swaggerUi = require('swagger-ui-express');
const swaggerDocumentOne = require('./swagger-one.json');
const swaggerDocumentTwo = require('./swagger-two.json');

var options = {}

app.use('/api-docs-one', swaggerUi.serveFiles(swaggerDocumentOne, options), swaggerUi.setup(swaggerDocumentOne));

app.use('/api-docs-two', swaggerUi.serveFiles(swaggerDocumentTwo, options), swaggerUi.setup(swaggerDocumentTwo));

app.use('/api-docs-dynamic', function(req, res, next){
  req.swaggerDoc = swaggerDocument;
  next();
}, swaggerUi.serveFiles(), swaggerUi.setup());

Link to Swagger document

To render a link to the swagger document for downloading within the swagger ui - then serve the swagger doc as an endpoint and use the url option to point to it:

const express = require('express');
const app = express();
const swaggerUi = require('swagger-ui-express');
const swaggerDocument = require('./swagger.json');

var options = {
    swaggerOptions: {
        url: "/api-docs/swagger.json",
    },
}
app.get("/api-docs/swagger.json", (req, res) => res.json(swaggerDocument));
app.use('/api-docs', swaggerUi.serveFiles(null, options), swaggerUi.setup(null, options));

Requirements

  • Node v0.10.32 or above
  • Express 4 or above

Testing

  • Install phantom
  • npm install
  • npm test